React Compiler in 2026: Stable, Production-Ready, and Worth Enabling
React Compiler shipped stable in late 2025. Current adoption, what it replaced, whether to enable it in your Next.js project, and the one edge case.

The short answer
React Compiler is stable. It shipped stable in late 2025, and if you started a Next.js project any time in the past year you're already running it — create-next-app has enabled it by default since v15.
If you're on an existing codebase wondering whether to opt in: yes. One exception, covered at the end.
What it actually does
The compiler handles automatic memoization across your component tree at build time. Every useCallback, useMemo, and React.memo you added to stop unnecessary re-renders — that's the compiler's job now. And it does it better, because it can see your entire data flow statically. You couldn't.
Here's what that looks like in practice:
// Before — manual memoization required
function ProductList({ category, onAdd }) {
const filtered = useMemo(
() => products.filter(p => p.category === category),
[products, category]
)
const handleAdd = useCallback((id) => onAdd(id), [onAdd])
return filtered.map(p => <Product key={p.id} product={p} onAdd={handleAdd} />)
}
// With the compiler — same guarantees, no manual hooks
function ProductList({ category, onAdd }) {
const filtered = products.filter(p => p.category === category)
const handleAdd = (id) => onAdd(id)
return filtered.map(p => <Product key={p.id} product={p} onAdd={handleAdd} />)
}
The compiler analyses both versions at build time and produces identical memoization guarantees. The second version isn't less optimized — it's the same output, minus the boilerplate you were maintaining by hand.
Two things follow from this.
Your old performance instincts are wrong now. Wrapping a callback in useCallback when the compiler is active doesn't help. In some patterns it actively fights the compiler's analysis and produces worse output than doing nothing. If you still reach for useCallback by reflex on every callback prop, stop.
The remaining performance work has moved up the stack. Once re-renders are automated, the bottlenecks live in architecture: what runs server-side vs. client, how data fetching is structured, where Suspense boundaries go. These require judgment — there's no mechanical fix for them, and the compiler doesn't pretend there is.
Adoption
For new projects it's settled — Next.js has enabled the compiler by default since v15. Any project bootstrapped in the past year is running it, whether the team thought about it or not.
For existing codebases it's more gradual. Most teams enable it incrementally through annotation mode rather than opting in the whole codebase at once. Annotation mode lets you opt in components one at a time using the 'use memo' directive, so you find the components that break under automatic memoization before deploying them — not after.
Whether to enable it
New project: it's already on. Leave it.
Existing project on Next.js v15+: yes, but start with annotation mode:
// next.config.js
const nextConfig = {
experimental: {
reactCompiler: {
compilationMode: 'annotation',
},
},
}
Add 'use memo' to individual components, watch their behavior, work through the codebase. Once nothing is breaking, switch to full mode.
Existing project below v15: upgrade first. The compiler integration lives in the framework layer — bolt-on approaches for older Next.js versions aren't worth the maintenance cost.
The one exception
If your codebase has components that rely on referential instability — functions or objects being recreated on every render to trigger a downstream effect — the compiler will silently break them by memoizing what you meant to be unstable.
This is rare, and almost always a latent bug rather than intentional design. I've found it once in a codebase that had been accumulating state-management code for four years: a custom event emitter that depended on a new function reference each render to re-subscribe. Annotation mode caught it. A full opt-in would have shipped it.
Summary
| Question | Answer |
|---|---|
| Is it stable? | Yes, since late 2025 |
| Is it production-ready? | Yes, default in new Next.js projects |
| Is it widely adopted? | Universal for new projects, incremental for existing |
| Should I enable it? | Yes — annotation mode first for large codebases |
| Do I still need useCallback? | Rarely |
Four years of accumulated code, one function reference bug, caught before production. That's what annotation mode is for.
If you want the broader picture — what the compiler changes about how to learn React and Next.js in 2026, which resources are worth the time — the 2026 Next.js engineer's roadmap covers that.
For the performance side: once re-renders are handled, the real bottlenecks shift to LCP, CLS, and data-fetching architecture. The Core Web Vitals case study walks through a real Next.js App Router codebase with specific measurements.
Frequently Asked Questions
Is the React Compiler stable and production-ready in 2026?⌄
Yes. The React Compiler shipped its stable release in late 2025 and is production-ready in 2026. It is enabled by default in new Next.js projects created with create-next-app and has built-in support since Next.js v15. You do not need to opt in manually for new projects.
What does the React Compiler actually do?⌄
The React Compiler performs automatic memoization across your entire component tree at build time. It eliminates the need for manual useCallback, useMemo, and React.memo in the vast majority of cases by analysing your component's data flow statically and applying optimisations more precisely than a developer can do by hand.
Should I enable the React Compiler in an existing Next.js project?⌄
For existing projects on Next.js v15+, enabling the React Compiler is generally safe. The recommended approach is to enable it with the 'compilationMode: annotation' option first, which lets you opt in individual components with the 'use memo' directive before going all-in. This surfaces any components that have assumptions the compiler's memoization breaks.
Is the React Compiler widely adopted in production in 2026?⌄
Adoption is broad for new projects — create-next-app enables it by default, which means any Next.js project started in 2025 or later is running it. For existing large codebases, adoption is more gradual. Teams are enabling it incrementally via the annotation mode rather than doing a full codebase opt-in at once.
Does the React Compiler replace useCallback and useMemo?⌄
Largely yes, for memoization purposes. The compiler handles automatic memoization more accurately than manual useCallback and useMemo because it has full static visibility into your data flow. Applying useCallback when the compiler is active doesn't help and in some patterns actively interferes with the compiler's analysis. The hooks themselves still exist for other uses, but you should stop reaching for them as a performance instinct.
Published: Sat Jun 20 2026