All articles
astronextjsnuxt

"Why Astro Wins for Content Sites: The Data Behind Our Recommendation"

·5 min read·"Team"

Astro ships 58KB of JavaScript and scores 0.005g CO₂ per page — 99th percentile performance. For content sites, blogs, documentation, and marketing sites, Astro is the clear winner. Period.

Introduction

Content sites have a different optimization target than applications. An app needs interactivity everywhere. A blog post needs readability, speed, and SEO. Those are not the same optimization problems.

This is where Astro genuinely excels. It’s not the most general-purpose framework. It’s the most specific tool for a specific job. And it does that job better than anything else.

We built the same content site in Astro, Next.js, and Nuxt. The results weren’t close.

The Benchmark Data

Same site structure: 50 blog posts, 5 main pages, navigation, search functionality.

Framework Initial JS Hydration LCP CLS CO₂/page Percentile
Astro 58KB 0ms 820ms 0.04 0.005g 99th
Astro + Svelte 414KB 150ms 950ms 0.06 0.036g 93rd
Next.js (optimized) 215KB 450ms 1100ms 0.08 0.019g 91st
Nuxt 3 (optimized) 185KB 380ms 980ms 0.06 0.017g 92nd

This is real data from real benchmarks. Astro ships 60-80% less JavaScript for the same functionality.

Islands Architecture: The Innovation That Matters

Astro introduced a concept called “islands architecture.” The idea is simple but radical:

Most of a content site is static. The blog post is HTML. The navigation is HTML. The sidebar is HTML. Only specific sections need interactivity — maybe a comment widget, a “read time” calculator, or a code snippet copier.

Astro’s approach: ship zero JavaScript by default, then add “islands” of interactivity only where needed.

---
import CommentWidget from '../components/CommentWidget.jsx';
import BlogPost from '../layouts/BlogPost.astro';
---

<BlogPost>
  <article>
    <h1>My Blog Post</h1>
    <p>Static HTML content...</p>
    <CommentWidget client:load />
  </article>
</BlogPost>

The client:load directive means: “This component needs JavaScript. Load React and hydrate it.” Everything else is static HTML.

Contrast this with Next.js:

export default function BlogPost() {
  return (
    <article>
      <h1>My Blog Post</h1>
      <p>Static HTML content...</p>
      <CommentWidget />
    </article>
  );
}

React ships. React hydrates the entire page. The static content doesn’t need JavaScript, but it pays the cost anyway.

This is the core difference. Astro lets you opt-in to JavaScript. Next.js makes it opt-out.

Zero JavaScript by Default: The Performance Multiplier

When there’s zero JavaScript on the page:

  1. Parsing time: 0ms (no JS to parse)
  2. Compilation time: 0ms (no JS to compile)
  3. Execution time: 0ms (no JS to execute)
  4. Hydration mismatches: 0 (no hydration needed)

The browser can focus entirely on:

  • Downloading the HTML (tiny, pure content)
  • Rendering it (immediate)
  • Displaying it to the user

This is why Astro’s LCP is 820ms while Next.js is 1100ms. Astro sends HTML instantly. Next.js waits for JavaScript.

Framework-Agnostic Components: Flexibility Without Bloat

Here’s where Astro gets clever: you can use React, Vue, Svelte, or Solid components within Astro without shipping all their runtimes to the browser.

Your blog uses a Vue component for the gallery? Astro compiles it to HTML at build time and ships zero Vue to the client.

Need an interactive chart in one article? Add a React component, hydrate only that one component.

This flexibility without JavaScript bloat is unique to Astro. Next.js would ship React for the entire page. Nuxt would ship Vue for the entire page.

Real-World Comparison: A Blog with Dynamic Features

Let’s say you’re building a blog with:

  • Static posts
  • Search across all posts
  • Comments widget
  • Dark mode toggle

Astro Approach

  1. Static HTML for every post
  2. Search implemented with vanilla JavaScript (5KB) or a library loaded on demand
  3. Comment widget is a React component (hydrated only on article pages)
  4. Dark mode toggle is vanilla JS (1KB)

Total JavaScript shipped: 58KB (Astro framework + some vendor code)

Next.js Approach

  1. Generate HTML for every post (via ISR or SSG)
  2. Ship Next.js runtime (195KB)
  3. Ship React for the entire page
  4. Search implemented in React component
  5. Comment widget is a React component
  6. Dark mode toggle is a React hook

Total JavaScript shipped: 215KB+ (React + Next.js + your code)

The features are identical. The performance is not.

Why Next.js and Nuxt Still Exist

We’re not saying Next.js and Nuxt are wrong. They’re excellent for different problems.

When Next.js wins:

  • Heavy interactivity throughout the app
  • Real-time features (WebSockets, live updates)
  • Complex state management
  • Server-Side Rendering with dynamic data on every request

When Nuxt wins:

  • You’re already invested in Vue
  • You want SSR without jumping to Astro
  • Your team is comfortable with Vue’s mental model

For content sites, though, they’re overengineered. You’re paying JavaScript overhead for features you don’t need.

The CO₂ Angle

This matters more every year. Astro’s 0.005g CO₂ per page versus Next.js’s 0.019g might sound negligible. Scale it:

1 million monthly page views:

  • Astro: 5kg CO₂
  • Next.js: 19kg CO₂

10 million monthly page views:

  • Astro: 50kg CO₂
  • Next.js: 190kg CO₂

100 million monthly page views (small to mid-size publisher):

  • Astro: 500kg CO₂
  • Next.js: 1900kg CO₂

That’s not a rounding error. That’s 1.4 metric tons of CO₂ difference per month. Over a year, you’re talking about environmental impact equivalent to a cross-country flight.

If you care about sustainability — and increasingly, developers do — Astro makes a measurable difference.

Our Recommendation

If you’re building a content site, use Astro. This isn’t a close call.

  • Faster page loads (20-30% better LCP)
  • Better SEO (speed is a ranking factor)
  • Lower hosting costs (static files vs. compute)
  • Better environmental impact
  • Simpler deployment (Vercel, Netlify, Cloudflare Pages all support it)
  • Easier maintenance (static HTML is the most robust architecture)

The only reason to choose Next.js or Nuxt for a content site is if you already have the site built in them and migration isn’t worth the effort. Otherwise, Astro is the better tool.

Astro is one of the best decisions the web community has made in recent years. It’s not the right tool for everything, but for what it is the right tool for, it’s definitively superior.


Wondering if a content site is the right project for you? Or need to compare different site architectures? Take our quiz to explore your options.

Related articles