文档站开发
本站 = cikio 的对外文档站,基于 Astro + Starlight,构建为纯静态站点,
由独立的 Cloudflare Worker cikio-docs 托管(Static Assets,无 SSR、无后端逻辑)。
| 项 | 值 |
|---|---|
| 线上地址 | https://docs.cikio.cn |
| 部署单元 | Worker cikio-docs(Static Assets,无 main) |
| 技术栈 | Astro 7 + Starlight 0.42 + MDX + starlight-links-validator |
| 仓库位置 | monorepo docs/ |
| 部署方式 | CI 自动(.github/workflows/deploy-docs.yml)+ 本地 run deploy |
一、内容与代码分离
Section titled “一、内容与代码分离”| 位置 | 归属 | 说明 |
|---|---|---|
docs/content/ |
正文唯一真源 | 结构 content/<分区>/... → URL /<分区>/...,走 PR 评审 |
其余部分(astro.config.mjs、src/、scripts/) |
站点代码 | 配置、品牌样式、内容同步脚本 |
docs/src/content/docs/ |
构建产物 | 每次构建全量重建,已 gitignore,不要手改 |
docs/.content-cache/ |
可选的外部内容缓存 | 默认不用,已 gitignore |
构建前 scripts/fetch-content.mjs 会把 content/ 全量同步到 Starlight 的内容根。
默认不联网:只有显式设置 DOCS_CONTENT_REPO 才会去浅克隆外部内容仓库并覆盖同名文件
(用于「内容仓公开、仓库私有」或引入外部作者;启用后拉取失败只告警不阻断构建)。
二、新增一篇文档
Section titled “二、新增一篇文档”- 在
docs/content/下建.md/.mdx(MDX 才需要 JSX,普通页面用 Markdown 即可)。 - 接进导航:
- 放在
policy/下 → 无需处理,该目录由 Starlight 的autogenerate自动进侧栏, 顺序由 frontmatter 的sidebar.order决定; - 放在其他位置 → 还要在
docs/astro.config.mjs的sidebar加一条, 并在docs/scripts/fetch-content.mjs的PUBLISHED_SLUGS加同一个 slug。
- 放在
- 尚未定稿 → frontmatter 加
draft: true(生产构建不输出、本地 dev 仍可见,页面上有草稿提示),定稿后删掉这一行。
三、路由与 URL
Section titled “三、路由与 URL”Starlight 的路由完全由文件路径决定,不支持 frontmatter 覆盖 slug:
| 文件 | URL |
|---|---|
content/index.mdx |
/(首页,刻意不进侧栏) |
content/policy/index.md |
/policy/ |
content/dev/authserver.md |
/dev/authserver/ |
content/guides/auth.mdx |
/guides/auth/ |
因此搬文件就是换 URL:分区一旦发布,改名要走评审,必要时补 301 规则。 不要让已发布页面链接到草稿页(线上会是死链,链接校验也会报错)。
四、本地开发
Section titled “四、本地开发”pnpm --filter docs dev # 同步内容 + 启动本地预览pnpm --filter docs build # 同步内容 + 静态构建,产物 docs/dist/pnpm --filter docs typecheck # astro sync + astro checkpnpm --filter docs run fetch:contentpnpm --filter docs run deploy # 同步内容 → 构建 → wrangler deploy几个约定:
- 侧栏分三组(条款与政策 / 产品与服务 / 开发),每组显式
collapsed: false,默认展开; 首页不进侧栏(它是站点封面,不是一篇文档,入口在左上角站点标题)。 - 自定义项只有三处:站点名与 Logo、
src/styles/brand.css里的主色变量、sidebar结构。 Starlight 的布局、响应式、深浅色切换保持默认。 - 「编辑此页」链接由
src/routeMiddleware.ts修正:Starlight 默认用filePath拼 GitHub 地址, 而filePath落在构建期拷贝的生成物目录里,拼出来的路径在仓库中不存在。 不要用import.meta.url/import.meta.glob去绕这个问题(中间件会被打进预渲染产物,取值不可靠)。 - 未命中的路径由
wrangler.toml的[assets] not_found_handling = "404-page"回落到content/404.mdx生成的404.html(状态码仍是 404)。改 404 文案就改那个文件。
已自动化:docs/**(以及根 pnpm-lock.yaml、该工作流自身)推到 main 后,
.github/workflows/deploy-docs.yml 自动构建并部署。它独立于 ci.yml
(后者 cancel-in-progress: true,会打断上传中的部署)。
-
CI 只需要一个 Secret
CLOUDFLARE_API_TOKEN;Account ID 已写在docs/wrangler.toml里。 -
手动部署仍可用:
pnpm --filter docs run deploy。 -
核对线上版本一律看 Version ID,而不是 commit sha:
终端窗口 pnpm --filter docs exec wrangler deployments list --name cikio-docs
docs/wrangler.toml 刻意不声明 routes:自定义域 docs.cikio.cn 在 Cloudflare Dashboard 手动绑定,
声明了 routes 反而会在部署时改写既有绑定。