Next.js vs Gatsby vs create-react-app

By

Compare Next.js 16, Gatsby, and create-react-app in 2026: CRA is deprecated, Vite fits client SPAs, and where Next.js and Gatsby still fit.

~~~

Next.js, Gatsby and create-react-app were the three common ways to start a React project for a long time. In 2026 the picture changed: create-react-app is officially deprecated, Next.js 16 defaults to the App Router, and for a plain client SPA you usually want Vite instead of CRA.

create-react-app does not help you generate a server-side-rendered app easily. Anything that comes with SSR (SEO, first HTML with content) is still the job of tools like Next.js and Gatsby.

What did create-react-app give you?

With create-react-app, the browser downloaded an almost empty HTML page plus your JavaScript bundle. React then rendered everything on the client.

That was fine for many apps. But until the JavaScript loaded and ran, the visitor saw nothing. Search engines and social previews got that same empty page, which hurt content sites.

CRA is now in long-term stasis and deprecated by the React team. New client-only apps should not start from create-react-app. Use Vite (or a framework) as react.dev recommends. See Vite + React for the modern SPA path.

When is Next.js better than Gatsby?

They can both help with rendering HTML up front, but in 2 different ways.

The end result using Gatsby is a static site generator, without a Node server in production for classic Gatsby sites. You build the site, and then you deploy the result of the build process statically on Netlify or another static host.

Every page is generated once, at build time, as plain HTML. Serving it is fast and cheap, and there’s no server to maintain or crash. The tradeoff: when the content changes, you rebuild and redeploy.

Next.js 16 (App Router) can still ship static pages, but its main strength is a full React framework: Server Components, server rendering on request when you need it, Route Handlers, and deploy targets that run Node.js or a compatible server runtime.

That on-request render can show fresh or user-specific data. A pure static build can’t do that without another data layer.

Next.js can generate a mostly static site too. If my only goal was a content site with a big plugin ecosystem for blogs, Gatsby might still feel more specialized. For most new product apps in 2026, Next.js is the default framework choice.

Gatsby is also heavily based on GraphQL, something you might really like or dislike depending on your opinions and needs. All the data in a Gatsby site (markdown files, images, data from a CMS) flows through a GraphQL layer you query at build time. If you already know GraphQL it feels natural. If you don’t, it’s one more thing to learn before you’re productive.

When is a client SPA enough?

If you’re building an app that lives behind a login, like a dashboard or an internal tool, SEO does not matter and nobody sees the first paint but your users. In that case a client-rendered SPA is still a good fit.

Just don’t pick create-react-app for that in 2026. Scaffold with Vite, or use Next.js if you already want its routing, server features, or deployment model. With React 19, CRA is no longer the simplest modern default.

Tagged: Next.js · All topics

Want me to talk about your product? You can sponsor this site.

~~~

Related posts about next: