Astro 6.3

Автор
Matthew Phillips

Вышел Astro 6.3! Этот релиз приносит экспериментальный advanced routing — полный контроль над пайплайном запросов. Компонуйте отдельные обработчики, подключайте свой фреймворк вроде Hono и решайте, что выполняется и в каком порядке.

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

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

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

Experimental: Advanced Routing

Astro 6.3 представляет экспериментальную поддержку advanced routing: полный контроль над потоком запросов в приложении с first-class поддержкой фреймворков вроде Hono.

Приложение экспортирует паттерн fetch handler, используемый Cloudflare Workers, Deno, Bun и Hono. Проксируйте определённые пути на другой сервис, а остальное пусть обрабатывает Astro:

src/app.ts
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 каждый шаг пайплайна доступен как отдельный обработчик. Добавляйте свою логику и решайте, что выполняется и в каком порядке:

src/app.ts
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 выбросит понятную ошибку вместо молчаливого игнорирования.

astro.config.mjs
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:

astro.config.mjs
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:

astro.config.mjs
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