路由数据
当 Starlight 渲染文档中的页面时,它首先创建一个路由数据对象来表示该页面上的内容。 本指南解释了路由数据是如何生成的,如何使用它,以及如何自定义它来修改Starlight的默认行为。
有关可用属性的完整列表,请参阅 “路由数据参考”。
什么是路由数据?
Starlight 路由数据是一个包含渲染单个页面所需的所有信息的对象。 它包括当前页面的信息以及从你的 Starlight 配置生成的数据。
使用路由数据
Starlight 的所有组件都使用路由数据来决定为每个页面渲染什么。
例如,siteTitle
字符串用于显示网站标题,sidebar
数组用于渲染全局侧边栏导航。
你可以在 Astro 组件中通过 Astro.locals.starlightRoute
全局变量访问这些数据:
---const { siteTitle } = Astro.locals.starlightRoute;---
<p>此网站的页面标题是 “{siteTitle}”</p>
例如,在 重写组件 以自定义显示内容时,这会很有用。
自定义路由数据
Starlight 的路由数据是开箱即用的,不需要任何配置。但是,对于高级用例,你可能需要自定义某些或所有页面的路由数据,以修改你的网站显示方式。
这与 重写组件 的概念类似,但不是修改 Starlight 渲染数据的方式,而是修改 Starlight 渲染的数据。
什么时候自定义路由数据
当你希望以现有配置选项无法实现的方式修改 Starlight 处理数据的方式时,自定义路由数据会很有用。
例如,你可能想要过滤侧边栏项目或自定义特定页面的标题。 像这样的更改不需要修改 Starlight 的默认组件,只需要传递给这些组件的数据。
如何自定义路由数据
你可以使用一种特殊形式的 “中间件” 来自定义路由数据。 这是一个每次 Starlight 渲染页面时都会调用的函数,可以修改路由数据对象中的值。
-
创建一个新文件,使用 Starlight 的
defineRouteMiddleware()
工具函数导出一个onRequest
函数:src/routeData.ts import { defineRouteMiddleware } from '@astrojs/starlight/route-data';export const onRequest = defineRouteMiddleware(() => {}); -
告诉 Starlight 你的路由数据中间件文件在
astro.config.mjs
中的位置:astro.config.mjs import { defineConfig } from 'astro/config';import starlight from '@astrojs/starlight';export default defineConfig({integrations: [starlight({title: 'My delightful docs site',routeMiddleware: './src/routeData.ts',}),],}); -
更新你的
onRequest
函数来修改路由数据。你的中间件接收的第一个参数是 Astro 的上下文对象。 它包含关于当前页面渲染的完整信息,包括当前 URL 和
locals
。在这个例子中,我们将在每页标题的末尾添加一个感叹号,使我们的文档更加精彩。
src/routeData.ts import { defineRouteMiddleware } from '@astrojs/starlight/route-data';export const onRequest = defineRouteMiddleware((context) => {// 获取此页面的内容集合条目。const { entry } = context.locals.starlightRoute;// 更新标题以添加感叹号。entry.data.title = entry.data.title + '!';});
多个路由中间件
Starlight 还支持提供多个中间件。
将 routeMiddleware
设置为路径数组,以添加多个中间件处理程序:
import { defineConfig } from 'astro/config';import starlight from '@astrojs/starlight';
export default defineConfig({ integrations: [ starlight({ title: 'My site with multiple middleware', routeMiddleware: ['./src/middleware-one.ts', './src/middleware-two.ts'], }), ],});
等待稍后的路由中间件
为了在执行代码之前等待堆栈中稍后的中间件运行,你可以等待作为第二个参数传递给中间件函数的 next()
回调。这对于等待插件的中间件运行后再进行更改非常有用。
import { defineRouteMiddleware } from '@astrojs/starlight/route-data';
export const onRequest = defineRouteMiddleware(async (context, next) => { // 等待后续中间件运行。 await next(); // 修改路由数据 const { entry } = context.locals.starlightRoute; entry.data.title = entry.data.title + '!';});