For a period, picking a web framework felt like picking a side in a culture war. Every option had its advocates, its detractors, and its Twitter arguments. That period is largely over. Next.js has won the mainstream React framework debate, and the evidence is in the adoption curves, the hiring market, and the quality of the ecosystem around it.
This is not a fanboy post. There are real reasons to reach for something else. But the default has changed, and it is worth understanding why.
Why Next.js won
The Vercel effect. Having the infrastructure company and the framework company be the same entity created an unusually tight feedback loop. Deployment is genuinely zero-config. The caching, edge functions, and image optimization features work because they were designed together.
The file-system routing convention. Before App Router, the Pages Router made route creation obvious. You create a file, you have a route. No configuration. For teams with mixed experience levels, convention beats configuration every time.
SSR, SSG, and ISR in one framework. Next.js did not force a choice between server rendering and static generation. You could mix strategies within the same application, which meant it handled marketing sites, product dashboards, and e-commerce all reasonably well.
Next.js won because it made the right decisions obvious and the wrong decisions hard. That is better framework design than being maximally flexible.
What the App Router changes
The App Router (stable since Next.js 13.4) is a significant shift. The mental model moves from page-level data fetching to component-level data fetching via React Server Components.
For product teams, the practical changes are:
- Server Components by default. Components render on the server unless you explicitly opt into client-side rendering with 'use client'. This means less JavaScript shipped to the browser by default.
- Nested layouts. Layout components that persist across route changes without re-mounting. Significant for dashboards and multi-section products.
- Streaming. Server Components can stream content progressively, which means users see something faster even when some data takes longer to load.
The learning curve is real. The Pages Router was easier to reason about. But for new projects, App Router is the right choice — the Pages Router is effectively in maintenance mode.
When to reach for something else
Pure marketing sites without complex interactivity. Astro is better here. It ships zero JavaScript by default and is genuinely faster for content-heavy sites. If your site is mostly static content with some islands of interactivity, Astro is worth the learning cost.
Very high-scale APIs. If you are building something that needs to handle enormous request volumes with complex business logic, a dedicated backend (Go, Rust, Node with Fastify) is a better home for that than Next.js API routes.
Teams with no React experience. The best framework is the one your team knows. If your team is strong in Vue, use Nuxt. If they are strong in Svelte, SvelteKit is excellent. Do not add a learning curve on top of a shipping deadline without a good reason.
Next.js with App Router, TypeScript, Tailwind, Postgres via Prisma, deployed on Vercel. This handles 90% of the products we build without reaching for something else.
The practical advice
If you are starting a new web product today and you have no strong reason to use something else, use Next.js. The ecosystem, the hiring pool, the documentation, the tooling, and the deployment story are all best-in-class.
Start with the App Router even if it feels unfamiliar. The Pages Router will be around for a while but the investment in learning App Router is worth making now rather than migrating later.
And deploy on Vercel unless you have a specific reason to self-host. The productivity benefit of zero-config deployment is worth more than it costs at almost every scale.
Need a Next.js build? We ship fast.