给 OpenAPI 文档配一个能直接发请求的界面(Scalar)
Scalar 是一个用 TypeScript 写的开源 API 平台,把 OpenAPI/Swagger 文档渲染成可交互的 API 参考页,同时提供基于同一份文档发请求的 API 客户端。这篇文章给出最短上手路径、可用集成与配置字段、真实 Issue 里暴露的坑,以及它和同类 API 客户端的差别,帮你判断要不要接进现有项目。
后端接口写完,文档和调试往往落在两个地方:Swagger UI 页面负责看,Postman 或 Insomnia 负责发请求。改一个参数要在两个界面之间来回切,接口一多,文档和实际请求还会对不上。Scalar 针对的就是这个割裂:同一份 OpenAPI 文档,既渲染成给人看的参考页,也能在同一页里直接发请求。
Scalar 是一套用 TypeScript 写的开源 API 平台,读取 OpenAPI/Swagger 文档,渲染成可交互的 API 参考页,并自带一个能直接发请求的 API 客户端。
仓库里主要有两条产品线,一条是 API 参考渲染(api-reference),一条是 API 客户端(api-client),包都放在 packages/ 目录下。客户端有 Windows、MacOS、Linux 三端的桌面安装包,也提供一个浏览器版入口 client.scalar.com。项目 2023-08-16 创建,采用 MIT 许可证,主语言是 TypeScript(占 65.5%),其次是 Vue(29.4%)。仓库地址是 https://github.com/scalar/scalar,目前 16216 Star、943 Fork、37 个开放 Issue。
第一次用它需要知道的事
- 只渲染参考页的话,不需要构建步骤。README 给出的 HTML 方式是从 CDN 加载 ESM 构建,一个 HTML 文件就能跑起来,不用 npm install,也不用打包器。
- 你的 OpenAPI 文档得有一个能访问到的地址。官方示例用的是
https://registry.scalar.com/@scalar/apis/galaxy?format=json。文档地址跨域时,要配置proxyUrl走代理,示例里配的是https://proxy.scalar.com。 - 要改源码或做本地构建,仓库是 pnpm workspace,根目录有
pnpm-workspace.yaml和pnpm-lock.yaml。仓库里有.nvmrc,但 README 节选里没有写具体的 Node 版本号,仓库里也没有说明这一步。 - 仓库体积是 413088 KB,完整克隆比一般前端项目慢,只想用渲染能力的话没必要拉全量源码。
- 客户端分两种形态:桌面版从 scalar.com/download 下载,浏览器版直接用 client.scalar.com,两者都不要求你先装一套后端。
最短上手路径
- 新建一个 HTML 文件,在
script type="module"里从https://cdn.jsdelivr.net/npm/@scalar/api-reference/esm.js引入createApiReference。 - 在 body 里放一个容器节点,例如
<div id="app"></div>。 - 调用
createApiReference('#app', { url: '你的 OpenAPI 文档地址' }),把url换成自己的文档地址。 - 如果文档在跨域后面,在第二个参数里补上
proxyUrl: 'https://proxy.scalar.com'。 - 用浏览器打开这个 HTML 文件,参考页会渲染进
#app,端点旁带测试入口,可以直接发请求。
要把文档挂到自己的服务上,README 里建议的路由是 /scalar,套用对应框架的集成后访问这个路径即可。README 还提供了一段可以直接粘给编码 agent 的提示词,让它自己检查项目用的框架、包管理器和路由,再从官方集成列表里挑一个装上。
它实际上能做哪些事
把 OpenAPI 文档变成可交互参考页
- 渲染 OpenAPI/Swagger 文档,页面本身带测试工具,端点上可以直接构造请求。
- 为多种语言和框架生成代码示例,README 把它列为参考页的固有能力之一。
- 提供一份持续增长的框架集成清单,包括 HTML/JS、.NET ASP.NET Core、Aspire、AdonisJS、Astro、Django Ninja、Django、Docker、Docusaurus、Elixir、Express、FastAPI、Fastify、Flask、Go、Hapi、Hono、Java、Laravel Scribe、Laravel、Micronaut、NestJS、Next.js 等。HTML/JS 方式是兜底选项,README 写明它「works everywhere」。
基于 OpenAPI 的 API 客户端
- 免费开源,对 OpenAPI/Swagger 做支持,客户端里带环境变量和动态参数。
- Watch Mode 与服务器框架同步,后端改路由后客户端跟着更新,不用手动导文档。
- 桌面端提供 Windows、MacOS、Linux 安装包,不想装软件可以直接用浏览器版。
文档周边产出
- mock server 相关能力放在 @scalar/blocks 包里。0.4.0 的发布说明提到,mock-server 的 XML 响应改用共享的 schema 感知序列化器,会处理属性、命名空间和根节点命名,发布说明同时提醒已有的 XML 响应快照可能需要更新。
- @scalar/openapi-to-markdown 包负责把文档转成单页 Markdown,1.5.0 版本把单页 Markdown 改得更易读,明确面向读
llms.txt导出的 AI agent;operation、webhook 或 model 页面现在以该项自身作为#标题开头。
参数速查
README 节选里明确出现的渲染配置只有两个字段:url 指向 OpenAPI 文档地址,proxyUrl 用于绕开跨域限制。完整写法如下。
createApiReference('#app', {
// OpenAPI 文档地址
url: 'https://registry.scalar.com/@scalar/apis/galaxy?format=json',
// 避免 CORS 问题
proxyUrl: 'https://proxy.scalar.com',
})
除这两个字段之外,主题和其余配置项在官方文档里分成 configuration 与 themes 两个页面,仓库 README 节选只给了上面两个字段的示例,其他参数名和取值仓库里没有列出。需要自定义表头或更细的渲染行为时,README 指向了一个 CodePen 示例作为起点。
输出与结果位置
- HTML/JS 方式:渲染结果进你传给
createApiReference的那个选择器,示例里是#app,本质是一个前端页面。 - 框架集成方式:文档页作为一条路由挂在现有服务上,README 建议的路径是
/scalar。 - 桌面客户端:从 scalar.com/download 下载安装,浏览器版在 client.scalar.com 直接打开。
- openapi-to-markdown:输出的是 Markdown 文本,适合作为
llms.txt一类导出供 AI agent 读取。
实际使用中的坑
Issue 列表里最典型的一条是 Vue 组件嵌入外部应用时的 CSS 泄漏:把 <ApiReference /> 按官方 Vue 集成文档放进另一个应用后,样式会溢到宿主页面。这条 Issue 有 17 条评论,状态是待解决,至今仍是开放的。
整数处理也踩过坑。超过 i32 范围的数字(例如 60503861139345408)在客户端里会被处理成异常值,这条 Issue 已经关闭,说明已修复。
路径参数在界面里曾出现编码问题:示例 URL 里的路径参数被编码成 %7Bplatform%7D,参数选择下拉框也跟着消失。这条 Issue 共 19 条评论,已解决。
cookies 一度完全不工作,OAuth 2.0 也被指出功能未完成、缺 PKCE 支持,这两条分别有 31 条和 37 条评论,现状都是已解决。如果你的集成方案依赖认证流程,升级到较新版本再评估,比照着旧版本的行为做判断更靠谱。
替代方案一览
下表里前两个是同功能的同类项目,第三个能解决部分相同的问题。
| 项目 | 适合谁 | 部署方式 | 主要限制 | 什么情况下选它更合适 | 项目地址 |
|---|---|---|---|---|---|
| scalar/scalar | 已有 OpenAPI/Swagger 文档、要同时拿到参考页和调试入口的后端与 API 团队 | HTML 单文件走 CDN 即可渲染;桌面端有 Windows/MacOS/Linux 安装包;源码是 pnpm workspace | 渲染参考页需要一份可访问的 OpenAPI 文档地址,跨域时还要经 proxyUrl 走代理;Vue 组件嵌入外部应用存在 CSS 泄漏的待解决 Issue | 你要的是一份能直接发请求的 API 参考页,并希望它挂在现有框架的 /scalar 路由上 | scalar/scalar |
| usebruno/bruno | 习惯把请求集合存成本地文件、并提交进 Git 的接口调试者 | 桌面客户端 | 公开定位是探索与测试 API 的 IDE,与文档渲染不是同一条产品线 | 你更看重请求集合以文件形式留在仓库里、离线可用,不需要把文档渲染成网页 | usebruno/bruno |
| VoidenHQ/voiden | 用纯 Markdown 组织 API 设计与测试文档的团队 | 仓库没有说明 | 未逐一核实 | 你的 API 设计与测试文档本来就写在 Markdown 里,希望工具跟着这套写法走 | VoidenHQ/voiden |
如果你的工作是每天手动构造一批固定请求,而且这些请求集合要跟着代码仓库走,Bruno 这类以本地文件为核心的桌面客户端更顺手。Scalar 这边,参考页要正常渲染,前提是有一份能被访问到的 OpenAPI 文档地址,文档在跨域后面时还得经过 proxy.scalar.com 做代理转发,比本地客户端多一层外部依赖。你只需要调试、不需要把文档变成网页的话,桌面客户端就够了;反过来,你要的是给已有框架补一个可交互的文档页,Scalar 的集成清单更贴这个场景。
别踩的合规线
API 客户端发出去的是真实请求,会对目标服务产生真实影响。只用它测试你自己拥有的资产,或者已经拿到明确授权的目标。未经授权对第三方服务发起请求,可能违反对方的服务条款;在部分司法辖区,绕过认证或高频探测还可能触及未授权访问相关的法律风险。用同事的线上环境练手、拿别人的公开接口做压测,都属于越线。
代理转发这一环要单独留意。配置 proxyUrl 之后,请求会经过 proxy.scalar.com 这样的第三方服务中转,带 token、Cookie 或内部地址的请求不要走公共代理。认证信息一旦经过第三方节点,就不再受你的网络边界保护。
什么时候值得用它
你手上已经有一份 OpenAPI/Swagger 文档,想要一个比默认文档页更好看、并且能在同一个页面里直接发请求的参考页,Scalar 的 HTML 单文件方式几分钟就能看到效果。
你要给 FastAPI、NestJS、Express、ASP.NET Core 这类框架挂一条文档路由,又不想自己写前端,集成清单里基本能找到对应的一项,省掉从零搭页面的工作量。
你需要一个免费、开源、对 OpenAPI 有一等支持的客户端,桌面端和浏览器端都能用,并且愿意接受它仍在快速迭代、部分能力还在补齐的现状。
焚评:这个项目的量化评分
本项目的选题来自 焚.com(一个按公开公式给 GitHub 项目打分的站)。焚评当前总分 10.0 分(满分 10)。下表是各维度的得分:
| 评分维度 | 得分 |
|---|---|
| 热度动量(权重 25%) | 10.0 / 10 |
| 开发活跃(权重 25%) | 10.0 / 10 |
| 社区响应(权重 15%) | 10.0 / 10 |
| 文档质量(权重 15%) | 10.0 / 10 |
| 发布节奏(权重 10%) | 10.0 / 10 |
| 风险控制(权重 10%) | 10.0 / 10 |
评分口径、权重与计算方式见焚.com 的评分方法页;数据随 GitHub 指标刷新,具体数值以焚.com 当前页面为准。本文正文为诀.com 独立撰写,评分数据由焚.com 授权引用。
内容核验说明
价值在于把 Scalar 的上手路径压到最短:一个 HTML 文件加 CDN 就能渲染参考页,配置只有 url 和 proxyUrl 两项;同时把 Issue 里 CSS 泄漏、整数溢出、路径参数编码、cookies 与 OAuth 缺口摆出来,不替它遮掩。适合已有 OpenAPI 文档、想给现有框架补一条可交互文档路由的后端与 API 团队。
Star、Fork、开放 Issue 数、语言占比、仓库体积等来自 GitHub 页面与作者公开披露,诀.com 未独立验证;Issue 状态与评论数取自仓库页面,会随版本变化。上手步骤、集成清单与配置字段来自 README,未做实际部署验证,结果不保证复现。用户反馈摘要
根据仓库 Issue 来看,反馈集中在客户端能力补齐与框架集成兼容:cookies、OAuth 2.0 缺 PKCE、路径参数被编码为 %7Bplatform%7D、超过 i32 的整数显示偏差、CSP 导致 React 组件只加载部分、Nuxt 集成报 CSS 扩展名错误、multipart/form-data 仍默认 JSON 等,状态多为已解决;AsyncAPI 与单页多文档已获支持,servers 配置未同步到客户端 URL 也已修复。整体是迭代快、遗留项在收敛,嵌入第三方应用和认证流程仍需按版本核验。
基于该仓库公开 Issue 整理,只反映提交者报告的现象与诉求,不代表诀.com 立场,也不代表问题已被确认。项目来源与说明
开源项目:scalar(scalar)
本文由诀.com 编辑基于该项目的公开信息独立撰写,属原创解读,不是对项目文档的翻译或转载;文中提到的功能与参数以官方仓库为准,代码与文档版权归原作者所有。
查看项目仓库