Вышел Astro 7.2! Главная новинка — экспериментальные инкрементальные статические сборки: Astro пропускает перегенерацию пререндеренных страниц, если их код и данные не изменились с прошлой сборки. В этом релизе также появилась возможность отключить поддержку сессий, фоновый режим для astro preview и более простой способ указать кастомный логгер.
Что нового в этом релизе:
- Экспериментально: инкрементальные статические сборки
- Отказ от поддержки сессий
- Фоновый режим для astro preview
- Относительные entrypoints логгера
- Сообщество
Чтобы обновить существующий проект, используйте CLI @astrojs/upgrade. Или обновите вручную командой для вашего менеджера пакетов:
# Рекомендуется:npx @astrojs/upgrade
# Вручную:npm install astro@latestpnpm upgrade astro --latestyarn upgrade astro --latestExperimental: incremental static builds
Astro часто используют для больших статических сайтов: документации, блогов и маркетинговых страниц на тысячи URL. На таких сайтах несколько динамических маршрутов вроде [...slug].astro обычно генерируют большую часть страниц — каждая рендерит запись из content collection. По мере роста контента растёт и время сборки, даже если в конкретной сборке изменилась лишь горстка страниц.
Astro 7 уже ускорил фазу бандлинга за счёт Rolldown и Markdown-пайплайна на Rust. Оставалась фаза генерации, где Astro рендерит каждый пререндеренный маршрут в HTML. До сих пор Astro перерендеривал каждую статическую страницу при каждой сборке, даже если страница не менялась. Инкрементальные статические сборки нацелены именно на эту фазу.
Включите флаг experimental.incrementalBuild:
import { defineConfig } from 'astro/config';
export default defineConfig({ experimental: { incrementalBuild: true, },});Маршрут подключается, возвращая cacheKey для каждого пути из getStaticPaths(). cacheKey должен меняться при изменении данных для рендера пути. Для content collections хорошо подходит entry.digest — он меняется при изменении содержимого записи:
---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 для полного отключения:
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 --backgroundPreview-сервер работает в фоне и пишет в отдельный лог-файл. Проверка и остановка:
astro preview statusastro preview logsastro preview stopastro dev и astro preview используют одну фоновую инфраструктуру — поведение согласовано, включая автоматический фоновый режим при работе агента.
Relative logger entrypoints
Astro 7.1 позволял настроить кастомный логгер через URL в logger.entrypoint. Astro 7.2 добавляет обычную относительную строку, как у других entrypoint-опций:
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.


