Next.js vs Traditional React + Vite: Choosing the Right Stack for a Project
"Next.js or Vite?" gets asked like there's a universally correct answer. There isn't — they solve different shapes of problem, and picking based on what's trendy instead of what the project actually needs is how teams end up fighting their framework instead of shipping with it.
What Vite + React actually is
A fast dev server and bundler for a client-rendered single-page app. No opinions about routing, data fetching, or server rendering — you bring your own (React Router, TanStack Query, whatever). That lack of opinions is a feature when you want control, and friction when you want sensible defaults you don't have to assemble yourself.
What Next.js actually adds
Server rendering (and Server Components) by default, file-based routing, a metadata API, image optimization, and a built-in data-fetching/caching model tied to the framework. In exchange for those opinions, you get less assembly required — and a steeper cost if your project's needs don't match those opinions.
When Vite is the better call
Internal tools and admin dashboards behind auth, where SEO is irrelevant and the app is genuinely a client-heavy SPA users load once and interact with for a long session. Also a reasonable call for teams that want full control over routing/data-fetching architecture rather than adopting a framework's specific model of it. The dev server speed difference is real but usually not the deciding factor — the deciding factor is whether you want the framework's opinions or not.
When Next.js is the better call
Anything public-facing where SEO and first-load performance matter — marketing sites, content sites, e-commerce, blogs (like this one). Also a good call for a small team that would rather inherit sensible defaults for routing, data fetching and image handling than assemble and maintain those decisions themselves.
The mistake in both directions
Using Next.js for an internal dashboard and fighting its server-rendering defaults the whole way, when a plain SPA would've been simpler. Or using Vite for a public marketing site and hand-rolling SEO metadata, sitemaps, and prerendering that Next.js would've given you for free. Both mistakes come from picking a stack based on résumé-building or trend-following instead of the project's actual requirements.
Takeaway
The question isn't which is "better" — it's whether your project needs SEO and server rendering (lean Next.js) or wants full control over a client-heavy app's architecture (lean Vite + React). Most bad stack decisions I've seen come from skipping that question entirely.