Create React App was Facebook's answer to webpack configuration hell. Before CRA existed in 2016, setting up React meant spending half your day fighting webpack configs, Babel transforms, and ESLint rules just to see "Hello World" on screen. You'd copy-paste some sketchy boilerplate from GitHub, cross your fingers, and inevitably break something trying to add a new dependency. The React community was fragmented across dozens of different starter templates, each with their own quirks and outdated dependencies.
CRA solved this by hiding webpack behind a black box. One command, boom - working React app. No config hell, no dependency archaeology, no spending half your day figuring out why CSS loaders hate you.
The Good Years (2016-2022)
CRA was legitimately revolutionary. You could go from zero to React app in under 5 minutes:
npx create-react-app my-app
cd my-app
npm start
And it would actually work. The dev server started (eventually), hot reload worked (mostly), and you could deploy to production without configuring a single webpack loader.
Millions of developers learned React this way. Every bootcamp, tutorial, and React course started with CRA. It became the standard because it solved real problems:
- No webpack trauma: Webpack's documentation was nightmare fuel for beginners. Stack Overflow was flooded with webpack configuration questions.
- Batteries included: Jest testing, ESLint rules, production builds all worked out of the box. Hot reloading and development server configured perfectly.
- Updates were easy: Bump
react-scripts
version, get new tools and optimizations. The React team could ship improvements to millions of apps at once. - Team consistency: Everyone used the same build setup, no more "works on my machine". Corporate environments loved the standardization.
The Ejection Trap
CRA's biggest feature was also its biggest trap: ejecting. Need to customize webpack? Run npm run eject
and suddenly you own 200+ dependencies and configuration files that look like they were written by someone having a mental breakdown.
Ejecting was supposed to be an escape hatch, but it was more like opening Pandora's box. Once you ejected, you owned everything - every webpack loader, every Babel transform, every ESLint rule. No more easy updates, no more "it just works." You'd gone from zero configuration to being the webmaster of a house of cards.
When the Wheels Started Coming Off
By 2022, the cracks were getting impossible to ignore:
Build Times from Hell
CRA's dev server took 15-30 seconds to start. That doesn't sound like much until you're restarting it 50 times a day. You'd run npm start
, grab coffee, question your life choices, and eventually see your app.
Hot reload was "hot" like a lukewarm shower. Save a file, wait 2-5 seconds, maybe see your changes. Meanwhile, tools like Vite were updating components before you could lift your finger off Ctrl+S. Developer experience benchmarks showed Vite was orders of magnitude faster at hot reloading.
The Framework Mismatch
React was evolving toward server components and full-stack frameworks. CRA was stuck in the "single-page app" mindset from 2016. Features like Next.js App Router and React Server Components couldn't work with CRA's architecture.
Maintenance Hell
The CRA team was basically one person (Joe Haddad) trying to maintain a tool used by millions. Issues piled up, PRs sat unmerged, and React 19 compatibility was always "coming soon."
The Final Nail: Vite Showed Up
Then Vite showed up and made CRA look like shit. Sub-second dev server startup. Instant hot reload. Modern build pipeline. Everything CRA did, but actually fast.
Developers tried Vite and couldn't go back to waiting 30 seconds for CRA to start. It was like switching from dial-up to broadband. The performance difference wasn't subtle – it was life-changing.
The Official Death Certificate
In February 2025, the React team finally put CRA out of its misery:
"We're deprecating Create React App for new apps, and encouraging existing apps to migrate to a framework, or to migrate to a build tool like Vite, Parcel, or RSBuild."
The reasons were brutal but honest:
- No active maintainers (it was essentially abandoned)
- Can't support React 19 properly
- Build performance that makes developers want to quit programming
- Modern React development needs full-stack frameworks, not 2016-era SPAs
Don't panic though - it's not completely "dead." CRA still gets critical security patches in maintenance mode. But no new features, no React 19 support, and definitely no build performance improvements that could save your sanity.
If You're Still Using CRA
You're not fucked, but you're definitely behind. Existing CRA apps still work and get critical security patches. But you won't get:
- React 19 features like improved concurrent rendering
- Modern build optimizations that could cut your bundle size in half
- Dev server performance that doesn't make you want to throw your laptop
- New React features that require modern build tools
Time to plan your escape. Next.js, Vite, and React Router are all waiting with migration guides and significantly better developer experiences. Just make sure you're not running Node 16.x when you migrate - learned that the hard way when Vite refused to start with cryptic ESM errors.