Next.js vs Plain React
A common source of confusion for newcomers is treating “React” and “Next.js” as competing options, as if you had to pick one. In reality Next.js is not an alternative to React — it is a framework built directly on top of it. React still renders every component you write; Next.js adds the routing, rendering, and tooling layer around it. The real question is not “React or Next.js?” but “plain React, or React plus a framework layer?”
Side-by-side comparison
Concern | Plain React (Create React App / Vite) | Next.js |
|---|---|---|
Routing | Not included — add and configure a router library (e.g. React Router) yourself. | File-based routing built in — a folder with a |
Rendering | Client-side only by default — the browser downloads JS and renders everything. | Server rendering built in — components can render on the server, sending real HTML to the browser. |
Data fetching | DIY — pick and configure your own fetching library and caching strategy. | Framework conventions — |
Optimizations | Manual — you configure image resizing, font loading, and script strategy yourself. | Automatic — |
Deployment | Any static host works, since the output is a static bundle. | Needs a Node.js (or edge) runtime for full-stack features; static export is also supported for simpler sites. |
What you actually give up by staying plain
With plain React, every one of the rows above becomes a decision you have to make and maintain: which router, which SSR approach (if any), which data-fetching library, which image pipeline, which hosting provider. None of those decisions are wrong to make yourself — many production apps do exactly that — but they are extra surface area that Next.js collapses into sensible, well-tested defaults.
When plain React can still make sense
For a small, purely client-side widget, an internal tool with no SEO requirements, or a component embedded inside another system, a lightweight React setup (e.g. Vite) can be simpler than pulling in a full framework. For anything resembling a real website or product — especially one that needs good SEO, fast initial loads, or a backend of its own — Next.js's defaults tend to save far more time than they cost.