Вышел Astro 7.1! Этот релиз — о большем контроле: несколько dev-серверов параллельно с флагом --ignore-lock и настройка URL пагинации под ваш деплой через функцию format в paginate(). Также новые CSP-директивы для скриптов и стилей, снижение памяти для больших content collections и экспериментальное разбиение хранилища контента.
Что нового в этом релизе:
- Тонкий CSP для inline-скриптов и стилей
- Полный контроль над URL пагинации
- Несколько dev-серверов одновременно
- Меньше памяти для больших content collections
- Экспериментальное хранилище контента
- Сообщество
Чтобы обновить существующий проект, используйте CLI @astrojs/upgrade. Или обновите вручную:
# Рекомендуется:npx @astrojs/upgrade
# Вручную:npm install astro@latestpnpm upgrade astro --latestyarn upgrade astro --latestFiner-grained CSP control for inline scripts and styles
В Astro CSP теперь встроенная поддержка директив:
Это специализированные версии script-src и style-src, которые решают задачи, недоступные раньше.
Например, можно разрешить inline-стили как unsafe, не ослабляя безопасность внешних CSS:
import { defineConfig } from "astro/config"
export default defineConfig({ security: { csp: { styleDirective: [{ resource: "'unsafe-line'", kind: "attribute" }] } }})Подробнее о конфигурации и API: runtime docs и configuration docs.
Full control over pagination URLs
URL пагинации от paginate() не всегда совпадали с реальным деплоем. Например, при статических .html (build: { format: 'file' }) на хосте без rewrite next/prev/first/last возвращали пути вроде /blog/2, которым не соответствует файл на диске.
Теперь полный контроль через функцию format в paginate() — она получает сгенерированный URL и может его преобразовать, например добавить .html:
---export async function getStaticPaths({ paginate }) { // Load your data with fetch(), getCollection(), etc. const response = await fetch(`https://pokeapi.co/api/v2/pokemon?limit=150`); const result = await response.json(); const allPokemon = result.results;
// Return a paginated collection of paths for all items return paginate(allPokemon, { pageSize: 10, format: (url) => `${url}.html` });}
const { page } = Astro.props;---Run multiple dev servers at once
Иногда нужен второй dev-сервер, не останавливая первый — например, для отладки с verbose-логами, сохраняя состояние основного сервера.
Astro 7 ввёл lockfile, чтобы AI-агенты не запускали дубликаты. Побочный эффект: astro dev при уже работающем экземпляре выдавал ошибку, даже если вы запускали второй намеренно.
Astro 7.1 возвращает этот сценарий с флагом --ignore-lock:
astro dev --ignore-lockЭкземпляр с --ignore-lock независим — astro dev stop, status и logs его не видят. Для быстрого временного второго сервера, а не долгосрочного управления.
Lower memory usage for large content collections
Загрузчик glob() рендерит Markdown при синхронизации и кеширует HTML, чтобы не повторять работу при следующей сборке. Для большинства сайтов это выгодный обмен: синхронизация чуть дороже, пересборки быстрее.
По мере роста коллекции или объёма рендера кеш всего HTML в памяти при синхронизации накапливается.
Теперь можно отключить eager rendering для отдельных коллекций через deferRender:
import { defineCollection } from 'astro:content';import { glob } from 'astro/loaders';
const docs = defineCollection({ loader: glob({ pattern: '**/*.md', base: 'src/content/docs', deferRender: true }),});С deferRender: true записи сохраняются без рендера при синхронизации. Рендер по требованию, когда страница его запрашивает — как у .mdx. Вы теряете кеш HTML между сборками, но для больших коллекций это разумный обмен на меньшую память при sync.
Logger improvements
Кастомные логгеры настраиваются единообразно с другими API (шрифты, сессии). URL позволяет переопределить конфигурацию в runtime или использовать возможности Vite:
import { defineConfig } from "astro/config"export default defineConfig({ logger: { entrypoint: new URL("./src/custom-logger.js", import.meta.url) }})Также доступен тип AstroRuntimeLogger для файлов с runtime-логгером Astro:
import type { AstroRuntimeLogger } from "astro";
export function handleRequest(req: Request, astroLogger: AstroRuntimeLogger) { astroLogger.info("Incoming request");}Experimental content storage
Раньше content collections сохранялись в один десериализованный файл .astro/data-store.json. На больших коллекциях это проблема — некоторые платформы ограничивают размер файлов.
Экспериментальный флаг experimental.collectionStorage разбивает данные на несколько файлов:
import { defineConfig } from "astro/config"
export default defineConfig({ experimental: { collectionStorage: "chunked" }})При "chunked" Astro делит данные каждые 10 МБ.
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.1 кодом, документацией, ревью и тестированием, в том числе:
Adam Chalemian, Alberto Schiabel, Alexander Kireyev, Andreas Deininger, Ari4ka, artboy, Bugo, caixetad-cyber, cevdet, Coding in Public, Cristhian F, Cristofer Hippleheuser, David Dal Busco, deniz, Ethan Hawksley, Felix Schneider, Felmon, fkatsuhiro, Franco Kaddour, Jan Kubica, Junseong Park, Keisuke Hayashi, knj, ld-web, Louis Escher, LRubin, marcos-corrochano, Martin Trapp, Nico D., ocavue, Prayaksh Upadhyay, randomguy-2650, Roman, Ronit Sonawane, royy92, Shinya Fujino, Simon, Thomas Bonnet, tombennet, uniboxx, Vladyslav Shevchenko, WavyCat, and 芋
Надеемся, Astro 7.1 вам понравится. Вопросы и отзывы — в Discord, на GitHub или в Bluesky, Twitter и Mastodon.
