Next.js 15 and React 19: What Actually Changed and Why Developers Should Care
TrustByte Team
April 10, 2026

Why These Releases Matter
Next.js 15 and React 19 arrived within weeks of each other and collectively represent the biggest shift in React-based web development in several years. If you have been building with Next.js 13 or 14, some things you relied on changed significantly. This post focuses on what is actually different in production applications — not the full changelog.
React 19: The Changes That Matter Most
The React Compiler
The React Compiler (formerly React Forget) is the headline. It automatically optimises your components by memoising them without you needing to manually add useMemo, useCallback, or React.memo.
In practice: performance improvements in components that had unnecessary re-renders. The caveat is that it requires code following the Rules of React strictly. Components with side effects in render or mutation of props will misbehave. The compiler is opt-in for now, but enabling it on a large codebase can surface hidden bugs — treat the enabling process as a code quality audit.
useActionState (replaces useFormState)
useFormState from react-dom is gone. useActionState is the replacement and it is cleaner:
const [state, formAction, isPending] = useActionState(myServerAction, initialState);
The isPending flag built-in is the real quality-of-life improvement — no more separate useTransition wrapper for loading states on form submissions.
use() Hook
You can now use the use() hook to read a Promise or Context inside a component — including conditionally. This simplifies many patterns where you previously needed a wrapper component or complex async handling.
ref as a Prop
forwardRef is no longer needed. Pass ref directly as a prop to function components. If you have a large codebase with forwardRef wrappers, they still work but can be progressively removed.
Next.js 15: The Breaking Change That Caught Everyone
Caching Is Off by Default
This is the change that broke the most Next.js 14 applications when upgrading. In Next.js 14, fetch() was cached by default. In Next.js 15, it is not cached by default.
This means apps that relied on implicit caching to avoid redundant API calls now make those calls on every request. The fix is explicit: add { cache: 'force-cache' } where you want caching, or use unstable_cache for server-side data.
The reasoning is sound — implicit caching caused confusing bugs. But the migration requires auditing every fetch in your application.
async Request APIs
cookies(), headers(), params, and searchParams are now async. Access them with await:
const cookieStore = await cookies();
const { id } = await params;
This is a breaking change if you have many server components reading these synchronously.
Turbopack Is Now Stable for Development
next dev --turbo (now just next dev in 15) uses Turbopack by default. Cold start time and HMR speed improvements are significant — 40–60% faster in most projects we migrated. Production builds still use webpack, but Turbopack production support is in progress.
Should You Upgrade Now?
For new projects: yes, start on Next.js 15 and React 19. The improved patterns are worth starting with.
For existing projects: budget proper time for migration. The caching changes and async Request APIs require careful auditing. Run the Next.js codemods (npx @next/codemod@canary upgrade latest) as a starting point — they handle the mechanical transformations — then review the output.
The direction these releases take React and Next.js is good: more explicit, better performance, cleaner APIs. The migration friction is temporary. The gains are structural.



