It’s not clear to me how using a framework replaces cra, or why cra is a hassle to maintain? I’ve always thought of cra as a way for beginners to quickly wire necessary stuff up to get a working, ”vanilla” react project, something that could be a done in a simple shell script
CRA existed to remove the setup/maintenance burden of webpack (software straight out of hell ...). It's biggest issue was that it was entirely unconfigurable. You took what was offered in CRA, or you ejected and now had to maintain a huge and brittle webpack config.
The webpack (and CRA) mess started countless attempts at improving the situation. Of which, Vite (+ rollup/rolldown) seems to have won. It's easy to use, fast, supports basically every framework/library in the JS ecosystem.
It's also particularly why Next exists. It gives you a mostly easy to use react setup with Server Side Rendering. Of course, Vercel being Vercel they don't use Vite. Instead, it's a choice between webpack or it's rewrite Turbopack. This is why you get rust-level build times for an interpreted language. Incredible achievement.
My understanding is that features of react now require a meta framework to function. The main feature being React Server Components. There’s a bit of wiring things up required that doesn’t happen off the shelf when you add react as a dependency.
To keep CRA working, this would need to be added. Rather than go down that road, I guess the react maintainers preferred to recommend Next.js which offers RSC support.
I’m probably missing some details. This is my general understanding
While you can run React without a compiler (at least last time I checked), it's really no fun without TSX/JSX, so you need a compiler. There's a bunch of choices in that category, and a bunch of loaders/plugins you can pile on top of that. Compilers and bundlers are not so fun to maintain.