Astro 6.0

Автор
Matthew Phillips
Emanuele Stoppa
Florian Lefebvre
Matt Kane

Вышел Astro 6! Широкий набор возможностей: встроенный Fonts API, Content Security Policy API и Live Content Collections для внешнего контента через единый content layer Astro.

Параллельно — крупный рефакторинг dev-сервера и большей части build pipeline. Благодаря Vite Environment API Astro запускает production runtime в development — меньше сюрпризов «works in dev, breaks in prod», особенно на Cloudflare Workers, Bun и Deno.

Главные новинки релиза:

И ещё кое-что: Astro 6 включает экспериментальный Rust-компилятор — преемник Go-компилятора .astro. Рано, но результаты впечатляют (иногда надёжнее Go-компилятора). Будем инвестировать в Rust-инструменты в линейке 6.x для производительности и масштабируемости больших сайтов.

Upgrade now

Чтобы обновить существующий проект до Astro 6, используйте CLI @astrojs/upgrade:

# Recommended:
npx @astrojs/upgrade
# Manual:
npm install astro@latest

Для новых проектов:

npm create astro@latest

A redesigned astro dev

Dev-сервер Astro изначально строился для Node.js — для большинства это работало отлично. Но non-Node runtime (Cloudflare Workers, Bun, Deno) сделали это слепым пятном: нельзя было запустить production runtime в development — локальное поведение не всегда совпадало с деплоем.

Astro 6 меняет это. С Vite Environment API astro dev запускает кастомный runtime в development. Dev-сервер и build pipeline разделяют code paths — единый опыт с production.

Для Cloudflare особенно болезненно: dev на Node.js, production на workerd. Баги после деплоя. Bindings KV, D1, R2, Durable Objects недоступны в dev.

Перестроенный @astrojs/cloudflare запускает workerd на всех этапах: development, prerendering, production. Разработка на cloudflare:workers с полным доступом к bindings локально. Без simulation layers и Astro.locals.runtime. Работа выросла из официального партнёрства с Cloudflare.

Built-in Fonts API

Кастомные шрифты на каждом сайте, но настроить правильно сложно: производительность, приватность, десятки мелких решений.

Astro 6 добавляет встроенный Fonts API. Конфигурация из локальных файлов или провайдеров (Google, Fontsource) — Astro скачивает и кеширует, генерирует fallback, добавляет preload — быстрый сайт и приватность пользователей.

astro.config.mjs
import { defineConfig, fontProviders } from 'astro/config';
export default defineConfig({
fonts: [
{
name: 'Roboto',
cssVariable: '--font-roboto',
provider: fontProviders.fontsource(),
},
],
});

<Font /> и стили где нужно:

src/components/Head.astro
---
import { Font } from 'astro:assets';
---
<Font cssVariable="--font-roboto" preload />
<style is:global>
body {
font-family: var(--font-roboto);
}
</style>

Astro скачивает файлы, генерирует fallback, добавляет preload hints — best-practice без ручной настройки.

fonts guide.

Live Content Collections

Live Content Collections стабильны в Astro 6 — загрузка контента при запросе в едином content layer.

Content Collections с Astro 2.0, но всегда требовали rebuild при изменении контента. Live collections загружают при запросе теми же API без rebuild. CMS, API, редакционные обновления — мгновенно.

defineLiveCollection() в src/live.config.ts:

src/live.config.ts
import { defineLiveCollection } from 'astro:content';
import { z } from 'astro/zod';
import { cmsLoader } from './loaders/my-cms';
const updates = defineLiveCollection({
loader: cmsLoader({ apiKey: process.env.MY_API_KEY }),
schema: z.object({
slug: z.string(),
title: z.string(),
excerpt: z.string(),
publishedAt: z.coerce.date(),
}),
});
export const collections = { updates };

Запрос с обработкой ошибок:

---
import { getLiveEntry } from 'astro:content';
const { entry: update, error } = await getLiveEntry(
'updates',
Astro.params.slug,
);
if (error || !update) {
return Astro.redirect('/404');
}
---
<h1>{update.data.title}</h1>
<p>{update.data.excerpt}</p>
<time>{update.data.publishedAt.toDateString()}</time>

Те же API, что build-time collections. Real-time freshness — live collection; иначе build-time для производительности. Оба в одном проекте.

content collections guide.

Content Security Policy

CSP API стабилен в Astro 6. Astro — один из первых meta-frameworks со встроенным CSP для static и dynamic страниц, server и serverless.

CSP в Astro обманчиво сложен: нужно знать каждый script и style для хеширования. Static — на build time; dynamic — hashing на лету и headers в runtime. Единый API — почему другие meta-frameworks этого не делали.

Включите CSP одним флагом:

import { defineConfig } from 'astro/config';
export default defineConfig({
security: { csp: true },
experimental: { csp: true },
});

Для большего контроля — полный API:

import { defineConfig } from 'astro/config';
export default defineConfig({
security: {
csp: {
algorithm: 'SHA-512',
directives: [
"default-src 'self'",
"img-src 'self' https://images.cdn.example.com",
],
styleDirective: { hashes: ['sha384-styleHash'] },
scriptDirective: { hashes: ['sha384-scriptHash'] },
},
},
});

CSP работает с responsive images — стили через CSS classes и data-*, хешируются автоматически.

