Cambiar tema

Reconstruí mi blog con Astro 5: Lighthouse pasó de 68 a 100

Easton editorial illustration: build pipeline conveyor

La semana pasada tiré abajo el blog en Next.js que llevaba dos años y lo reconstruí con Astro 5. El detonante fue una puntuación Lighthouse de solo 68: el blog cargaba tan lento que un amigo dijo que «giraba y giraba antes de aparecer». Tras la migración, el tiempo de build bajó de 2 minutos a 18 segundos y la puntuación de rendimiento pasó de 68 a 98.
En este artículo hablamos de tres cosas: por qué Astro es tan rápido, cómo montar un blog con él y cómo configurar el SEO. Si alguna vez te ha torturado el rendimiento de tu blog, lo de abajo debería ayudarte.

68→98
Puntuación Lighthouse
Migración de Next.js a Astro 5
2 min→18 s
Tiempo de build
85 % menos tiempo de build
2,1 s→0,8 s
FCP (primer pintado)
Mejora del 62 %
4,5 s→1,2 s
TTI (tiempo interactivo)
Mejora del 73 %
280 KB→45 KB
Tamaño del bundle JS
84 % menos
60 %
Aprueba Core Web Vitals
Sitios Astro; WordPress/Gatsby solo 38 %
Source: Datos de prueba de proyecto real

Por qué Astro merece tu atención

Siendo honesto, al principio Astro no me interesaba mucho. Hay tantos frameworks —Next.js, Nuxt, Gatsby— que marean. Pensaba: otro stack nuevo, ¿merece la pena el tiempo?
Hasta que vi unos datos:
La encuesta State of JavaScript 2024 sitúa a Astro en primer lugar en interés, retención y satisfacción. En uso queda segundo, solo detrás de Next.js. GitHub Octoverse 2025 va más lejos y lo presenta como uno de los lenguajes de mayor crecimiento.
Otro dato llamativo: el 60 % de los sitios Astro superan Core Web Vitals; WordPress y Gatsby solo el 38 %. La brecha es grande.
Quién lo usa: la documentación de GitHub, la de desarrolladores de Firebase, Smashing Magazine (migraron desde WordPress). En 2025 también Google, Reuters y Typst.
Ahí me paré a pensar: ¿qué es mi blog? Un montón de artículos Markdown, resaltado de código y a veces un componente de comentarios. ¿Necesito todo el aparato full-stack de Next.js? No parece.
Mi lectura: si escribes blog, documentación o landing, Astro es casi la mejor opción hoy. Si montas e-commerce o SaaS con mucha interacción, Next.js sigue encajando mejor.
No es quién gana, es el escenario.

Arquitectura Island: el secreto de la velocidad de Astro

¿Te ha pasado que el contenido ya está en pantalla pero los botones no responden?
Suele ser la hidratación de JavaScript. Los frameworks clásicos mandan todo el JS de la página al navegador y lo van «activando». Cuanto más compleja la página, más esperas.
Astro hace lo contrario con la arquitectura Island (Islands Architecture).
Imagina la página como un mar de HTML estático; solo los componentes que de verdad interactúan —contador, formulario, comentarios— «emergen» como islas independientes. Cada isla lleva su propio JavaScript sin molestar a las demás.
En código se ve así:


---

// Este componente solo carga JS cuando entra en el viewport

---

<Counter client:visible />
// Este componente es siempre HTML puro, sin JS
<Header />

¿Ves client:visible? Es la directiva de Astro: activa el componente cuando el usuario lo ve. También hay client:load (al cargar la página) y client:idle (cuando el navegador está ocioso).
En mi blog el FCP pasó de 2,1 s a 0,8 s y el TTI de 4,5 s a 1,2 s. El bundle JS: de 280 KB a 45 KB.
Con justicia, si toda la página son componentes interactivos, Astro puede no ser lo ideal. Brilla cuando la mayor parte es estática. En blogs y docs es otro nivel.

Server Islands: la novedad de Astro 5

Astro 5 añade Server Islands.
Antes: página casi estática pero un bloque dinámico —avatar, contador del carrito— ¿qué haces? O renderizas toda la página en dinámico o renuncias a la personalización.
Server Islands: primero entregas una carcasa HTML estática y el servidor inyecta por separado lo dinámico.
Oficialmente, «rendimiento y personalización ya no se excluyen». En mis pruebas, va muy fluido.

Content Layer: una forma nueva de gestionar contenido

Cuando pasas de 100 artículos, gestionar contenido se vuelve caótico.
Lo clásico: apilar Markdown en src/content y organizar por carpetas. Con pocos posts va bien; con muchos, buscar archivos y conectar un CMS duele.
Content Layer en Astro 5 cambia el juego.
El núcleo es el mecanismo Loader: contenido desde Markdown local, Strapi, Contentful, Notion o tu propia API. Una sola fuente, gestión más clara.

