Migrating to Next.js 15: What Changed and How to Adapt
Next.js 15 introduced several breaking changes. Here is how to migrate your application without surprises.
Async Request APIs
The biggest change: cookies(), headers(), params, and searchParams are now asynchronous. Where you previously wrote const params = props.params, you now write const params = await props.params. This affects every dynamic page, layout, and route handler.
React 19 Compatibility
Next.js 15 ships with React 19 support. The new React compiler optimizes re-renders automatically. forwardRef is no longer needed — ref is a regular prop. useFormStatus and useActionState replace older form handling patterns.
Caching Changes
Fetch requests and GET route handlers are no longer cached by default. Previously, Next.js aggressively cached everything. Now you must opt into caching with force-cache or route segment config. This is a significant behavioral change that can affect performance if you relied on implicit caching.
Turbopack Stability
Turbopack is now the default development bundler. It is significantly faster than Webpack for large projects. If you have custom Webpack configurations, check Turbopack compatibility. You can opt out with --webpack if needed.
Migration Steps
npx @next/codemod@canary upgrade latest.Common Pitfalls
The codemod handles most changes but misses some edge cases in custom middleware and complex dynamic routes. Test your middleware, API routes, and any pages that use generateStaticParams carefully.
Related Posts
Sponsor Our Newsletter
Reach thousands of developers who are actively evaluating AI tools, MCP servers, and dev infrastructure. Our weekly newsletter goes to engaged technical decision-makers.
All sponsored content is clearly labeled per our editorial policy.