security configuration reference.

Upgraded Packages

  • Vite 7 во всех пакетах Astro и @astrojs. Кастомный Vite — обновите до v7+.
  • Shiki 4 для <Code /> и Markdown/MDX blocks.
  • Zod 4 для схем — импорт из astro/zod.

Node 22+ обязателен; Node 18 и 20 сняты.

upgrade guide.

Experimental: Rust Compiler

Экспериментальный Rust-компилятор — преемник Go .astro compiler.

От AI-эксперимента к «почему не default?» — быстрее, лучше диагностика, иногда надёжнее Go.

npm install @astrojs/compiler-rs
import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: {
rustCompiler: true,
},
});

Rust compiler docs.

Experimental: Queued Rendering

Новая стратегия рендеринга — до 2x быстрее в ранних бенчмарках.

Сейчас рекурсивный рендеринг. Queued rendering — два прохода: очередь, затем рендер. Быстрее и эффективнее по памяти; планируем default в Astro v7.

import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: {
queuedRendering: {
enabled: true,
},
},
});

queued rendering docs.

Experimental: Route Caching

Платформо-независимое кеширование SSR-ответов по web standard cache semantics.

Каждый хост по-своему — route caching даёт единый API из кода приложения.

import { defineConfig } from 'astro/config';
import { memoryCache } from 'astro/config';
export default defineConfig({
experimental: {
cache: { provider: memoryCache() },
},
});

Astro.cache (или context.cache) per-request:

---
Astro.cache.set({
maxAge: 120, // Cache for 2 minutes
swr: 60, // Serve stale for 1 minute while revalidating
tags: ['home'], // Tag for targeted invalidation
});
---
<html><body>Cached page</body></html>

Интеграция с live content collections — автоматическая инвалидация при изменении контента:

import { getEntry } from 'astro:content';
const product = await getEntry('products', Astro.params.slug);
Astro.cache.set(product);

In-memory provider для Node.js; провайдеры для всех платформ скоро. Community providers для CDN, Redis — Discord.

route caching docs.

Community

Команда Astro:

Alexander Niebuhr, Armand Philippot, Chris Swithinbank, Emanuele Stoppa, Erika, Florian Lefebvre, Fred Schott, HiDeoo, Luiz Ferraz, Matt Kane, Matthew Phillips, Reuben Tier, Sarah Rainsberger, and Yan Thomas.

Особая благодарность всем, кто внёс вклад в Astro 6 кодом, документацией, ревью и тестированием, включая:

0xRozier, Abdelrahman Abdelfattah, Adam Matthiesen, Adrian, ADTC, Ahmad Yasser, Alasdair McLeay, Alejandro Romano, Alex, Alex Launi, Andreas Deininger, Andrey, Andrey Gurtovoy, andy, Antony Faris, Ariel K, Aron Homberg, Ash Hitchcock, Azat S., Bartosz Kapciak, Brian Dukes, btea, Cameron Pak, Cameron Smith, cid, CyberFlame, Danilo Velasquez Urrutia, Darknab, Deleted user, Deveesh Shetty, Dom Christie, Dominik G., Dream, Drew Powers, Edgar, Edward Brunetiere, ellielok, Eric Grill, Eryk Baran, everdimension, fabon, Felix Schneider, fkatsuhiro, Fred K. Schott, Fredrik Norlin, Gokhan Kurt, Henri Fournier, Hunter Bertoson, Ibim Braide, Jack Platten, Jack Shelton, James Garbutt, James Opstad, Jeffrey Yasskin, jmgala, joel hansson, Johan Rouve, John L. Armstrong IV, John Mortlock, Jonas Geiler, Josh Soref, Julián Colombo, Julian Wolf, Julien Cayzac, Junseong Park, Justin Francos, kato takeshi, Kedar Vartak, Kendell, Kevin Brown, knj, Koos Looijesteijn, Kristijan, KTrain, ktym4a, Lieke, Light, Louis Escher, Luky Setiawan, Mads Erik Forberg, Manuel Meister, Mark Ignacio, Martin Trapp, Matheus Baroni, Matthew Conto, Matthew Justice, Maurici Abad Gutierrez, Mehdi El Fadil, Michael Payne, Michael Stramel, Mike Pagé, MkDev11, Morten Oftedal, nemu, Ntale Swamadu, Ocavue (Jiajin Wen), Olcan EBREM, Oliver Speir, Olivier Dusabimana, Patrick Arlt, Phaneendra, Philippe Serhal, Raanelom, Rafael Yasuhide Sudo, Rahul Dogra, randomguy-2650, Razon Yang, Robin Bühler, Roman, Roman Hauksson-Neill, Roman Kholiavko, sanchezmaldonadojesusadrian14-coder, Sebastian Beltran, Shinya Fujino, Simen Sagholen Førrisdal, Stel Clementine, Steven, Tanishq Manuja, Tee Ming, Timo Behrmann, Tony Narlock, Umut Keltek, Varun Chawla, Victor Berchet, Vladyslav Shevchenko, Volpeon, Willow (GHOST), Xidorn Quan, Yagiz Nizipli, yy, 五月七日千緒, and

Надеемся, вам понравится Astro 6. Вопросы и отзывы — Discord, GitHub, Bluesky, Twitter и Mastodon.