Skip to content

Next.js vs React

"Next.js vs React" is a common but slightly misleading question, since Next.js is built on React rather than competing with it. This lesson clarifies the relationship and helps you decide when plain React (with a bundler like Vite) is enough, and when a framework like Next.js pays for itself.

React Is a Library, Next.js Is a Framework

React is a library focused on one job: building UI out of components and managing state. It intentionally does not include routing, data-fetching conventions, a build system, or a deployment story — you choose and wire up those pieces yourself, commonly using Vite as a bundler and React Router for navigation.

Next.js takes React and wraps it with everything a production app typically needs: file-based routing, server rendering, API endpoints (Route Handlers), image/font optimization, and a build pipeline tuned for both static and dynamic content. You still write React components and JSX; Next.js just decides how those components are routed, rendered, and shipped.

// Plain React + Vite (you assemble the pieces)
// main.tsx
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App";

createRoot(document.getElementById("root")!).render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

// Next.js (routing and rendering are built in)
// app/page.tsx
export default function HomePage() {
  return <h1>No router setup needed</h1>;
}

Plain React requires you to bring your own router and rendering strategy; Next.js provides both by convention, based on your file structure.

Feature Comparison Shape

Feature            React (+ Vite)     Next.js
Routing            Manual (library)    Built-in (file-based)
Rendering          Client-side only    Server, static, or client
Data fetching      Manual (fetch/SWR)  Built-in conventions
Deployment target  Static host / CDN   Node server or edge
  • React alone renders entirely in the browser unless you add a separate SSR framework.
  • Next.js can render on the server, at build time, or in the browser — per route.
  • React Router (or similar) must be installed and configured manually in plain React.
  • Next.js routing is automatic based on your app/ (or pages/) folder structure.

React vs. Next.js Cheat Sheet

A quick side-by-side of what each layer is responsible for.

Concern React alone Next.js
Component model Yes (this is React itself) Yes (uses React under the hood)
Routing Add React Router yourself Built-in, file-based
Server rendering Requires a separate framework Built-in (SSR, SSG, ISR)
API endpoints Requires a separate backend Built-in Route Handlers
Image optimization Manual Built-in next/image
SEO metadata Manual, per-tool Built-in Metadata API
Deployment Static hosting is enough for SPAs Needs a Node/edge runtime for SSR

When Plain React Is Enough

A single-page application that is entirely client-rendered — a dashboard behind a login wall, an internal admin tool, or a small widget embedded in another site — often does not need server rendering, and adding a full framework can be unnecessary overhead.

  • The app is behind authentication, so SEO and pre-rendering do not matter.
  • You want the smallest possible build tool (Vite) with maximum control over configuration.
  • The app will be deployed as static files to any CDN with no server runtime.

When Next.js Pays for Itself

As soon as SEO, first-load performance, or public-facing marketing content matter, server rendering becomes valuable, and hand-rolling that on top of plain React is significant, ongoing work. Next.js gives you that capability from the first commit.

  • Public-facing sites where SEO and social sharing previews matter.
  • Apps that mix statically generated marketing pages with dynamic, logged-in views.
  • Teams that want built-in image/font optimization and API routes without extra tooling.
  • Projects that may need to scale rendering strategy (SSG → ISR → SSR) as requirements change.

Common Mistakes

  • Treating "Next.js vs React" as an either/or choice, rather than "React alone vs. React plus a framework".
  • Adding Next.js to a project that will only ever be a client-rendered internal tool, adding unneeded complexity.
  • Assuming a plain React + Vite app automatically gets SEO-friendly server rendering for free.
  • Porting Next.js-specific patterns (like Server Components) into a plain React project where they don't exist.

Key Takeaways

  • React is a UI library; Next.js is a framework built on top of React.
  • Next.js adds routing, rendering strategies, API endpoints, and optimizations by convention.
  • Plain React (with Vite) is a reasonable choice for purely client-rendered, non-SEO-critical apps.
  • Next.js earns its complexity when SEO, performance, or mixed rendering strategies matter.
  • You still write React components and JSX either way — the framework changes how they're routed and rendered.

Pro Tip

If you're unsure which to pick for a new project, ask whether the page needs to rank in search engines or show a fast first paint to anonymous visitors. If yes, default to Next.js; if the app is entirely behind a login wall, plain React is a perfectly valid, simpler choice.