Astro 5.6 trae soporte first-class de astro:env y sessions experimentales a Cloudflare, y da más control sobre el prefetching.
☁️ Vuela a través de las nubes con estas nuevas características en Astro:
astro:envglobal en Cloudflare- Sessions experimentales en Cloudflare
- Nueva opción de prefetch eagerness
- Opción de fetch personalizado para páginas de error prerenderizadas
- Nuevo método
load()para sessions experimentales - Validación de configuración mejorada
- Breaking changes en la API experimental de SVG
Para actualizar un proyecto existente, usa la herramienta CLI automatizada @astrojs/upgrade. Alternativamente, actualiza manualmente ejecutando el comando de actualización para tu gestor de paquetes:
# Recommended:npx @astrojs/upgrade
# Manual:npm install astro@latestpnpm upgrade astro --latestyarn upgrade astro --latestastro:env global en Cloudflare
Desde Astro 5, has podido acceder a variables de entorno type-safe usando astro:env. Sin embargo, las variables de entorno en Cloudflare solo eran accesibles dentro de una petición — limitando cuándo y dónde podías usarlas. Por ejemplo, si querías usar una instancia compartida de un API client, no podías usar variables de entorno si la instanciabas fuera de una petición. Esto podía ser confuso y era diferente de nuestros otros adaptadores.
Astro 5.6 elimina esta restricción, lo que significa que ahora puedes acceder a tus variables de entorno globalmente en todo tu código del servidor y pone al adaptador de Cloudflare en línea con los otros adaptadores oficiales. Esto es posible gracias a mejoras en Cloudflare Workers que ahora están implementadas en Astro.
import { defineMiddleware } from 'astro:middleware';import { API_URL } from 'astro:env/server';import { createClient } from './client.js';
// Astro 5.5: undefined// Astro 5.6: stringconst client = createClient(API_URL);
export const onRequest = defineMiddleware((ctx, next) => { ctx.locals.client = client; return next();});Esta mejora crea una experiencia de desarrollador más consistente en todos los entornos de servidor de Astro, y significa que no necesitas preocuparte por averiguar qué cuenta como request scope o global scope.
Sessions experimentales en Cloudflare
La Astro sessions API es una característica experimental que te permite almacenar fácilmente datos de usuario entre peticiones. Usa backends plugables para almacenamiento, que se configuran automáticamente al usar los adaptadores de Node o Netlify.
Con Astro 5.6, hemos llevado esa integración simplificada a Cloudflare también. Astro ahora configura automáticamente el almacenamiento de Cloudflare KV cuando estás usando sessions con el adaptador de Cloudflare. Esto significa que tus datos de session pueden almacenarse y accederse de forma fiable a través de la red global de Cloudflare con configuración mínima.
Empezar son tres pasos:
-
Crea un KV namespace usando el CLI de Wrangler:
npx wrangler kv namespace create "SESSION" -
Declara el KV namespace en tu configuración de Wrangler:
wrangler.json {"kv_namespaces": [{"binding": "SESSION","id": "<SESSION_ID>"}]} -
Habilita las sessions experimentales en tu configuración de Astro:
astro.config.mjs export default defineConfig({adapter: cloudflare(),experimental: {sessions: true,},});
Luego puedes usar sessions en tu código del servidor:
---export const prerender = false;const cart = await Astro.session.get('cart');---
<a href="/checkout">🛒 {cart?.length ?? 0} items</a>Para más información, consulta la documentación de sessions experimentales.
Nueva opción de Prefetch Eagerness
Encuentra el equilibrio perfecto entre velocidad y uso de recursos con los nuevos controles de prefetch eagerness de Astro. Con el flag experimental clientPrerender habilitado, puedes usar la opción eagerness en prefetch() para sugerirle al browser con qué eagerness debería hacer prefetch/prerender de los destinos de los enlaces.
Esta nueva opción, que se alinea con la Speculation Rules API del browser, te da control fino sobre con qué agresividad el browser debería hacer prefetch o prerender de tus enlaces:
------<script>// Control prefetching eagernessimport { prefetch } from 'astro:prefetch';
// Let's be strategic about this resource-intensive pageprefetch('/data-heavy-dashboard', { eagerness: 'conservative' });
// This page is critical to the user journey, load it ASAP!prefetch('/product-details'); // defaults to `{ eagerness: 'immediate' }`
// For most pages, a balanced approach works bestprefetch('/about', { eagerness: 'moderate' });</script>Puedes elegir entre tres niveles de eagerness:
'immediate': Prefetch inmediatamente, si los límites de recursos lo permiten'eager': Es probable que el enlace se necesite, así que obtenerlo lo antes posible'moderate': Dejar que el browser decida cuándo hacer prefetch'conservative': Solo hacer prefetch cuando sea muy probable que se necesite
Esta característica es particularmente valiosa cuando se trata de grandes números de enlaces donde de otro modo podrías encontrarte con límites del browser para proteger contra exceso de especulación.
¡Gracias al miembro de la comunidad Marocco2 por contribuir esta característica!
Opción de Fetch Personalizado para Páginas de Error Prerenderizadas
Cuando una página renderizada bajo demanda necesita mostrar un error, tu adaptador puede necesitar obtener una página de error prerenderizada desde un lugar distinto a tu servidor. Actualmente, esto se hace realizando una petición usando la implementación fetch por defecto, que puede no ser adecuada para todos los casos de uso. Por ejemplo, la página puede servirse desde una ubicación que no puede llamarse recursivamente, o la página puede estar almacenada en otro lugar.
Astro 5.6 añade una nueva opción opcional prerenderedErrorPageFetch en la Adapter API para permitir a los adaptadores proporcionar implementaciones personalizadas para obtener páginas de error prerenderizadas.
El siguiente ejemplo proporciona un fetch personalizado para 500.html y 404.html, leyéndolos desde disco en lugar de realizar una llamada HTTP:
return app.render(request, { prerenderedErrorPageFetch: async (url: string): Promise<Response> => { if (url.includes("/500")) { const content = await fs.promises.readFile("500.html", "utf-8"); return new Response(content, { status: 500, headers: { "Content-Type": "text/html" }, }); } const content = await fs.promises.readFile("404.html", "utf-8"); return new Response(content, { status: 404, headers: { "Content-Type": "text/html" }, });});Si no se proporciona ningún valor, Astro usará fetch, y hará una petición a /500 o /404 según corresponda. Este es el mismo comportamiento que en versiones anteriores de Astro.
Lee más sobre esta característica en la referencia de la Adapter API.
¡Gracias a Yury Michurin por contribuir esta característica!
Nuevo método load() para sessions experimentales
Al usar la Sessions API experimental, normalmente no necesitas preocuparte por gestionar el session ID y las cookies: Astro automáticamente lee las cookies del usuario y carga la session correcta cuando se necesita. Sin embargo, a veces necesitas más control sobre qué session cargar.
El nuevo método load() te permite cargar manualmente una session por ID. Esto es útil si estás manejando el session ID tú mismo, o si quieres rastrear una session sin usar cookies. Por ejemplo, podrías querer restaurar una session de un usuario con sesión iniciada en otro dispositivo, o trabajar con un API endpoint que no usa cookies.
import type { APIRoute } from 'astro';
export const GET: APIRoute = async ({ session, request }) => { // Load the session from a header instead of cookies const sessionId = request.headers.get('x-session-id'); await session.load(sessionId); const cart = await session.get('cart'); return Response.json({ cart });};Si no existe una session con ese ID, se creará una nueva. Esto te permite generar un session ID en el cliente si es necesario.
Para más información, consulta la documentación de sessions experimentales.
Validación de Configuración Mejorada
Astro ahora valida tu configuración después de que cada integración se ejecuta, haciendo más fácil detectar problemas temprano y localizar la fuente de cualquier problema. Esto es particularmente útil cuando se usan múltiples integraciones, ya que ayuda a asegurar que todas sean compatibles entre sí y con tu proyecto de Astro.
Breaking changes en la API experimental de SVG
El RFC experimental de SVG ha estado bajo fuerte discusión, y por eso ¡agradecemos a todos por participar! Como resultado de las discusiones, decidimos eliminar temporalmente ciertas características. ¡Así es como va a veces con una API experimental!
¡Pero esto no significa que hayan desaparecido para siempre! Eliminarlos ahora en esta etapa temprana nos da tiempo para tener discusiones separadas y volver a construir características basándonos en tu feedback, encontrando el equilibrio adecuado entre DX, mejores prácticas de accesibilidad, y defaults sensatos.
Estos items ya no están disponibles y deben eliminarse de tu código:
- The
titleprop has been removed until we can settle on the correct balance between developer experience and accessibility. Please replace anytitleprops on your components witharia-label:<Logo title="My Company Logo" /><Logo aria-label="My Company Logo" /> - Sprite mode has been temporarily removed while we consider a new implementation that addresses how this feature was being used in practice. This means that there are no longer multiple
modeoptions, and all SVGs will be inline. All instances ofmodemust be removed from your project as you can no longer control a mode:<Logo mode="inline" /><Logo /> // Always inlineimport { defineConfig } from 'astro'export default defineConfig({experimental: {svg: {mode: 'sprite'},svg: true}}); - The default
roleis no longer applied due to developer feedback. Please add the appropriateroleon each component individually as needed:<Logo /><Logo role="img" /> // To keep the role that was previously applied by default - The
sizeprop has been removed to better work in combination withviewBoxand additional styles/attributes. Please replacesizewith explicitwidthandheightattributes:<Logo size={64} /><Logo width={64} height={64} />
Correcciones de bugs
Como siempre, hemos estado trabajando duro en corregir problemas desde el lanzamiento 5.5. Consulta el changelog para todos los detalles.
Comunidad
El core team de Astro es:
Ben Holmes , Caleb Jasik , Chris Swithinbank , Emanuele Stoppa , Erika , Florian Lefebvre , Fuzzy , HiDeoo , Luiz Ferraz , Matt Kane , Matthew Phillips , Nate Moore , Reuben Tier , Sarah Rainsberger , and Yan Thomas .
Gracias a todos los demás contribuidores que ayudaron a hacer posible Astro 5.6, incluyendo Edward Brunetiere, Martin Trapp, Vardhaman Bhandari, Marocco2, Yury Michurin y Michael Stramel.
¡Esperamos ver qué construís con Astro 5.6! Si tienes preguntas, comentarios, o solo quieres decir hola, pásate por el Astro Discord.


