Plugins Referenz
Starlight-Plugins können die Konfiguration, die Benutzeroberfläche und das Verhalten von Starlight anpassen und sind gleichzeitig einfach weiterzugeben und wiederzuverwenden. Diese Referenzseite dokumentiert die API, auf die Plugins Zugriff haben.
Erfahre mehr über die Verwendung eines Starlight-Plugins in der Konfigurationsreferenz oder besuche das Plugins Schaufenster, um eine Liste der verfügbaren Plugins zu sehen.
API-Schnellreferenz
Abschnitt betitelt „API-Schnellreferenz“Ein Starlight-Plugin hat die folgende Form. Siehe unten für Details zu den verschiedenen Eigenschaften und Hook-Parametern.
interface StarlightPlugin { name: string; hooks: { 'i18n:setup'?: (options: { injectTranslations: ( translations: Record<string, Record<string, string>> ) => void; }) => void | Promise<void>; 'config:setup': (options: { config: StarlightUserConfig; updateConfig: (newConfig: StarlightUserConfig) => void; addIntegration: (integration: AstroIntegration) => void; addRouteMiddleware: (config: { entrypoint: string; order?: 'pre' | 'post' | 'default' }) => void; astroConfig: AstroConfig; command: 'dev' | 'build' | 'preview'; isRestart: boolean; logger: AstroIntegrationLogger; useTranslations: (lang: string) => I18nT; absolutePathToLang: (path: string) => string; }) => void | Promise<void>; };}
Typ: string
Ein Plugin muss einen eindeutigen Namen angeben, der es beschreibt. Der Name wird verwendet, wenn Logging-Nachrichten sich auf dieses Plugin bezieht und kann von anderen Plugins verwendet werden, um das Vorhandensein dieses Plugins zu erkennen.
Hooks sind Funktionen, die Starlight aufruft, um Plugin-Code zu bestimmten Zeiten auszuführen.
Um den Typ der Argumente eines Hooks zu erhalten, verwende den Utility-Typ HookParameters
und gib den Namen des Hooks an.
Im folgenden Beispiel wird der Parameter options
so eingegeben, dass er mit den Argumenten übereinstimmt, die an den Hook config:setup
übergeben werden:
import type { HookParameters } from '@astrojs/starlight/types';
function configSetup(options: HookParameters['config:setup']) { options.useTranslations('de');}
i18n:setup
Abschnitt betitelt „i18n:setup“Die Funktion zum Einrichten der Plugin-Internationalisierung wird beim Initialisieren von Starlight aufgerufen.
Der i18n:setup
-Hook kann verwendet werden, um Übersetzungsstrings zu injizieren, damit ein Plugin verschiedene Locales unterstützen kann.
Diese Übersetzungen werden über useTranslations()
im config:setup
-Hook und in UI-Komponenten über Astro.locals.t()
verfügbar sein.
Der i18n:setup
-Hook wird mit den folgenden Optionen aufgerufen:
injectTranslations
Abschnitt betitelt „injectTranslations“Typ: (translations: Record<string, Record<string, string>>) => void
Eine Callback-Funktion zum Hinzufügen oder Aktualisieren von Übersetzungsstrings, die in Starlights Lokalisierungs-APIs verwendet werden.
Im folgenden Beispiel injiziert ein Plugin Übersetzungen für einen benutzerdefinierten UI-String mit dem Namen myPlugin.doThing
für die Sprachumgebungen en
und fr
:
export default { name: 'plugin-use-translations', hooks: { 'i18n:setup'({ injectTranslations }) { injectTranslations({ en: { 'myPlugin.doThing': 'Do the thing', }, fr: { 'myPlugin.doThing': 'Faire le truc', }, }); }, },};
Um die injizierten Übersetzungen in der Benutzeroberfläche deines Plugins zu verwenden, befolge die „UI-Übersetzungen verwenden“-Anleitung.
Wenn du UI-Strings im Zusammenhang mit dem config:setup
-Hook deines Plugins verwenden musst, kannst du den useTranslations()
-Callback verwenden.
Die Typen für die injizierten Übersetzungsstrings eines Plugins werden im Projekt des Benutzers automatisch generiert, sind aber bei der Arbeit in der Codebasis deines Plugins noch nicht verfügbar.
Um das Objekt locals.t
im Kontext deines Plugins zu typisieren, deklariere die folgenden globalen Namespaces in einer TypeScript-Deklarationsdatei:
declare namespace App { type StarlightLocals = import('@astrojs/starlight').StarlightLocals; // Definiere das Objekt `locals.t` im Kontext eines Plugins. interface Locals extends StarlightLocals {}}
declare namespace StarlightApp { // Definiere die zusätzlichen Plugin-Übersetzungen in der `I18n`-Schnittstelle. interface I18n { 'myPlugin.doThing': string; }}
Du kannst die Typen für die Schnittstelle StarlightApp.I18n
auch aus einer Quelldatei ableiten, wenn du ein Objekt hast, das deine Übersetzungen enthält.
Nehmen wir zum Beispiel die folgende Quelldatei:
export const UIStrings = { en: { 'myPlugin.doThing': 'Do the thing' }, fr: { 'myPlugin.doThing': 'Faire le truc' },};
Die folgende Deklaration würde die Typen aus den englischen Schlüsseln in der Quelldatei ableiten:
declare namespace StarlightApp { type UIStrings = typeof import('./ui-strings').UIStrings.en; interface I18n extends UIStrings {}}
config:setup
Abschnitt betitelt „config:setup“Plugin-Konfiguration-Setup-Funktion, die aufgerufen wird, wenn Starlight initialisiert wird (während des astro:config:setup
Integrations-Hooks).
Der config:setup
-Hook kann verwendet werden, um die Starlight-Konfiguration zu aktualisieren oder Astro-Integrationen hinzuzufügen.
Dieser Hook wird mit den folgenden Optionen aufgerufen:
Typ: StarlightUserConfig
Eine schreibgeschützte Kopie der vom Benutzer bereitgestellten Starlight-Konfiguration. Diese Konfiguration kann durch andere Plugins, die vor dem aktuellen Plugin konfiguriert wurden, aktualisiert worden sein.
updateConfig
Abschnitt betitelt „updateConfig“Typ: (newConfig: StarlightUserConfig) => void
Eine Callback-Funktion zur Aktualisierung der vom Benutzer bereitgestellten Starlight-Konfiguration. Gib die Konfigurationsschlüssel der root-Ebene an, die du überschreiben möchtest. Um verschachtelte Konfigurationswerte zu aktualisieren, musst du das gesamte verschachtelte Objekt bereitstellen.
Um eine vorhandene Konfigurationsoption zu erweitern, ohne sie außer Kraft zu setzen, wird der vorhandene Wert in den neuen Wert übertragen.
Im folgenden Beispiel wird ein neues social
Medienkonto zur bestehenden Konfiguration hinzugefügt, indem config.social
in das neue social
-Array übertragen wird:
export default { name: 'add-twitter-plugin', hooks: { 'config:setup'({ config, updateConfig }) { updateConfig({ social: [ ...config.social, { icon: 'twitter', label: 'Twitter', href: 'https://twitter.com/astrodotbuild', }, ], }); }, },};
addIntegration
Abschnitt betitelt „addIntegration“Typ: (integration: AstroIntegration) => void
Eine Callback-Funktion zum Hinzufügen einer Astro-Integration, die vom Plugin benötigt wird.
Im folgenden Beispiel prüft das Plugin zunächst, ob Astros React-Integration konfiguriert ist, und fügt sie, falls nicht, mit addIntegration()
hinzu:
import react from '@astrojs/react';
export default { name: 'plugin-using-react', hooks: { 'config:setup'({ addIntegration, astroConfig }) { const isReactLoaded = astroConfig.integrations.find( ({ name }) => name === '@astrojs/react' );
// Füge die React-Integration nur hinzu, wenn sie nicht bereits geladen ist. if (!isReactLoaded) { addIntegration(react()); } }, },};
addRouteMiddleware
Abschnitt betitelt „addRouteMiddleware“Typ: (config: { entrypoint: string; order?: 'pre' | 'post' | 'default'}) => void
Eine Callback-Funktion, um der Website einen Routen-Middleware-Handler hinzuzufügen.
Die Eigenschaft entrypoint
muss ein Modulbezeichner für die Middleware-Datei deines Plugins sein, die einen onRequest
-Handler exportiert.
Im folgenden Beispiel fügt ein Plugin, das unter dem Namen @example/starlight-plugin
veröffentlicht wurde, eine Route-Middleware über einen npm-Modul-Spezifizierer hinzu:
export default { name: '@example/starlight-plugin', hooks: { 'config:setup'({ addRouteMiddleware }) { addRouteMiddleware({ entrypoint: '@example/starlight-plugin/route-middleware', }); }, },};
Kontrolle der Ausführungsreihenfolge
Abschnitt betitelt „Kontrolle der Ausführungsreihenfolge“Standardmäßig wird die Plugin-Middleware in der Reihenfolge ausgeführt, in der die Plugins hinzugefügt werden.
Verwende die optionale Eigenschaft order
, wenn du mehr Kontrolle darüber brauchst, wann deine Middleware läuft.
Setze order: "pre"
, um vor der Middleware eines Benutzers zu laufen.
Setze order: "post"
, um nach allen anderen Middlewares zu laufen.
Wenn zwei Plugins Middleware mit demselben order
-Wert hinzufügen, wird das zuerst hinzugefügte Plugin zuerst ausgeführt.
astroConfig
Abschnitt betitelt „astroConfig“Typ: AstroConfig
Eine schreibgeschützte Kopie der vom Benutzer bereitgestellten Astro-Konfiguration.
command
Abschnitt betitelt „command“Typ: 'dev' | 'build' | 'preview'
Der Befehl, mit dem Starlight gestartet wird:
dev
- Projekt wird mitastro dev
ausgeführtbuild
- Projekt wird mitastro build
ausgeführtpreview
- Projekt wird mitastro preview
ausgeführt
isRestart
Abschnitt betitelt „isRestart“Typ: boolean
false
, wenn der Dev-Server startet, true
, wenn ein Reload ausgelöst wird.
Häufige Gründe für einen Neustart sind, dass ein Benutzer seine astro.config.mjs
bearbeitet, während der Dev-Server läuft.
Typ: AstroIntegrationLogger
Eine Instanz des Astro-Integrationsloggers, die du zum Schreiben von Protokollen verwenden kannst. Allen protokollierten Meldungen wird der Name des Plugins vorangestellt.
export default { name: 'long-process-plugin', hooks: { 'config:setup'({ logger }) { logger.info('Beginn eines langen Prozesses…'); // Ein langer Prozess… }, },};
Im obigen Beispiel wird eine Meldung protokolliert, die die angegebene Info-Meldung enthält:
[long-process-plugin] Beginn eines langen Prozesses…
useTranslations
Abschnitt betitelt „useTranslations“Typ: (lang: string) => I18nT
Rufe useTranslations()
mit einem BCP-47-Sprach-Tag auf, um eine Utility-Funktion zu generieren, die Zugriff auf UI-Strings für diese Sprache bietet.
useTranslations()
gibt ein Äquivalent der API Astro.locals.t()
zurück, die in Astro-Komponenten verfügbar ist.
Weitere Informationen zu den verfügbaren APIs findest du im Leitfaden „UI-Übersetzungen verwenden“.
export default { name: 'plugin-use-translations', hooks: { 'config:setup'({ useTranslations, logger }) { const t = useTranslations('zh-CN'); logger.info(t('builtWithStarlight.label')); }, },};
Im obigen Beispiel wird eine Meldung protokolliert, die einen integrierten UI-String für die vereinfachte chinesische Sprache enthält:
[plugin-use-translations] 基于 Starlight 构建
absolutePathToLang
Abschnitt betitelt „absolutePathToLang“Typ: (path: string) => string
Rufe absolutePathToLang()
mit einem absoluten Dateipfad auf, um die Sprache für diese Datei zu erhalten.
Dies kann besonders nützlich sein, wenn du remark oder rehype Plugins hinzufügst, um Markdown- oder MDX-Dateien zu verarbeiten.
Das von diesen Plugins verwendete virtuelle Dateiformat enthält den absoluten Pfad der zu verarbeitenden Datei, der mit absolutePathToLang()
verwendet werden kann, um die Sprache der Datei zu bestimmen.
Die zurückgegebene Sprache kann mit dem Helfer useTranslations()
verwendet werden, um UI-Strings für diese Sprache zu erhalten.
Nehmen wir zum Beispiel die folgende Starlight-Konfiguration:
starlight({ title: 'Meine Dokumentation', defaultLocale: 'en', locales: { // Englische Dokumentationen in `src/content/docs/en/` en: { label: 'English' }, // Französische Dokumentationen in `src/content/docs/fr/` fr: { label: 'Français', lang: 'fr' }, },});
Ein Plugin kann die Sprache einer Datei anhand ihres absoluten Pfads bestimmen:
export default { name: 'plugin-use-translations', hooks: { 'config:setup'({ absolutePathToLang, useTranslations, logger }) { const lang = absolutePathToLang( '/absolute/path/to/project/src/content/docs/fr/index.mdx' ); const t = useTranslations(lang); logger.info(t('aside.tip')); }, },};
Im obigen Beispiel wird eine Meldung protokolliert, die einen integrierten UI-String für die französische Sprache enthält:
[plugin-use-translations] Astuce