// astro.config.mjs
import { defineCollection, z } from 'astro:content';
const blog = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
  schema: z.object({
    title: z.string(),
    pubDate: z.date(),
    tags: z.array(z.string()),
  }),
});

Esto carga todos los .md de ./src/content/blog y exige title, pubDate y tags.
En rendimiento, Astro dice hasta 5× más rápido en Markdown, 2× en MDX y 25-50 % menos memoria. En mi blog el build pasó de 2 minutos a 18 segundos; encaja con eso.
Hoy uso glob loader con Markdown local. Próximo paso: Notion para separar escritura y publicación.

View Transitions: cambios de página fluidos

Breve: en Astro 5 ViewTransitions pasó a llamarse ClientRouter, misma función, nombre que refleja mejor el enrutado en cliente.


---

import { ClientRouter } from 'astro:transitions';

---

<html>
  <head>
    <ClientRouter />
  </head>
  <body>
    <!-- Tu contenido -->
  </body>
</html>

Con este componente, los cambios de página tienen transición en lugar de un salto brusco. La UX mejora bastante.
En 2025 la View Transitions API nativa la soportan casi todos los navegadores modernos; Firefox fue el último. ClientRouter degrada en los que no la tengan.
Si necesitas estado compartido entre páginas —un reproductor que no se corta al navegar—, ClientRouter encaja. Para animaciones simples, CSS View Transitions nativo también basta.

Configuración SEO en la práctica

Muchos creen que con buen rendimiento en Astro ya está; el SEO importa. Los buscadores miran velocidad, pero también estructura y metadatos.
La primera vez tropecé bastante; aquí va lo que aprendí.

Configuración del sitemap

Lo básico y lo que más se olvida:

npx astro add sitemap

Luego en astro.config.mjs tu dominio:

import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
  site: 'https://yourdomain.com', // ¡No olvides esta línea!
  integrations: [sitemap()],
});

La primera vez olvidé site y el sitemap salió con rutas relativas; Google no las tomó. Me costó días descubrirlo.

Gestión de metaetiquetas

Cada artículo debe tener su title y description. Yo los centralizo en el frontmatter del Markdown:


---

title: "Guía de optimización de rendimiento en Astro 5"
description: "Análisis profundo de la arquitectura Island y Content Layer en Astro 5..."
publishDate: 2025-11-20
ogImage: "/images/astro-5-cover.png"

---

En el layout leo esos datos:


---

const { title, description, ogImage } = Astro.props.frontmatter;

---

<head>
  <title>{title}</title>
  <meta name="description" content={description} />
  <meta property="og:title" content={title} />
  <meta property="og:description" content={description} />
  <meta property="og:image" content={ogImage} />
  <link rel="canonical" href={Astro.url} />
</head>

La URL canónica evita que el mismo contenido se trate como duplicado.

Datos estructurados (JSON-LD)

Poca gente lo usa, pero ayuda al SEO: le dice al buscador que es un artículo, quién es el autor y cuándo se publicó.

<script type="application/ld+json">
  {JSON.stringify({
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "headline": title,
    "datePublished": publishDate,
    "author": {
      "@type": "Person",
      "name": "Tu nombre"
    }
  })}
</script>

Puedes validar con Schema.org Validator.

Tendencias SEO en 2025

Cambios relevantes este año:

  1. Los LLM también rastrean tu página. Buscadores e IA dependen de contenido estructurado; escribir claro pesa más que apilar keywords.
  2. Los enlaces internos importan. Al menos 3 por página, o el buscador puede pensar que no merece indexarse.
  3. Principio E-E-A-T. Experiencia, pericia, autoridad, confianza: no es magia, es un factor real de ranking en Google.

Lista de comprobación SEO

Al terminar la configuración, repasa:

  • sitemap.xml generado y accesible
  • title y description únicos en cada página
  • alt en todas las imágenes
  • JSON-LD añadido
  • robots.txt correcto
  • al menos 3 enlaces internos por página

Optimización de imágenes: el asesino silencioso del rendimiento

Suena simple, pero comprimir no basta.
Astro trae astro:assets y el componente Image es muy potente:


---

import { Image } from 'astro:assets';
import myImage from '../assets/hero.png';

---

<Image
  src={myImage}
  alt="Hero image"
  widths={[400, 800, 1200]}
  format="webp"
/>

Esto hace varias cosas:

  1. Infiere ancho y alto para evitar CLS
  2. Genera varios tamaños para carga adaptativa
  3. Convierte a WebP para menos peso
    Clave: las imágenes van en src, no en public. Astro optimiza las de src; las de public, no. Yo las puse mal y pesaban una barbaridad.
    Para remotas, inferSize obtiene dimensiones automáticamente:
