The React 19 Upgrade Experience
I migrated three production apps. Here's what to expect.
React 19 brought useTransition improvements, the new use() hook, and the Activity component. The migration was smoother than I feared. Here's the breakdown.
React 19 shipped in late 2024 and I migrated three apps. The verdict: smoother than I expected.
What's new that I actually use
use()- replaces a lot of useEffect-for-data patterns. Cleaner, more composable.- Actions - server actions are now first-class. Good for forms.
<Activity>- control what's mounted vs hidden cleanly. Useful for tabbed UIs.- Improved hydration error messages - finally readable.
What broke in migration
- A handful of third-party libraries that used
React.forwardRefin the old style. Most patched within weeks of the release. - Some dev-only warnings became errors. Mostly correct ones.
- A few
PropTypesdeprecations (long overdue).
What didn't break
- Existing useState/useEffect/useReducer code. All works.
- Most third-party libraries. The big ones were ready.
- Build tooling. Vite and Next.js had React 19 paths within days of GA.
My migration checklist
- Read the release notes.
- Check your direct dependencies for React 19 compatibility (npm-compatibility-checker)
- Update React + ReactDOM together
- Run the codemod tools React provides
- Fix the one or two warnings that appear
- Run your test suite
- Deploy
For my three apps, the migration was 2-4 hours each.
When NOT to upgrade
- If you're on a fork of React (uncommon)
- If a critical dependency is stuck on 18 (check first)
- If you have time-sensitive work in flight that the migration would block
For most teams: upgrade. The benefits compound.