When a client asks us to build a web application, one of the first decisions is whether to use plain React or Next.js. The answer depends on SEO requirements, team size, deployment constraints, and performance goals — not just personal preference.
What React Gives You
React is a UI library. It renders components in the browser, manages local state, and handles events. On its own, it produces a single-page application (SPA): one HTML shell that JavaScript populates at runtime. This is fast to build and easy to deploy anywhere static files can be served.
SPAs work well for authenticated dashboards, internal tools, and apps where SEO doesn't matter. If your users always log in before seeing anything meaningful, a plain React SPA is often the simplest path.
What Next.js Adds
Next.js wraps React with a full framework: server-side rendering (SSR), static site generation (SSG), file-based routing, API routes, image optimisation, and — in the App Router — React Server Components and Edge Runtime support.
The practical benefit is that your pages arrive from the server as complete HTML. Search engines index them without waiting for JavaScript to run. Time to First Byte is faster. And with static generation, pages can be cached at a CDN edge.
When We Choose Next.js
- Marketing sites, landing pages, or any page that needs to rank in search
- E-commerce storefronts where product pages must be crawlable
- Content-heavy apps with hundreds of dynamic routes
- Projects where we want React Server Components to reduce client-side JavaScript
- Teams deploying to Vercel or another edge-native platform
When Plain React Is Enough
- Internal dashboards or admin panels behind authentication
- Mobile apps built with React Native (Next.js doesn't apply here)
- Prototypes where SSR complexity isn't justified yet
- Projects already hosted on a static-only provider with no server support
Our Default in 2025
For most client projects, we start with Next.js 14+ and the App Router. Server Components let us keep sensitive logic off the client, reduce JavaScript bundle sizes, and colocate data fetching with the components that need it. The framework's built-in image optimisation and font loading alone often lift PageSpeed scores by 10–20 points without extra work.
The exception is when a client has an existing React SPA they want to extend — we'll stay in that stack and add SSR only if there's a clear business case. Framework migrations are expensive; we don't recommend them unless the outcome justifies the cost.
Conclusion
Next.js is the better default for most product teams in 2025. It gives you React plus a lot of plumbing you'd otherwise write yourself. Choose plain React when you're building behind a login wall or in an environment where server-side rendering isn't available. When in doubt, start with Next.js — it's easier to stay simple than to retrofit SSR later.