I spent last week removing 142 useMemo calls from our production codebase. Not because they were wrong. Because the React Compiler made them unnecessary.
The v1 release dropped quietly. No fanfare. But if you're still writing useMemo and useCallback everywhere, you're doing work the compiler now handles automatically.
What actually changed
The compiler tracks dependencies across components. Not just within a single hook, but across the entire render tree. It knows when a value is stable and when it's not. It inserts memoization boundaries where they matter and skips them where they don't.
Three things it does better than you:
→ Cross-component dependency tracking. Your useMemo only sees what's inside its own scope. The compiler sees the full picture, including dynamic hooks.
→ Automatic bailouts for unstable references. You know that bug where your useEffect fires every render because an object reference changes? The compiler catches that.
→ Tree-aware memoization boundaries. Instead of memoizing individual values, it memoizes entire subtrees when the inputs haven't changed. Way more efficient than sprinkling React.memo everywhere.
Our Table component went from 18ms renders to 4ms. That's not a micro-optimization. That's the difference between smooth scrolling and visible jank on a 60fps target.
Where it breaks
But it's not magic.
Legacy class components don't get compiled. The compiler skips them entirely. No errors, no warnings. Just no optimization.
Imperative animation libraries fight the compiler. If you're mutating refs or DOM nodes directly, the compiler's assumptions about pure renders break down. GSAP and Framer Motion work fine. But anything that bypasses React's render cycle needs manual memoization still.
Context-heavy architectures get mixed results. If you're passing objects through context and every consumer re-renders when any property changes — the compiler can't fix your architecture. You still need to split contexts or use selectors.
Should you migrate?
The error overlay is genuinely useful. It flags optimization blockers inline, telling you exactly which patterns prevent compilation. Fix those patterns and the compiler takes over.
If you're on React 19 and your codebase is mostly functional components with hooks — yes. Start by removing useMemo and useCallback from a single route, measure the performance, and go from there.
The compiler won't make you forget how to optimize. But it will make you question why you were doing it manually in the first place.
What's your migration experience been like?
Top comments (0)