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étrica Astro (este sitio) Next.js 14 (App Router)
First Contentful Paint 0.9s 1.4s
Largest Contentful Paint 1.8s 2.6s
Total Blocking Time 0 ms 120 ms
JS transferido 2.1 KB 128 KB
Time to Interactive 1.2s 2.9s
Lighthouse Performance 98 82

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.