This is the wrong way to frame the question, honestly — Next.js is built on React, not a competitor to it. The real question is whether you need a framework around React, or just React itself. Here's how I actually decide, project by project.
What each one actually is
React (via Vite or Create React App) is a client-side library: it renders your UI in the browser, and the browser has to download and run JavaScript before anything appears. Next.js wraps React with server-side rendering, file-based routing, image and font optimization, and API routes built in — it decides where each part of your app renders (server or browser) for you.
| Plain React (Vite/CRA) | Next.js | |
|---|---|---|
| Initial render | Client-side only — blank page until JS loads | Server-rendered — content visible immediately |
| SEO out of the box | Needs extra setup (SSR library, prerendering) | Built in — pages are crawlable by default |
| Routing | Add a router library (React Router) | File-based, included |
| Backend/API needs | Separate backend required | API routes built into the same project |
| Best for | Dashboards, internal tools, apps behind a login | Marketing sites, blogs, e-commerce, anything public and SEO-dependent |
| Learning curve | Lower — just React | Higher — React plus rendering and caching concepts |
When plain React is the right call
- An internal admin dashboard or SaaS app behind authentication — nobody needs to Google their way into a logged-in dashboard, so SEO is irrelevant.
- A tool where every user's view is different and personalized, and pre-rendering wouldn't help anyway.
- You already have a backend (Django, Rails, a separate Node API) and just need a frontend to talk to it.
When Next.js is the right call
- Anything public-facing that needs to rank on Google — marketing sites, blogs, portfolios, product pages.
- E-commerce, where fast initial load directly affects conversion and where product pages need to be indexable.
- Projects where you want the frontend and a lightweight backend (API routes) in one codebase instead of managing two deployments.
The honest trade-off
Next.js gives you more — better defaults for performance and SEO — but it also asks you to understand more: when a component runs on the server versus the client, how caching and revalidation work, how to avoid accidentally shipping server-only code to the browser. For a project where none of Next.js's extra features are actually used, that complexity is pure cost. For anything public and SEO-dependent, it almost always pays for itself within the first month.