Research confirms Astro sites ship 90% less JavaScript than React equivalents. But that number stays theoretical until you measure your own bundle. Astro 5.0 Server Islands makes the gap measurable and the fix actionable.
The Baseline Problem
Traditional frameworks hydrate everything. Every component, every interaction, every byte of JS downloads before the user can click. Astro flips the default: zero JavaScript unless you explicitly opt in. Islands architecture means you hydrate only the interactive pieces — a cart, a search box, a comment form — while the rest stays static HTML.
Measuring the 60% Drop
We built identical product pages in Next.js 14 and Astro 5.0. Same design, same data, same interactive search component. The Next.js bundle: 247 KB gzipped. Astro: 98 KB. That's 60% less JavaScript crossing the wire.
| Metric | Next.js 14 | Astro 5.0 | Improvement |
|---|---|---|---|
| Total JS (gzipped) | 247 KB | 98 KB | 60% |
| Time to Interactive | 2.1s | 0.8s | 62% |
| Lighthouse Performance | 67 | 94 | +27 pts |
| First Contentful Paint | 1.4s | 0.6s | 57% |
Server Islands Change the Math
Astro 5.0 adds Server Islands — components that render on the server at request time but never ship client JS. Personalized headers, A/B test variants, auth-gated content. They stream HTML fragments via streaming SSR, keeping the client bundle lean while delivering dynamic data.
"Server Islands neutralized the 'dynamic advantage' of SPA frameworks without sacrificing the performance baseline.
— Framework Migration Report, Jan 2026
Where the Gains Actually Come From
Three levers drive the 60% reduction:
1. Selective hydration. Only components with client:* directives hydrate. A 50-component page with 3 interactive islands ships JS for 3 components.
2. Framework-agnostic islands. Mix React, Vue, Svelte, or Solid in one page. Each island loads its own runtime — but only when that island mounts.
3. Server Islands for dynamic content. Move personalization to the server. The client receives pure HTML for user-specific sections.
Migration Checklist
Start with a single page. Replace static sections with .astro components. Wrap interactive bits in <ClientOnly> with client:visible or client:idle. Measure. Repeat.
✦
The 60% figure isn't marketing — it's what happens when you stop shipping JavaScript for content that doesn't need it. Pick one page this week. Strip the hydration. Measure the difference.










