ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 Astro Starlight 中集成 Scalar API Reference:@scalar/starlight 插件完整指南

在 Astro Starlight 中集成 Scalar API Reference:@scalar/starlight 插件完整指南 在 Astro Starlight 中集成 Scalar API Referencescalar/starlight 插件完整指南【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar导读scalar/starlight是 Scalar 为 Astro Starlight 文档站提供的官方插件只需在 Starlight 配置中注册插件并指向一个 OpenAPI 文档它就会自动注入一个路由在 Starlight 的布局含站点头部与侧边栏内渲染出漂亮的 Scalar API Reference并在侧边栏追加一个入口链接——无需手动创建页面。读完本文你将掌握该插件的安装、四种配置选项的完整语义、多份 API Reference 的部署方式以及它背后的路由注入、虚拟模块与侧边栏自动生成等实现原理能够直接在你的 Starlight 文档站点中落地使用。本文基于当前仓库 integrations/starlight 目录下的 README 与源码编写所有结论均可对照仓库内文件验证。插件是什么为 Starlight 文档站注入 API ReferenceStarlight 是 Astro 生态中面向文档站的官方主题擅长组织 Markdown/MDX 内容、侧边栏与导航。但当文档站需要同时展示交互式 API 文档时传统做法是单独部署一个 Scalar 页面与文档站割裂。scalar/starlight要解决的正是这个问题它作为一个Starlight 插件StarlightPlugin把 Scalar 的 API Reference 渲染进 Starlight 页面内部让 API 文档与站点导航、主题、搜索保持统一。从源码可以看到该插件的类型定义为ScalarStarlightOptionssrc/plugin.ts核心入参是configuration——即 Scalar 通用配置对象其中最关键的是urlOpenAPI 文档地址或contentOpenAPI 文档内容。安装使用你熟悉的包管理器安装npm install scalar/starlight从 package.json 可以看到该包的依赖与版本约束peerDependenciesastrojs/starlight 0.32.0astro ^5.0.0 || ^6.0.0运行时依赖scalar/astro与scalar/client-side-rendering工作区包engines.node 22包以 ESM 形式发布type: module入口为index.ts。快速上手最小配置在项目根目录的astro.config.mjs中注册插件并传入一个指向 OpenAPI 文档的configuration// astro.config.mjs import { defineConfig } from astro/config import starlight from astrojs/starlight import { scalarStarlight } from scalar/starlight export default defineConfig({ integrations: [ starlight({ title: My Docs, plugins: [ scalarStarlight({ // Scalar 的通用配置对象这里指定要渲染的 OpenAPI 文档地址 configuration: { url: /openapi.json, }, }), ], }), ], })保存后启动开发服务器打开http://localhost:4321/api-reference即可看到渲染出的 API Reference。默认情况下参考文档从/api-reference路由提供。仓库自带的 playground/astro.config.mjs 就是一个可直接对照的完整示例它同时配置了自定义sidebar与一个指向https://registry.scalar.com/scalar/apis/galaxy?formatjson的引用。选项详解选项默认值说明configuration—必填Scalar 通用配置对象PartialHtmlRenderingConfiguration最重要的是用于指定 OpenAPI 文档来源的url或contentpathname/api-referenceAPI Reference 提供的访问路径labelAPI Reference侧边栏条目的显示文本title即label的值API Reference 页面的title标题configurationScalar 通用配置对象configuration的类型在源码中定义为PartialHtmlRenderingConfigurationsrc/plugin.ts即 scalar/client-side-rendering 中HtmlRenderingConfiguration的局部版本与scalar/api-reference等其他集成共用同一套配置模型。你可以在这里配置主题、鉴权、自定义 CSS、hideClientButton等 Scalar API Reference 的全部通用项最核心的是urlOpenAPI 文档的 URL支持相对路径/openapi.json、完整 URL 或 Scalar Registry 地址content直接内联的 OpenAPI/Swagger 文档内容。由于配置最终会被序列化为 JSON 注入页面见下文“注意事项”一节函数类型的配置项不会被保留。pathname访问路径pathname决定 API Reference 挂在哪个路由下同时它也会被用作侧边栏条目的link。它允许带有多余的斜杠或尾斜杠插件会统一规范化scalarStarlight({ configuration: { url: /openapi.json }, pathname: //docs//api/ }) // 实际生效的路由与侧边栏链接为 /docs/api规范化逻辑实现在 src/normalize-pathname.ts/${pathname.split(/).filter(Boolean).join(/)}——保留单个前导斜杠、去掉尾斜杠、折叠连续空段。这一逻辑被插件注册引用时与路由组件匹配请求路径时共用保证两边归一化结果永远一致否则会导致查找错位、渲染错误引用。注意pathname规范化后不能解析为/站点首页否则会与首页冲突插件会直接抛出错误scalarStarlight({ configuration: { url: /openapi.json }, pathname: / }) // Error: [scalar/starlight] pathname must not resolve to /, which would // collide with your homepage. Use a subpath like /api-reference.对应实现在 src/plugin.ts测试覆盖见 src/plugin.test.ts。label 与 titlelabel是侧边栏中展示的文本默认API Referencetitle是页面title默认取label的值src/plugin.ts。也就是说如果你只自定义label: Payments而不设置title页面标题也会是 Payments。一个站点承载多份 API Reference插件支持被多次注册每次指定不同的pathname即可在同一个站点上提供多份参考文档plugins: [ scalarStarlight({ pathname: /reference/payments, label: Payments, configuration: { url: /payments.json }, }), scalarStarlight({ pathname: /reference/billing, label: Billing, configuration: { url: /billing.json }, }), ]这会分别在/reference/payments与/reference/billing渲染两份独立的 API Reference侧边栏也会追加Payments、Billing两个入口。多引用的底层实现颇具巧思。由于注入的路由是一个打包后的.astro组件无法为每个实例单独接收 propssrc/integration.ts 使用一个模块级module scope共享的references注册表Mappathname, { title, configuration }收集站点上所有引用再通过一个名为virtual:scalar-starlight的Vite 虚拟模块把整个注册表序列化给路由组件src/integration.ts。load在构建期惰性执行此时所有实例都已注册完毕因此能看到全部引用。路由组件 ScalarReference.astro 在渲染时根据请求路径匹配注册表中的 key选取对应配置。这套机制带来两个可验证的行为均有测试覆盖见 src/integration.test.ts不同引用不允许共用同一pathname注册第二个不同引用到已占用路径会抛出Two different API references are configured for ...但重复注册完全相同的引用是允许的开发服务器配置重载会重新执行注册见 src/integration.ts每个注入的 Astro integration 以scalar/starlight:pathname命名src/integration.ts保证 Astro 不会把多个引用当成同一个 integration 而只保留第一个。路由组件在匹配失败时的行为也做了区分只有一个引用时回退到该引用最常见场景即使路径偶发失配也能渲染存在多个引用而路径失配时则直接抛错——静默渲染第一个会展示错误的 API宁可报错也不误导ScalarReference.astro。插件的运行机制config:setup 钩子scalarStarlight()返回一个 Starlight 插件对象name: scalar/starlight其核心逻辑全部位于config:setup钩子src/plugin.ts主要做两件事注入路由Starlight 插件本身不能直接注入路由因此通过addIntegration(scalarRouteIntegration(...))借用一层 Astro integration。该 integration 在astro:config:setup中执行injectRoute把请求路径pathname指向打包后的ScalarReference.astro组件src/integration.ts同时把virtualConfigurationPlugin挂进 Vite 插件列表处理侧边栏仅当用户已经定义了sidebar时插件才用updateConfig追加{ label, link: pathname }条目且保留原有条目测试keeps existing sidebar entries验证了这一点src/plugin.test.ts。ScalarReference.astro的渲染要点src/ScalarReference.astro使用StarlightPage frontmatter{{ title, template: splash }}包裹让页面保持 Starlight 的头部与导航splash模板给 API Reference 全宽内容区Scalar 自带操作侧边栏使用ScalarComponent renderModeclient configuration{configuration} /必须使用renderModeclientStarlight 内置ClientRouter /导航在客户端完成静态渲染脚本在无刷新的客户端导航下不会重新执行。两个需要注意的行为官方明确提示1. 未配置 sidebar 时不会自动追加入口[!NOTE] 如果 Starlight 配置中没有定义sidebarStarlight 会根据文档目录自动生成侧边栏。此时插件不会追加条目强行追加会把自动生成的侧边栏替换成单条目导致其他页面被隐藏而是打印一条 warn 日志提示你手动添加链接例如sidebar: [{ label: API Reference, link: /api-reference }]这一行为由 src/plugin.ts 实现并有对应测试leaves an auto-generated sidebar untouchedsrc/plugin.test.ts自动生成侧边栏时updateConfig不会被调用logger.warn恰好被调用一次。2. 配置会被序列化为 JSON函数型选项不生效[!NOTE] 配置最终会作为 JSON 序列化进页面因此函数类型的配置项自定义fetch、onLoaded、插件等不会保留。这与scalar/astro的renderModeclient行为一致——本插件正是基于该模式构建以保证引用在 Starlight 的客户端导航下持续可用。也就是说如果你在configuration里传入了自定义fetch或onLoaded回调它们不会生效需要函数级自定义能力的场景应评估改用直接嵌入scalar/api-reference组件的方式。排查与验证pathname解析为/时报错说明路径归一化后与首页冲突改用子路径如/api-reference见上文Two different API references are configured for ...两个引用撞了同一个pathname给每个引用分配不同的路径即可提示“未配置 sidebar条目未添加”这是预期行为而非错误按日志给出的示例手动补上sidebar条目即可。仓库为插件与 integration 都编写了 Vitest 测试src/plugin.test.ts、src/integration.test.ts覆盖了命名与钩子存在性、侧边栏追加与保留、自定义 pathname/label/title 的透传、路径规范化、根路径冲突、自动生成侧边栏不触碰、多引用虚拟模块序列化、同路径冲突与配置重载幂等性等场景。你可以运行pnpm test对应脚本见 package.json 的test: vitest --run在本地验证这些行为。小结scalar/starlight以极低的接入成本一个插件、一个配置对象把交互式 Scalar API Reference 融入 Astro Starlight 文档站路由自动注入、侧边栏自动追加、多引用支持且严格尊重 Starlight 的自动生成侧边栏约定。理解其“Starlight 插件 Astro integration 虚拟模块注册表”的分层设计能帮助你在遇到路径冲突、多引用或客户端导航渲染问题时快速定位。上手时建议从仓库的 playground 配置 出发复制一份并替换为你自己的 OpenAPI 文档地址即可。【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表