There are some things I don't love about Next - its TypeScript declarations aren't great, it has a fair share of "magic behavior", and it truly is a "framework" where some features won't work until Next adds explicit support for them.<p>But it is insanely productive if you want to do a mixture of static rendering/server rendering/client rendering. The abstraction leaks here and there, but mostly it holds up, and more importantly almost all of your code can be shared. If you want to do just one of the three, there are better options. But if you're doing client-side + one or both of the other two then it's amazing, and I don't know of anything better.
Had several requests lately for the exact opposite pattern — migrating bloated Next.js projects to vanilla React SPAs.<p>Razzle[0] seems like a workable alternative if you need static exports for optimizations such as link unfurling. Still looking for something that isn't based on Webpack (ideally esbuild or swc)— would appreciate links in replies.<p>[0] <a href="https://razzlejs.org/docs/static-export" rel="nofollow">https://razzlejs.org/docs/static-export</a>
I just did a migration for a pretty large CRA app to Next.js, and it wasn't particularly simple. A lot of stuff changes - for instance `react-router` is common in CRA but NextJS has its own routing system and link components, `loadable-components` is what we used in CRA for code-splitting but instead Next has `next/dynamic`, managing the `head` also changes... these differences pile up.<p>I ended up making contexts that contained generic cross-platform implementations of stuff like links and dynamic components, that shared code could consume in order to function on both CRA and NextJS simultaneously - this made it possible to move things incrementally.