<Image
  src="https://example.com/image.jpg"
  alt="Remote image"
  inferSize
/>

¿Cuánto se nota? El proyecto open source AstroEdge probó: de 4,2 MB a 0,8 MB (−82 %). La puntuación de rendimiento de 79 a 100.
Astro 5 añade recorte experimental de imágenes y soporte de componentes SVG; mira la documentación oficial si te interesa.

Migrar desde otros frameworks

Si vienes de Astro 4 u otro framework, repaso rápido.
Cambios principales en Astro 5:

  1. ViewTransitions renombrado a ClientRouter
  2. Astro.glob() obsoleto; usa import.meta.glob() o getCollection()
  3. Modo híbrido fusionado en salida estática
  4. Servicio de imágenes de Squoosh a Sharp
  5. Protección CSRF activada por defecto
    Comando de migración:
npx @astrojs/upgrade

Resuelve la mayoría de incompatibilidades y avisa lo manual.
Desde Next.js o Gatsby hay más trabajo, pero Astro admite componentes React: puedes migrar páginas primero y sustituir componentes poco a poco.

Para cerrar

En resumen:

  1. Arquitectura Island: cero JS por defecto, ventaja natural de rendimiento
  2. Content Layer: contenido unificado, cualquier fuente de datos
  3. SEO: pocos pasos, cada uno crítico
  4. Imágenes: gran palanca oculta, no la ignores
  5. View Transitions: navegación más fluida
    Si dudas qué framework usar para el blog, prueba media hora la plantilla oficial de Astro y mira el build y Lighthouse.
npm create astro@latest -- --template blog

Lista para usar; ajusta config y publica.
Recursos útiles:

  • Documentación oficial de Astro (inglés, la más completa)
  • Astro en chino (traducción al chino)
    En el próximo artículo montaré un blog técnico con Astro + Tailwind + MDX; si te interesa, sígueme.
    ¿Qué framework usa tu blog? ¿Te ha atormentado el rendimiento? Cuéntalo en los comentarios.

Migración completa de Next.js a Astro 5

Pasos desde la preparación hasta la configuración SEO para subir Lighthouse de 68 a 98

Estimated time: PT4H

  1. 1

    Step 1: Entender la arquitectura Island y sus ventajas

    Núcleo de la arquitectura Island:
  2. 2

    Step 2: Configurar Content Layer para gestionar contenido

    El núcleo de Content Layer es el mecanismo Loader:
  3. 3

    Step 3: Configurar optimización SEO

    Configuración del sitemap:
  4. 4

    Step 4: Optimizar el rendimiento de imágenes

    Módulo astro:assets y componente Image de Astro:
  5. 5

    Step 5: Configurar View Transitions

    En Astro 5 ViewTransitions pasó a llamarse ClientRouter, misma función con un nombre que refleja mejor el enrutado en cliente. Uso: import { ClientRouter } from ‘astro:transitions’, añadir <ClientRouter /> en <head>. Los cambios de página tienen transición en lugar de saltos bruscos. En 2025 la View Transitions API nativa la soportan casi todos los navegadores modernos (Firefox fue el último); ClientRouter degrada donde no haya soporte. Si necesitas estado compartido entre páginas (reproductor que no se corta), ClientRouter encaja. Para animaciones simples, CSS View Transitions nativo también basta.
  6. 6

    Step 6: Migrar desde otros frameworks

    Cambios principales en Astro 5: ViewTransitions renombrado a ClientRouter, Astro.glob() obsoleto (usa import.meta.glob() o getCollection()), modo híbrido fusionado en salida estática, servicio de imágenes de Squoosh a Sharp, protección CSRF activada por defecto. Comando de migración: npx @astrojs/upgrade (resuelve la mayoría de incompatibilidades y avisa lo manual). Desde Next.js o Gatsby hay más trabajo, pero Astro admite componentes React: migra páginas primero y sustituye componentes poco a poco.

FAQ

¿Cuánto mejora el rendimiento al migrar de Next.js a Astro 5? ¿Qué datos concretos hay?
Datos de prueba de proyecto real:
• Tiempo de build de 2 minutos a 18 segundos (−85 %)
• Lighthouse de 68 a 98 (+44 %)
• FCP de 2,1 s a 0,8 s (+62 %)
• TTI de 4,5 s a 1,2 s (+73 %)
• Bundle JS de 280 KB a 45 KB (−84 %)

Encuesta State of JavaScript 2024:
• Astro primero en interés, retención y satisfacción
• 60 % de sitios Astro aprueban Core Web Vitals; WordPress y Gatsby solo 38 %

