Вышел Astro 6.3! Этот релиз приносит экспериментальный advanced routing — полный контроль над пайплайном запросов. Компонуйте отдельные обработчики, подключайте свой фреймворк вроде Hono и решайте, что выполняется и в каком порядке.
Что нового в этом релизе:
- Экспериментально: Advanced Routing
- Поддержка редиректов для внешних URL изображений
- Обработка SVG-изображений отключена по умолчанию
Чтобы обновить существующий проект, используйте CLI @astrojs/upgrade. Или обновите вручную:
# Рекомендуется:npx @astrojs/upgrade
# Вручную:npm install astro@latestpnpm upgrade astro --latestyarn upgrade astro --latestExperimental: Advanced Routing
Astro 6.3 представляет экспериментальную поддержку advanced routing: полный контроль над потоком запросов в приложении с first-class поддержкой фреймворков вроде Hono.
Приложение экспортирует паттерн fetch handler, используемый Cloudflare Workers, Deno, Bun и Hono. Проксируйте определённые пути на другой сервис, а остальное пусть обрабатывает Astro:
import { FetchState, astro } from 'astro/fetch';
export default { fetch(request: Request) { const state = new FetchState(request);
if (state.url.pathname.startsWith('/api')) { return fetch(new URL(state.url.pathname, 'https://api.example.com')); }
return astro(state); }};Обычно Astro выполняет middleware, actions, i18n и рендеринг в фиксированном порядке. Для большинства проектов это работает, но по мере роста приложения приходится обходить фреймворк, чтобы добавить auth, логирование, rate limiting или платформенную логику в нужном месте.
С advanced routing каждый шаг пайплайна доступен как отдельный обработчик. Добавляйте свою логику и решайте, что выполняется и в каком порядке:
import { Hono } from 'hono';import { logger } from 'hono/logger';import { actions, middleware, pages, i18n } from 'astro/hono';
const app = new Hono();
// Ваш middleware выполняется первым.app.use(logger());app.use(async (c, next) => { if (new URL(c.req.url).pathname.startsWith('/admin')) { return c.redirect('/login'); } return next();});
// Обработчики Astro в выбранном вами порядке.app.use(actions());app.use(middleware());app.use(pages());app.use(i18n());
export default app;Доступные обработчики: astro, trailingSlash, redirects, sessions, actions, middleware, pages, cache и i18n — экспортируются из astro/fetch и astro/hono.
Подробнее о включении и использовании см. документацию Experimental Advanced Routing.
Support redirects on external image URLs
При оптимизации удалённых изображений Astro раньше молча завершался с ошибкой, если URL изображения возвращал редирект. Это было проблемой для CDN и сервисов изображений, использующих редиректы для маршрутизации на нужный edge-узел или bucket. Изображения просто исчезали из сборки без объяснений.
Astro 6.3 теперь следует до 10 редиректам при загрузке удалённых изображений. Каждый URL в цепочке редиректов проверяется по image.remotePatterns и image.domains, поэтому вы контролируете, с каких хостов Astro может загружать. Если редирект ведёт на хост вне allowlist, Astro выбросит понятную ошибку вместо молчаливого игнорирования.
import { defineConfig } from "astro/config";
export default defineConfig({ image: { domains: ["example.com", "cdn.example.com"] }});---// Редирект на https://cdn.example.com/assets/image.png — работает!// Редирект на https://malicious.com/image.png — выбросит ошибку---<Image src="https://example.com/assets/image.png" width="1920" height="1080" alt="An example image." />Если вы доверяете всем HTTPS-хостам, можно разрешить их одним remote pattern:
import { defineConfig } from "astro/config";
export default defineConfig({ image: { remotePatterns: [{ protocol: 'https' }] }});SVG image processing disabled by default
Сервис изображений Astro на Sharp может растеризовать SVG в другие форматы вроде PNG или WebP. Однако под капотом это запускает librsvg, а SVG-файлы могут содержать встроенные скрипты и другой активный контент. Обработка недоверенных SVG таким образом — потенциальный риск безопасности.
Начиная с Astro 6.3, обработка SVG-изображений отключена по умолчанию. Если передать SVG-источник в пайплайн оптимизации изображений, Astro теперь выбросит понятную ошибку вместо молчаливой обработки.
Если вы доверяете SVG-источникам и хотите вернуть прежнее поведение, установите новую опцию image.dangerouslyProcessSVG:
import { defineConfig } from "astro/config";
export default defineConfig({ image: { dangerouslyProcessSVG: true, }});Это изменение не затрагивает импорт SVG как компонентов. Оно применяется только к растеризации SVG через пайплайн оптимизации изображений (например, конвертация SVG в PNG через <Image />).
Other improvements
- Новый метод
consume()дляAstroCookies: этот метод помечает cookies как потреблённые и возвращает значения заголовкаSet-Cookie. После потребления последующие вызовыset()будут логировать предупреждение, так как заголовки уже отправлены. Заменяет статический методAstroCookies.consume(cookies), который теперь устарел, но сохранён для обратной совместимости с существующими адаптерами.
Полный список исправлений и мелких улучшений см. в полном changelog.
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.
0x K., AceCodePt, Adam Chalemian, AitorMT, atsbob, Calvin Liang, Chan, done, Eveeifyeve, Felix Schneider, Felmon, fkatsuhiro, junetpoint, Junseong Park, knj, ld-web, Lee Freeman, Louis Escher, Luca Faccio, Maxim Slobodchikov, oandy-rgb, ocavue, Ossaid, Patrick Linnane, Quetzal Rivera, Rafael Yasuhide Sudo, randomguy-2650, Rayan Salhab, Rodrigo Santos, Roman, Sigma, Utpal Sen, vrabe, and web-dev0521


