← Back to Blog
Next.jsWeb DevelopmentBangkok

Next.js 15: Key Features Bangkok Web Projects Should Use

21 April 2026 · by Yunmin Shin

What Makes Next.js 15 Different?

Next.js 15 is not a minor update. It ships with changes that affect how you fetch data, cache responses, and structure your application. For Bangkok businesses building customer-facing platforms — clinic booking systems, restaurant ordering pages tied into LINE, e-commerce storefronts running on Thai payment gateways — these changes translate directly into faster load times, lower infrastructure costs, and fewer stale-data bugs in production.

The framework continues to mature around the App Router, which is now the default and most capable approach for modern web applications, and which is what we build every new Bangkok client project on.

What Are the Biggest New Features?

Async Request APIs are one of the most significant changes. cookies(), headers(), and params are now asynchronous, so your code needs to await these values. This aligns better with how servers actually handle concurrent requests. Concretely: if you're reading a locale cookie to decide whether to render a clinic page in Thai or English, or reading a session cookie to check whether a restaurant ordering flow belongs to a logged-in LINE user, that read is now explicitly async — which opens the door to better performance under concurrent load rather than blocking synchronously on every request.

Improved Caching Defaults were controversial in Next.js 14, where fetch requests were cached aggressively by default. Next.js 15 flips this — caching is opt-in rather than opt-out. This matters more than it sounds for a business site: a clinic's treatment price list, a restaurant's menu availability, or a real estate listing's "sold" status are all the kind of data that used to get silently cached and served stale unless you remembered to opt out. Now your data fetches are fresh unless you explicitly choose to cache them, which is the safer default for anything with prices or availability.

Turbopack in Development is now stable, replacing Webpack as the dev server bundler and delivering much faster hot module replacement. Projects that previously took 10 seconds to reflect a change now update in under a second. This is a real productivity gain for an agency juggling several client codebases in parallel — clinic sites, a restaurant discovery platform, real estate listings — where fast local iteration compounds across projects.

React 19 Support is built in, giving you the use() hook, improved form actions, and optimistic UI patterns without extra configuration. use() is genuinely useful for LINE LIFF (LINE Front-end Framework) mini-app integrations, where you need to resolve a LIFF SDK promise (getting the LINE user's profile inside the in-app browser) before rendering personalized content — use() lets you suspend on that cleanly instead of juggling useEffect and loading state by hand.

How Does This Affect Bangkok Web Projects?

Bangkok businesses often operate in competitive markets — retail, hospitality, clinics, logistics — where page speed and reliability are tied directly to conversion. That matters more here than in many markets because a large share of Thai traffic is mobile, frequently on mid-range Android devices over 4G connections that aren't always fast or stable. Next.js 15 helps in two specific ways:

  1. Server Components + Streaming let you render what's ready immediately and stream the rest. A clinic booking page can show the header, navigation, and treatment list instantly while the live appointment-slot availability — which requires a database round trip — streams in a beat later. On a patchy 4G connection, that difference between "something appeared instantly" and "blank screen for three seconds" is the difference between a visitor staying and bouncing.
  2. Partial Prerendering (PPR) combines static and dynamic rendering at the page level. A restaurant's menu page can be static-fast (menu items, photos, descriptions rarely change) while the "order via LINE" button and live open/closed status render dynamically. This is the architecture pattern that beats both traditional SPAs and fully server-rendered pages on real-world mobile performance, because the static shell paints instantly regardless of network conditions and only the genuinely dynamic slice waits on data.

What Should You Watch Out For When Migrating?

The async request API change is the one that actually breaks existing code — any cookies(), headers(), or params access written for Next.js 14 needs an await added, and TypeScript will flag most of these for you during the upgrade. Run the official codemod first; it handles the mechanical rewrites and leaves you to review the handful of cases it can't infer automatically. Test your locale-detection and session-reading logic specifically after migrating — these are exactly the code paths that touch cookies() and headers(), and a bilingual Thai/English site depends on that logic running correctly on every request.

Should You Upgrade Now?

If you're starting a new project, use Next.js 15 from day one — there's no reason not to, and starting on the caching-opt-in default avoids a whole class of stale-data bugs later. For existing projects, the async request API changes require code modifications, but the migration is well-documented and worth doing before the app grows larger and the migration gets more expensive.

At Bluewich, we build all new Bangkok client projects on Next.js 15, and we've migrated our own live sites — the clinic booking systems and the restaurant discovery platform among them — onto it as well. The framework's maturity and Vercel's deployment ecosystem make it our default choice for everything from marketing sites to full booking platforms.

Ready to Build Something Fast?

Get a free quote. We reply within 24 hours.

Ready to build something fast and scalable?

Get a free project quote. We reply within 24 hours.

Get a Free Quote →