Estos datos muestran una ventaja clara de Astro en rendimiento, sobre todo en sitios de contenido.
¿Qué es la arquitectura Island de Astro? ¿Cómo entenderla y usarla?
Núcleo de la arquitectura Island:
• Imagina la página como un mar de HTML estático; solo los componentes que de verdad interactúan (contador, formulario, comentarios) emergen como islas independientes
• Cada isla gestiona su propio JavaScript sin interferir con las demás

Ejemplo de código:
• <Counter client:visible /> (solo carga JS al entrar en el viewport)
• <Header /> (siempre HTML puro, sin JS)

Directivas de Astro:
• client:visible (se activa al entrar en el viewport)
• client:load (se activa al cargar la página)
• client:idle (se activa cuando el navegador está ocioso)

Server Islands (novedad de Astro 5):
• Primero una carcasa HTML estática; el servidor inyecta lo dinámico por separado
• Oficialmente, rendimiento y personalización ya no se excluyen

Si toda la página es interactiva, Astro puede no ser lo ideal; brilla cuando la mayor parte es estática. En blogs y documentación es otro nivel.
¿Cómo configurar Content Layer en Astro 5? ¿Cuánto mejora el rendimiento?
El núcleo de Content Layer es Loader: puedes cargar desde cualquier sitio:
• Markdown local, Strapi, Contentful, Notion o tu propia API
• Una sola fuente de datos, gestión más clara

Ejemplo de configuración:
En astro.config.mjs:
defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
schema: z.object({
title: z.string(),
pubDate: z.date(),
tags: z.array(z.string())
})
})

Carga todos los .md de ./src/content/blog y exige title, pubDate y tags.

Mejora de rendimiento:
• Build de Markdown hasta 5 veces más rápido, MDX 2 veces
• 25-50 % menos memoria
• En mi blog el build pasó de 2 minutos a 18 segundos

Hoy uso glob loader con Markdown local; próximo paso Notion para separar escritura y publicación.
¿Cómo configurar SEO en Astro 5? ¿Cuáles son los puntos clave?
Configuración del sitemap:
• Ejecutar npx astro add sitemap
• Añadir site: 'https://yourdomain.com' en astro.config.mjs (sin esto el sitemap sale con rutas relativas y Google no las toma; me costó días descubrirlo)

Gestión de metaetiquetas:
• Cada artículo con title y description propios
• Centralizar en frontmatter (title/description/publishDate/ogImage)
• Leer en el layout para title/meta/URL canónica (evita duplicados en buscadores)

JSON-LD:
• Poco usado pero útil: indica que es un artículo, autor y fecha
• Validar con Schema.org Validator

Tendencias SEO 2025:
1) Los LLM también rastrean; contenido estructurado pesa más que keywords
2) Enlaces internos: al menos 3 por página
3) E-E-A-T (experiencia, pericia, autoridad, confianza) es factor real de ranking en Google

Lista SEO:
• sitemap.xml generado y accesible
• title y description únicos por página
• alt en imágenes
• JSON-LD añadido
• robots.txt correcto
• al menos 3 enlaces internos por página
¿Cómo configurar la optimización de imágenes en Astro? ¿Qué trucos clave hay?
Astro incluye astro:assets con un componente Image muy potente:
• Infiere dimensiones para evitar CLS
• Varios tamaños para carga adaptativa
• Conversión a WebP para menos peso

Ejemplo:
import { Image } from 'astro:assets'
import myImage from '../assets/hero.png'
<Image src={myImage} alt="Hero image" widths={[400, 800, 1200]} format="webp" />

Puntos clave:
• Imágenes en src, no en public
• Astro optimiza src; public no
• Yo las puse mal y pesaban una barbaridad

Remotas con inferSize:
<Image src="https://example.com/image.jpg" alt="Remote image" inferSize />

Resultados:
• Proyecto AstroEdge: de 4,2 MB a 0,8 MB (−82 %)
• Puntuación de rendimiento de 79 a 100

Astro 5 añade recorte experimental y soporte SVG; mira la documentación oficial.
¿Qué tener en cuenta al migrar desde otros frameworks a Astro 5?
Cambios principales en Astro 5:
1) ViewTransitions renombrado a ClientRouter
2) Astro.glob() obsoleto; usa import.meta.glob() o getCollection()
3) Modo híbrido fusionado en salida estática
4) Servicio de imágenes de Squoosh a Sharp
5) Protección CSRF activada por defecto

Comando de migración:
• npx @astrojs/upgrade (resuelve la mayoría de incompatibilidades y avisa lo manual)

Desde Next.js o Gatsby:
• Más trabajo, pero Astro admite React: migra páginas primero y sustituye componentes poco a poco

Si dudas del framework para el blog:
• Prueba media hora la plantilla oficial y mira build y Lighthouse
• npm create astro@latest -- --template blog
• Lista para usar; ajusta config y publica

10 min de lectura · Publicado el: 24 nov 2025 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog