{
  "id": 8249237,
  "title": "Migrating to Next.js 15: big wins, small gotchas",
  "url": "https://urgent.news/2026/09/18/migrating-to-next-js-15-big-wins-small-gotchas",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-18T13:02:02.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/nainikmehta/migrating-to-nextjs-15-big-wins-small-gotchas-47jj"
  },
  "original_language": "en",
  "account": "Next.js 15 provides significant improvements in developer velocity, including a stable Turbopack in development mode, support for React 19, and Partial Prerendering (PPR). However, the migration introduces two main challenges: request-scoped APIs now return Promises, and fetch/GET route handlers are uncached by default.\n\nTo address the request-scoped APIs, use the async version of the helpers (cookies(), headers(), params, searchParams) and ensure callers are async as well. This can be automated with the official codemod, but manual review is still required for complex patterns. For fetch() and GET route handlers, explicitly set caching options using cache: \"force-cache\" for static resources or next: { revalidate: seconds } for Incremental Static Regeneration (ISR) behavior.\n\nThe migration also encourages moving more UI to Server Components and adopting PPR to reduce client bundle size and improve performance. After upgrading, run the codemod, audit request-scoped APIs and fetches, decide caching strategies, enable Turbopack in dev mode, and test thoroughly. Monitoring production is recommended to catch any unintended performance regressions.",
  "summary": "TL;DR Next.js 15 delivers massive developer-velocity wins (stable Turbopack in dev, React 19 support, Partial Prerendering) but introduces two migration hotspots: async request-scoped APIs (cookies(), headers(), params, searchParams) and inverted fetch/GET caching defaults. Enable Turbopack, audit request-scoped APIs for awaits, and make caching explicit route-by-route. Why we upgraded:…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}