Acabo de migrar este portfolio de Astro 4 a Astro 5. La experiencia fue dolorosa pero útil. Aquí va el post-mortem honesto. Con la decisión que tomé mal.

Lo que encontré

Astro 5 cambió las Content Collections. Lo que antes era content/blog/*.md con un schema en content/config.ts, ahora requiere un loader (glob() o file()) declarado en el mismo sitio. Si no migras el config, las collections devuelven arrays vacíos sin error claro.

El fix: declarar el loader explícitamente.

defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
  schema: z.object({
    title: z.string(),
    date: z.date(),
    tags: z.array(z.string()),
  }),
});

Sin esto, no hay contenido. Perdí 1 hora debuggeando esto.

El segundo drama

Las páginas dinámicas con getStaticPaths(). Astro 5 cambió la firma ligeramente. Antes devolvías un array directo, ahora también se puede usar paginate() con más features. La migración es retrocompatible pero los tipos cambiaron.

Otro drama: las View Transitions API ahora son nativas en Astro 5 (<ViewTransitions /> en lugar del paquete @astrojs/transitions). Menos deps, mejor integración.

La decisión que me arrepiento

Astro 5 ofrece server islands para contenido interactivo por página. Pensé que sería buena idea: en lugar de generar HTML estático para /blog/, generar server islands que se hidratan en cliente.

Resultado: build time subió de 1.4s a 8s. El portfolio no necesita server islands para 6 posts. Volví a static generation.

Lección: no adoptes feature nuevo sin medir impacto. Astro 5 está bien, server islands están bien para portfolio de 200+ posts, pero no para 6.

Total

4 horas de migración. 35 páginas funcionando. 0 páginas rotas. El portfolio está más rápido porque eliminé dependencias.

El proceso que recomiendo

  1. Lee el migration guide oficial entero antes de empezar. Yo leí los primeros 3 párrafos. Me ahorré 2 horas si lo hubiera leído entero.
  2. Migra en una branch separada. Si algo sale mal, rollback es 30 segundos.
  3. Mide antes y después. Build time, lighthouse score, bundle size. Sin métricas no sabes si la migración fue buena.
  4. Migra una sección a la vez. No todo de golpe.

¿Migrastes a Astro 5 también? Cuéntame tu experiencia.