Astro 7.2

Автор
Matthew Phillips

Вышел Astro 7.2! Главная новинка — экспериментальные инкрементальные статические сборки: Astro пропускает перегенерацию пререндеренных страниц, если их код и данные не изменились с прошлой сборки. В этом релизе также появилась возможность отключить поддержку сессий, фоновый режим для astro preview и более простой способ указать кастомный логгер.

Что нового в этом релизе:

Чтобы обновить существующий проект, используйте CLI @astrojs/upgrade. Или обновите вручную командой для вашего менеджера пакетов:

# Рекомендуется:
npx @astrojs/upgrade
# Вручную:
npm install astro@latest
pnpm upgrade astro --latest
yarn upgrade astro --latest

Experimental: incremental static builds

Astro часто используют для больших статических сайтов: документации, блогов и маркетинговых страниц на тысячи URL. На таких сайтах несколько динамических маршрутов вроде [...slug].astro обычно генерируют большую часть страниц — каждая рендерит запись из content collection. По мере роста контента растёт и время сборки, даже если в конкретной сборке изменилась лишь горстка страниц.

Astro 7 уже ускорил фазу бандлинга за счёт Rolldown и Markdown-пайплайна на Rust. Оставалась фаза генерации, где Astro рендерит каждый пререндеренный маршрут в HTML. До сих пор Astro перерендеривал каждую статическую страницу при каждой сборке, даже если страница не менялась. Инкрементальные статические сборки нацелены именно на эту фазу.

Включите флаг experimental.incrementalBuild:

astro.config.mjs
import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: {
incrementalBuild: true,
},
});

Маршрут подключается, возвращая cacheKey для каждого пути из getStaticPaths(). cacheKey должен меняться при изменении данных для рендера пути. Для content collections хорошо подходит entry.digest — он меняется при изменении содержимого записи:

src/pages/blog/[slug].astro
---
import { getCollection } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map((post) => ({
params: { slug: post.id },
props: { post },
cacheKey: post.digest,
}));
}
const { post } = Astro.props;
---
<h1>{post.data.title}</h1>

cacheKey покрывает данные. Код Astro обрабатывает сам: во время сборки хешируется полный граф модулей каждого маршрута — шаблон, layouts, компоненты, импортируемые ассеты и код пакетов. При изменении любого из этого хеш меняется и все пути маршрута перерендериваются. Страница переиспользуется только когда и хеш модулей, и её cacheKey совпадают с прошлой сборкой.

Пути без cacheKey всегда рендерятся — подключение маршрута явное, существующие проекты ведут себя как раньше, пока вы не включите опцию. Кеш хранится в cacheDir (по умолчанию node_modules/.astro/) рядом с кешами content layer и изображений — CI, который уже сохраняет эту директорию, может переиспользовать кеш между запусками.

Функция ранняя и экспериментальная — нам важна обратная связь с реальных сайтов. Полный дизайн и комментарии: RFC инкрементальных статических сборок.

Opt out of session support

При настроенном драйвере сессий Astro включает runtime сессий в SSR-вывод. Это нужно при использовании Astro.session, но проекты без сессий всё равно платили разбором этого кода при каждом cold start.

В Astro 7.2 добавлена опция session: false для полного отключения:

astro.config.mjs
import { defineConfig } from 'astro/config';
export default defineConfig({
session: false,
});

С session: false адаптеры Cloudflare, Netlify и Node не подключают драйвер сессий по умолчанию, runtime сессий убирается из бандла. Astro.session становится undefined — тип это уже допускал, проверки if (Astro.session) работают без новых ошибок. Подробнее: Отключение сессий.

Флаг не обязателен: Astro теперь вырезает runtime сессий из проектов без драйвера — session: false, отсутствие session в конфиге или объект session без драйвера. Проекты с настроенным драйвером не меняются.

Background mode for astro preview

Astro 7 добавил фоновый режим для astro dev, чтобы вы (или AI-агент) могли запустить dev-сервер, продолжить работу и управлять им отдельными командами. Astro 7.2 приносит то же для astro preview:

astro preview --background

Preview-сервер работает в фоне и пишет в отдельный лог-файл. Проверка и остановка:

astro preview status
astro preview logs
astro preview stop

astro dev и astro preview используют одну фоновую инфраструктуру — поведение согласовано, включая автоматический фоновый режим при работе агента.

Relative logger entrypoints

Astro 7.1 позволял настроить кастомный логгер через URL в logger.entrypoint. Astro 7.2 добавляет обычную относительную строку, как у других entrypoint-опций:

astro.config.mjs
import { defineConfig } from 'astro/config';
export default defineConfig({
logger: {
entrypoint: './src/custom-logger.js',
},
});

Форма с URL по-прежнему работает. Небольшое удобство — не нужен new URL(..., import.meta.url), если достаточно относительного пути.

Other improvements

Полный список исправлений и мелких улучшений — в полном changelog.

Community

Команда Astro Core:

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 7.2 кодом, документацией, ревью и тестированием, в том числе:

Adam Chalemian, Alisson Nunes, Anuj Raja, Araluma, Barry, Bjorn Lu, Daedalus, Danillo Estrela, David Pine, Dawid Gaweł, deepanshu88, Eldar Dadashov, emerson lopes, Felmon Fekadu, Gary Ritchie, HakuRan, Hashim Khan, i-am-KaleemSajjad, Jiwon Yoon, Junseong Park, Lazizbek Ergashev, Louis Escher, Melih Arık, Mochammad Farros Fatchur Roji, Nick Snyder, ocavue, Oliver Speir, Ondřej Úlehla, paul valladares, paulrudy, QVinto, Roman, Sebastian Beltran, Tarik, thelazylama, and uniboxx

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