Por qué Astro es el framework más rápido para landing pages

Este sitio — el que estás viendo ahora — corre en Astro 6 y marca 98/100 en Performance en PageSpeed Insights. No usamos CDN de imágenes, no usamos SSR, no usamos service workers.

Esto es lo que aprendimos construyéndolo y por qué lo recomendamos para landing pages de producto.

El problema con los frameworks modernos

React, Vue, Svelte — todos son excelentes para aplicaciones. Pero cuando el 90% de tu landing page es contenido estático, enviar un runtime de JavaScript de 100KB+ al navegador es overhead sin valor.

La mayoría de las landing pages necesitan:

  • Texto e imágenes (HTML + CSS puro)
  • Un formulario (quizás 5KB de JS)
  • Una animación de scroll (CSS transforms)
  • Analytics (script diferido)

Next.js envía React + ReactDOM + tu bundle de página. Astro envía solo lo que necesitás.

Zero JS by default

Astro funciona con un principio simple: si no es interactivo, no envíes JavaScript.

Un componente Astro puro renderiza a HTML estático. Punto. No hay hidratación, no hayVirtual DOM, no hay reconciliación.

---
// Este componente se compila a HTML + CSS. Cero JS.
const stats = [
  { label: 'Performance', value: '98/100' },
  { label: 'SEO', value: '100/100' },
];
---
<div class="grid grid-cols-2 gap-4">
  {stats.map(stat => (
    <div class="p-4 border rounded">
      <p class="text-2xl font-bold">{stat.value}</p>
      <p class="text-sm text-gray-500">{stat.label}</p>
    </div>
  ))}
</div>

Si necesitás interacción, usás Islands Architecture:

<!-- Solo este componente envía JS al navegador -->
<InteractiveForm client:visible />

client:visible significa: “cargá el JavaScript solo cuando el usuario scroll hasta acá”. El resto de la página es estática.

Comparativa real: Astro vs Next.js

Misma landing page, mismo contenido, mismo CSS:

MétricaAstro (este sitio)Next.js 14 (App Router)
First Contentful Paint0.9s1.4s
Largest Contentful Paint1.8s2.6s
Total Blocking Time0 ms120 ms
JS transferido2.1 KB128 KB
Time to Interactive1.2s2.9s
Lighthouse Performance9882

Next.js es superior para aplicaciones con estado complejo. Astro gana en sitios contenido-first por diseño.

Optimizaciones que aplicamos

1. Fuentes auto-hospedadas

No cargamos Google Fonts desde su CDN. Usamos @fontsource-variable con subset latin-only:

  • Space Grotesk Variable: headlines, 42KB
  • Inter Variable: body text, 65KB

Preload directo en <head>:

<link rel="preload" href="/fonts/space-grotesk-latin-wght-normal.woff2" as="font" type="font/woff2" crossorigin />

Con font-display: optional, el navegador usa la fuente si ya está en caché, o fallback inmediato. Cero layout shift.

2. CSS mergeado en un único chunk

En astro.config.mjs:

build: {
  cssCodeSplit: false,
}

Esto genera un único archivo CSS en lugar de chunks por ruta. Para una landing page de una sola página, una request HTTP menos = mejor.

3. HTML minificado

build: {
  compressHTML: true,
}

Elimina whitespace, comentarios y atributos redundantes. Ahorra ~15% en transfer size.

4. Animaciones GPU-composited

Todas las animaciones usan transform y opacity:

.scroll-reveal {
  transform: translateY(20px);
  opacity: 0;
  transition: transform 0.6s ease, opacity 0.6s ease;
}
.scroll-reveal.visible {
  transform: translateY(0);
  opacity: 1;
}

No animamos width, height, top, left. Eso fuerza recalculo de layout (reflow) y jank en mobile.

5. Analytics diferido

Plausible Analytics se carga con requestIdleCallback post-window.load:

window.addEventListener('load', function () {
  'requestIdleCallback' in window
    ? requestIdleCallback(loadPlausible)
    : setTimeout(loadPlausible, 0);
});

Ni siquiera compite con el parseo del HTML crítico.

Cuándo NO usar Astro

Astro no es la respuesta para todo. No lo uses si:

  • Necesitás estado global complejo (usá Next.js + Zustand)
  • Tu app es principalmente un dashboard interactivo (React puro o Remix)
  • Necesitás SSR con revalidación por request (Next.js ISR)
  • Tu equipo solo sabe React y no quiere aprender otro framework

Content Collections: blogs y docs sin esfuerzo

La feature que más nos convenció de Astro es Content Collections:

// src/content.config.ts
import { defineCollection, z } from 'astro:content';

const posts = defineCollection({
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    tags: z.array(z.string()),
  }),
});

Markdown con frontmatter validado por Zod, typed safety, y SEO automático por post.

Este blog que estás leyendo corre sobre Content Collections. Cero boilerplate para listados, categorías o RSS.

Conclusión

Para landing pages, portfolios, blogs y documentación, Astro es el framework con mejor ratio de rendimiento / complejidad en 2025.

No es que Next.js sea lento. Es que Next.js trae un runtime que no necesitás. Astro te quita la decisión: solo envía JS cuando explícitamente lo pedís.

¿Querés una landing que cargue en menos de 1 segundo? Hablemos.