Astro 7: compilador en Rust, caché de rutas y el fin de remark por defecto
Astro 7 reescribe el compilador en Rust, adopta Vite 8 con Rolldown y estabiliza el caché de rutas. Un repaso completo a las novedades y lo que tienes que cambiar para migrar.
Astro 7 no es una versión de features llamativas. Es una versión de infraestructura: compilador nuevo, bundler nuevo, procesador de Markdown nuevo. Tres capas fundamentales reemplazadas al mismo tiempo. El resultado es que los builds son entre un 15 y un 61% más rápidos dependiendo del proyecto, con algunos sitios construyéndose más del doble de rápido.
El compilador ahora es Rust
El compilador de archivos .astro se ha reescrito desde cero en Rust, abandonando la versión anterior en Go. La diferencia de velocidad es real, pero lo que más impacta en el día a día es que el nuevo compilador es estricto.
Antes, si tenías HTML semánticamente incorrecto (etiquetas sin cerrar, elementos de bloque dentro de <p>), el compilador lo reordenaba silenciosamente. Ahora lo deja pasar tal cual o lanza un error. Si tu proyecto lleva años acumulando HTML descuidado, el build de migración te lo va a dejar claro.
Los cambios concretos que vas a notar:
- Etiquetas sin cerrar generan error.
<p>Textosin</p>ya no se acepta. - El HTML inválido no se autocorrige. Un
<div>dentro de un<p>sigue siendo inválido; el compilador lo pasa al navegador sin transformar. - Los espacios entre elementos inline siguen reglas JSX, no HTML. Dos elementos inline consecutivos sin espacio explícito entre ellos los pegará.
Este último punto es el más silencioso. Donde antes tenías <span>hello</span> <em>world</em> renderizando con espacio, si el salto de línea estaba entre los dos elementos el compilador antiguo lo preservaba. El nuevo lo colapsa. Revisa visualmente tras la migración.
Manejo de espacios en blanco
<!-- v6: renderiza "hello world" con espacio -->
<span>hello</span>
<em>world</em>
<!-- v7: renderiza "helloworld" — sin espacio -->
<span>hello</span>
<em>world</em>
<!-- Solución: espacio explícito -->
<span>hello</span>{' '}<em>world</em>
Si prefieres el comportamiento anterior de forma global:
// astro.config.mjs
export default defineConfig({
compressHTML: true,
});
Vite 8 y Rolldown
Astro 7 adopta Vite 8, que trae Rolldown como bundler: un reemplazo en Rust de la combinación esbuild + Rollup. Rolldown es 10-30× más rápido que Rollup manteniendo compatibilidad con su API.
En la práctica, esto significa que los builds de producción son notablemente más rápidos sin tocar nada de tu configuración. Los plugins de Vite existentes siguen siendo compatibles en su mayoría, pero conviene revisar la guía de migración de Vite 8 si tienes plugins personalizados.
Los benchmarks del equipo hablan por sí solos:
| Sitio | Antes | Después | Mejora |
|---|---|---|---|
| docs.astro.build (~6.300 págs) | 114,5 s | 73,5 s | −35,8 % |
| astro.build (~308 págs) | 62,7 s | 24,2 s | −61,3 % |
| biomejs.dev (~6.500 págs) | 176,4 s | 149,9 s | −15,0 % |
Renderización en cola
El motor de renderización interna cambió de un enfoque recursivo a uno basado en colas (queue rendering). El resultado práctico es una mejora de ~2,4× en velocidad de renderizado para páginas complejas. Este era un flag experimental en v6 (experimental.queuedRendering); en v7 es el comportamiento por defecto y el flag desaparece.
Sätteri reemplaza a remark como procesador de Markdown
Este es el cambio que más afecta a proyectos con mucho contenido. Astro 7 usa Sätteri, un procesador Markdown escrito en Rust por miembros del equipo core, en lugar del pipeline remark/rehype.
Sätteri incluye de serie las extensiones GFM más usadas: tablas, notas al pie, tachado, listas de tareas, puntuación inteligente (comillas rizadas, guiones largos), IDs de encabezados automáticos, y soporte para directivas, matemáticas y wikilinks.
El problema es que @astrojs/markdown-remark ya no viene instalado por defecto. Si tienes plugins remark o rehype en tu configuración, tienes que hacer la migración explícita:
npm install @astrojs/markdown-remark
// astro.config.mjs
import { unified } from '@astrojs/markdown-remark';
export default defineConfig({
markdown: {
processor: unified(),
},
});
Si no usas plugins personalizados, Sätteri debería producir el mismo output con mejor rendimiento. Si sí los usas, tienes que decidir si migras a las directivas nativas de Sätteri o mantienes el pipeline unificado.
Enrutamiento avanzado con src/fetch.ts
Astro 7 introduce un nuevo archivo especial: src/fetch.ts. Sirve como punto de interceptación de todas las peticiones antes de que lleguen al enrutador, siguiendo el patrón de Cloudflare Workers o Deno:
import { astro } from 'astro/fetch';
export default {
fetch(request: Request) {
const url = new URL(request.url);
if (url.pathname.startsWith('/api')) {
return fetch('https://mi-backend.com' + url.pathname, request);
}
return astro(request);
},
};
También es compatible con Hono, lo que permite traer middleware de Hono directamente a proyectos Astro sin adaptadores intermedios.
Si ya tenías un archivo src/fetch.ts para otro propósito, tienes que moverlo:
// astro.config.mjs
export default defineConfig({
fetchFile: './src/mi-otro-archivo.ts', // opción 1
// fetchFile: null, // opción 2: deshabilita el feature
});
Caché de rutas estable
El sistema de caché de rutas, experimental en v6, es ahora estable. Permite cachear respuestas de rutas renderizadas bajo demanda usando Astro.cache con semántica HTTP estándar:
// src/pages/producto/[id].astro
---
Astro.cache.set({
maxAge: 60, // segundos en caché
swr: 3600, // sirve versión antigua mientras revalida
tags: ['productos'], // para invalidación dirigida
});
---
Para configuración declarativa puedes usar routeRules en la config, igual que antes. Los adaptadores de Netlify y Vercel ya incluyen proveedores CDN que empujan estas directivas al edge, reduciendo invocaciones de funciones servidor.
Si tenías experimental.cache en tu configuración, muévelo fuera del bloque experimental:
// Antes (v6)
export default defineConfig({
experimental: { cache: { ... } },
});
// Ahora (v7)
export default defineConfig({
cache: { ... },
});
Lo que desaparece en v7
@astrojs/db discontinuado
El paquete @astrojs/db (Astro DB) se ha eliminado definitivamente. Si lo usabas, las alternativas recomendadas son el SQLite nativo de Node.js (node:sqlite), Drizzle ORM o cualquier cliente de base de datos estándar.
APIs de astro:transitions eliminadas
Varias constantes internas del sistema de View Transitions han desaparecido:
// ❌ Ya no existen
TRANSITION_BEFORE_PREPARATION;
TRANSITION_AFTER_PREPARATION;
TRANSITION_BEFORE_SWAP;
TRANSITION_AFTER_SWAP;
isTransitionBeforePreparationEvent();
createAnimationScope();
// ✅ Usa los nombres de eventos directamente
document.addEventListener('astro:before-preparation', handler);
document.addEventListener('astro:before-swap', handler);
getContainerRenderer() — importación cambiada
// Antes
import { getContainerRenderer } from '@astrojs/react';
// Ahora
import { getContainerRenderer } from '@astrojs/react/container-renderer';
Aplica igual para Preact, Solid, Svelte, Vue y MDX.
Cómo migrar
La actualización más rápida es con el asistente oficial:
npx @astrojs/upgrade
Después de actualizar, los pasos prácticos son:
- Ejecutar el build y resolver errores del compilador Rust
- Cerrar todas las etiquetas HTML abiertas
- Revisar visualmente espacios entre elementos inline
- Mover flags
experimentalestabilizados al nivel raíz de la config - Instalar
@astrojs/markdown-remarksi usas plugins remark/rehype - Renombrar
src/fetch.tssi ya lo tenías para otro uso - Actualizar importaciones de
getContainerRenderer()si usas el Container API - Migrar de
@astrojs/dbsi lo estabas usando
La migración es más mecánica que conceptual. El compilador Rust te va a señalar los problemas de HTML; el resto son cambios de imports y de estructura de config. Para proyectos medianos sin plugins remark personalizados, debería ser una tarde de trabajo.