Astro vs Next.js Comparison
Compare Astro and Next.js across rendering models, performance defaults, ecosystem, and use cases to pick the right framework for your project.
What you'll learn
- ✓How Astro and Next render pages differently
- ✓Default JavaScript footprint of each
- ✓Which use cases suit Astro best
- ✓Where Next.js still wins
- ✓How to mix the two in a single domain
Prerequisites
- •Comfortable with HTML and JavaScript
What and Why
Both Astro and Next.js can build modern web apps with server rendering, but they make different bets. Next.js is a React-first framework that ships a runtime on every page. Astro is a multi-framework HTML-first generator that ships zero JavaScript by default. The right pick depends on whether your product is closer to a magazine or an application.
Mental Model
Picture a spectrum. On one end is a fully static documentation site that occasionally needs a search box. On the other is a real-time dashboard with charts, drag-and-drop, and live updates. Astro lives on the static end with optional interactivity. Next.js lives on the app end with optional static export. There is overlap in the middle, but the further you sit from the middle, the clearer the choice becomes.
Static site Interactive app
Astro |---| |-------------| Next.js
0 KB JS default framework runtime always shipped
hydration per island hydration of whole tree
Hands-on Example
A blog post page in Astro.
---
import { getEntry } from 'astro:content';
const post = await getEntry('blog', Astro.params.slug);
const { Content } = await post.render();
---
<article>
<h1>{post.data.title}</h1>
<Content />
</article>
The output is plain HTML, no React on the page, no hydration cost.
The same page in Next.js App Router.
import { getPost } from '@/lib/posts';
export default async function Page({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug);
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.html }} />
</article>
);
}
It also renders on the server, but Next ships a React runtime and the client-side router so navigations stay smooth. For a content site that the user reads once and leaves, the runtime is overhead. For an app the user spends an hour in, that runtime pays for itself in instant transitions.
For interactivity, Astro requires you to mark an island.
<LikeButton client:visible initial={0} />
In Next.js, any client component is hydrated automatically.
'use client';
import { useState } from 'react';
export function LikeButton({ initial }: { initial: number }) {
const [count, setCount] = useState(initial);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
Common Pitfalls
People pick Astro for a heavily interactive product and end up with state management spread across many islands. If you find yourself reaching for cross-island stores on every page, a single-page framework is probably a better fit.
The reverse is also common. Teams pick Next.js for a marketing site, then discover that the React runtime, image component, and analytics scripts add up to hundreds of kilobytes of JavaScript that the page never needs. The site scores worse on Core Web Vitals than a plain HTML version would.
Routing models differ. Astro has file-based routes that are mostly static, with optional SSR pages and endpoints. Next.js routes can be static, ISR, or fully dynamic, with nested layouts and parallel routes. Trying to recreate the Next.js layout system in Astro leads to friction. Use Astro’s own layout components instead.
Practical Tips
Use Astro for marketing sites, blogs, documentation, and small portfolios. The build output is hard to beat on bandwidth and Lighthouse scores.
Use Next.js for dashboards, social apps, ecommerce checkout flows, and anything with realtime features. The React ecosystem covers nearly every interactive pattern you might need.
You can mix the two on a single domain. Put the marketing site on Astro at the root and proxy the app to a Next.js deployment behind /app. A reverse proxy at the edge handles the split transparently to users.
Both frameworks support TypeScript, MDX, and Tailwind out of the box. The difference is the runtime cost, not the developer experience.
If you already have a Next.js team and a small content section, you can keep everything in Next. The pain only becomes real when content pages outnumber app pages.
Wrap-up
Astro and Next.js are both excellent, and the answer to which one to use is rarely either-or. Astro wins when content is king and interactivity is local. Next.js wins when interactivity is everywhere and content is incidental. Place your project on the spectrum honestly, and the right choice usually picks itself.
Related articles
- Astro Astro Islands Architecture Explained
Learn how Astro ships zero JavaScript by default and only hydrates the interactive components you mark as islands.
- Astro Astro Middleware Tutorial
Use Astro middleware to run code on every request: auth gates, locals injection, redirects, and response headers. Learn the onRequest signature, the next() flow, sequencing, and common production patterns.
- Astro Astro Server Endpoints Tutorial
Build JSON APIs and dynamic responses directly in Astro using server endpoints. Learn the file conventions, request and response shapes, dynamic params, and how to mix endpoints with static and SSR pages.
- Next.js Next.js Data Fetching Patterns: A Practical Guide
Compare the main Next.js data fetching strategies and learn when to use server components, route handlers, SWR, or static generation in your apps.