Starlight 0.32

Автор
Chris Swithinbank

Вышел Starlight 0.32! Разберём новинки на пути к релизу v1.

🧘 Мы работаем над расширяемостью Starlight. Вот последние шаги к большей гибкости:

Чтобы обновить существующий сайт на Starlight, используйте автоматизированный CLI @astrojs/upgrade. Он обновит Starlight, Astro и другие интеграции:

npx @astrojs/upgrade

A new route data paradigm

Система переопределения компонентов Starlight позволяет настраивать внешний вид сайта своими компонентами. Это отлично для расширения UI, но со временем мы заметили: люди также используют overrides для изменения данных компонентов, сохраняя встроенные компоненты Starlight.

Чтобы упростить этот сценарий, v0.32 вводит новую систему route middleware с полным доступом к модели данных Starlight без переопределения компонентов. Особенно полезно для плагинов — меньше конфликтов, когда несколько плагинов переопределяют один компонент.

Как middleware Astro, route middleware вызывается при каждом рендере страницы Starlight и позволяет изменить данные до рендеринга. Мощный способ реализовать логику, недоступную только через конфигурацию.

В примере ниже мы делаем документацию веселее, добавляя восклицательные знаки к заголовку каждой страницы!!!

import { defineRouteMiddleware } from '@astrojs/starlight/route-data';
export const onRequest = defineRouteMiddleware((context) => {
// Get the content collection entry for this page.
const { entry } = context.locals.starlightRoute;
// Update the title to add exclamation marks.
entry.data.title = entry.data.title + '!!!';
});

Подробности — в руководстве «Route Data».

Breaking changes

Для лучшей поддержки route middleware мы изменили способ получения route data встроенными компонентами Starlight.

Раньше все шаблонные компоненты Starlight, включая пользовательские и плагиновые overrides, получали объект данных текущего маршрута через Astro.props. Теперь эти данные доступны как Astro.locals.starlightRoute.

Подробности миграции — в changelog Starlight.

New i18n APIs for plugins

Этот релиз даёт плагинам полный доступ к встроенной системе интернационализации Starlight.

Плагины теперь могут вызывать useTranslations() в хуке config:setup для доступа к любым UI-строкам Starlight. Это открывает локализованное логирование, переводы в Markdown-плагинах и многое другое.

Этот плагин логирует строку Starlight «Built with Starlight» и использует перевод для локали пользователя, если он доступен:

export default {
name: 'localizedPlugin',
hooks: {
'config:setup'({ useTranslations, logger }) {
// Detect the current user’s preferred locale.
const userLocale = Intl.DateTimeFormat().resolvedOptions().locale;
// Get a `t()` function for the locale.
const t = useTranslations(userLocale);
// Log the localized string.
logger.info(t('builtWithStarlight.label'));
},
},
};

Updated plugin hooks

В рамках доработки переводов в плагинах мы разделили старый хук setup на два: i18n:setup и config:setup. Хук setup устарел — плагины должны мигрировать на config:setup:

export default {
name: 'starlight-plugin',
hooks: {
'setup'({ config }) {
'config:setup'({ config }) {
// Your plugin configuration setup code
},
},
};

Плагинам с утилитой injectTranslations() нужно перенести её в отдельный хук i18n:setup:

export default {
name: 'plugin-with-translations',
hooks: {
'config:setup'({ injectTranslations }) {
'i18n:setup'({ injectTranslations }) {
injectTranslations({
en: { 'myPlugin.doThing': 'Do the thing' },
fr: { 'myPlugin.doThing': 'Faire le truc' },
});
},
},
};

Multisite search support

Starlight предоставляет поиск по сайту из коробки через Pagefind. Этот релиз открывает конфигурацию мультисайтового поиска Pagefind — можно искать по нескольким сайтам.

Например, если основной сайт на example.com проиндексирован Pagefind, а Starlight развёрнут на поддомене docs.example.com, результаты поиска с основного сайта можно показать в документации через опцию mergeIndex:

astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
export default defineConfig({
site: 'https://docs.example.com/',
integrations: [
starlight({
title: 'Docs with multisite search',
pagefind: {
mergeIndex: [{ bundlePath: 'https://example.com/pagefind' }],
},
}),
],
});

Подробности конфигурации — в руководстве Pagefind «Searching multiple sites».

Bug fixes and more

Как всегда, с релиза v0.31 мы исправляли ошибки. Подробности и руководство по миграции — в changelog Starlight.

Thanks

Спасибо всем, кто внёс вклад в этот релиз PR и ревью: HiDeoo, Emilien Guilmineau, trueberryless, Sarah Rainsberger, Lorenzo Lewis и Yan Thomas.

Ждём, что вы построите со Starlight 0.32! Вопросы, комментарии или просто «привет» — в Astro Discord.