React 19 dropped December 2024 and immediately broke thousands of apps. Not "might break" - definitely breaks. The React team finally pulled the trigger on removing APIs they've been complaining about since 2017.
Why This Migration Hurts
Remember all those yellow warnings you've been ignoring for years? `ReactDOM.render is deprecated`, `string refs are deprecated`, `legacy context will be removed`? They're gone. Not deprecated anymore - literally deleted from the codebase. Your app throws TypeError: ReactDOM.render is not a function
and dies.
The breaking changes fall into three categories:
- Removed deprecated APIs: PropTypes, ReactDOM.render, findDOMNode
- Updated behavior: Error handling, Strict Mode, ref forwarding
- TypeScript changes: New type requirements, useRef parameter requirements
The Reality Check You Need
Install React 18.3 first. It's literally identical to 18.2 but screams at you about everything that's about to break. React 18.3 exists solely to ruin your day with warnings.
npm install react@18.3 react-dom@18.3
npm start
Open the browser console. If you see warnings, your app will break in React 19:
ReactDOM.render is no longer supported
- your app won't startString refs are deprecated
- components will crashfindDOMNode is deprecated
- DOM access fails
No warnings? You got lucky. Most warnings? You're in for a rough week.
How to Not Completely Fuck This Up
Phase 1: Check If Your Dependencies Are Dead
Half your libraries don't support React 19 yet. React Router took 3 weeks. Material-UI took a month and broke their CI for 3 days. Redux users had to wait for Redux Toolkit 2.0.
Phase 2: Let the Robots Fix the Easy Stuff
React has codemods that fix 80% of the breakage automatically:
npx codemod@latest react/19/migration-recipe
This fixes ReactDOM.render, string refs, and import paths. But it's not perfect - I've seen it fuck up complex component hierarchies and miss dynamic imports.
Phase 3: Fix the Shit That Breaks Everything
The codemods miss the painful stuff:
- Legacy context API (if you have this, you're fucked)
- PropTypes scattered everywhere
- Custom error boundaries that expect old behavior
Phase 4: Test Until It Hurts
React 19's Strict Mode got stricter and will surface bugs you didn't know existed. Error handling changed completely - uncaught errors go to window.reportError
instead of being re-thrown. This breaks Sentry integration if you don't update it.
JSX Transform Bullshit
React 19 demands the new JSX transform from 2020. If your app is older, you'll get:
Your app is using an outdated JSX transform. Update to the modern JSX transform for faster performance
Create React App handles this automatically. Custom Webpack/Vite? Update your JSX loader config or your build will break. The upside: no more importing React in every damn file, smaller bundles, faster builds.