文档站维护说明
本文是 1.x 的归档文档(冻结于 1.x)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 1.x 为准,不建议用于新项目。
新项目请查看 5.x 最新文档。已在 1.x 上运行的项目,本文仍是可靠依据。
website/ 下其实有两个独立站点:
| 官网 | 文档站(你正在看的这个) | |
|---|---|---|
| 目录 | website/site/ | website/docs/ |
| 技术 | 纯静态(生成式 HTML,零依赖) | VitePress |
| 页面 | 首页 / 功能 / 应用市场 / 快速开始 / 关于 | 九个章节共 55+ 页 |
| 产物 | website/site/docs/ | website/docs/.vitepress/dist/ |
| 依赖 | 无(不需要 npm install) | vitepress |
「website/site/ 的产物目录也叫 docs/」有点绕,但这是刻意的:
官网构建时会把 VitePress 的产物收进自己的 docs/ 子目录,
于是 website/site/docs/ 就是一个自包含的发布目录 —— 官网在根,文档在 /docs/ 下。
官网(website/site/)
为什么是"生成式纯静态"
导航、页脚、应用卡片如果在 5 个 HTML 里各写一遍,改一处要改五处,必然漂移。
所以用 build.mjs 从模板 + 数据渲染出静态 HTML ——
产物仍然是可双击打开的纯静态文件,但维护面只有一份模板。
website/site/
├── build.mjs 构建入口(含本地预览服务器)
├── check-links.mjs 产物站内链接校验
├── src/
│ ├── layout.mjs <head> + 顶部导航 + 页脚
│ ├── partials.mjs 应用卡片、能力卡、章节标题等复用片段
│ └── pages/ 五个页面模板
└── assets/ 样式、脚本、logo(构建时原样复制)cd website/site
node build.mjs # 构建(会顺带并入文档产物)
node build.mjs --serve # 构建 + 本地预览(默认 5190)
node check-links.mjs # 校验站内链接数据来自哪里
应用名称、版本、菜单数、形态、分类,全部来自
website/docs/data/apps.json —— 由 website/scripts/gen-apps.mjs 扫描各应用
app.json 生成。
要改这些数字,改应用清单,不要改官网。 如果数据文件不存在,构建会直接报错并提示先跑数据生成脚本。
改品牌的地方
| 改什么 | 改哪 |
|---|---|
| 站点名、标语、描述、仓库地址 | build.mjs 顶部的 SITE 常量 |
| 顶部导航项 | build.mjs 的 NAV 数组 |
| Logo | assets/img/logo.svg(favicon 在 src/layout.mjs 里内联) |
| 备案号 | src/layout.mjs 的页脚(当前是占位符) |
SITE.docsUrl 必须以 / 结尾(用于拼接 ${docsUrl}guide/xxx.html),
而 SITE.docsHome 是文档首页的完整文件名。
两者混用会拼出 ./docs/index.htmlguide/... 这种错链接 ——
check-links.mjs 就是为了在构建后立刻抓到这类问题而存在的。
文档站(website/docs/)
目录结构
website/
├── package.json 站点自己的依赖(与 plus-ui 相互独立)
├── scripts/
│ ├── gen-apps.mjs 扫描各应用 app.json → 生成首页/生态页用的数据
│ ├── gen-sidebar.mjs 扫描 docs/<章节>/**/*.md → 生成侧边栏数据
│ └── check-site.mjs 校验侧边栏指向、站内链接、首页数据
└── docs/ ★ VitePress 的 srcDir
├── .vitepress/
│ ├── config.mts 站点配置:导航 / 搜索 / 页脚(侧边栏是下面那份 import 进来的)
│ ├── sidebar.mjs 构建期生成(scripts/gen-sidebar.mjs),不要手改
│ └── theme/ ★ 可选:只做配色,删掉站点照常可用
│ ├── index.ts extends DefaultTheme,只 import 下面的 CSS
│ └── custom.css 主题色 / hero / 卡片 / 表格 / 代码块
├── index.md 首页(VitePress **原生** home 布局:hero + features + 正文)
├── public/ 静态资源(logo.svg、hero-wujies.svg 等)
├── data/apps.json 构建期生成(scripts/gen-apps.mjs),不要手改
├── guide/ 开始使用
├── architecture/ 架构
├── plugin-dev/ 插件开发
│ ├── index.md 章节首页
│ ├── demo.md 跟着 hello 读源码
│ ├── basics/ 基础:不变量、应用清单
│ ├── backend/ 后端工程 + 本地联调
│ ├── frontend/ 前端远程应用
│ └── advanced/ 进阶:菜单、迁移、种子数据、抽模块、贡献指南
├── api/ API 手册(开放接口 / SDK 契约 / 定位器 / 前端运行时)
├── package/ 打包与上架
├── deploy/ 部署
├── ops/ 运维
├── ecosystem/ 应用生态
└── reference/ 参考两者不是一回事:
website/docs/是本站的内容源(在 git 里);- 仓库外层的
docs/是设计与方案文档(不在任何 git 仓库里)。
本站「设计与决策存档」一节引用的是后者。
本地开发
cd website
npm install
npm run dev # 开发服务器,默认 5180 端口其它脚本:
| 命令 | 作用 |
|---|---|
npm run gen:apps | 只重新生成应用数据 |
npm run gen:sidebar | 只重新生成侧边栏数据(加页面 / 改目录之后跑它) |
npm run check:contrast | 量 custom.css 里品牌色 / 按钮底色的对比度(品牌色上的白字要 ≥ 4.5:1) |
npm run build | 构建到 docs/.vitepress/dist |
npm run preview | 预览构建产物 |
npm run clean | 清掉构建产物 |
它们来自构建期扫描各插件目录下的 app.json,产物是
docs/data/apps.json。
要改应用的数量、版本、菜单数,请改应用清单,不要改文档。
主题层是可选的(一条硬约定)
docs/.vitepress/theme/ 只提供配色:index.ts 除 import './custom.css' 外什么都不做,
不注册任何组件。原因是一次真实事故 —— 这个目录曾经整个丢失,而当时首页依赖它里面的
<HomePage />,结果是首页白屏(只剩空白,字都没有)。
所以约定是:
- 首页必须是 VitePress 原生 home 布局(frontmatter 的
hero/features+ Markdown 正文), 不依赖任何自定义组件;首页正文里的区块只用 Markdown + 原生结构写; - 主题里不要加"首页必须依赖它才能渲染"的组件;
- 主题里不要引外部字体 / 图片 / CDN,视觉元素自绘在
docs/public/下。
自证方法(改完主题后应该跑一次):把 docs/.vitepress/theme/ 整个移走再 npm run build,
dist/index.html 里必须仍有 hero 文案、features 与正文 —— 只是回到默认紫色主题。
如果这时首页空了,就说明主题已经变成"渲染必需",要立刻改回去。
配色分工:品牌色就是 custom.css 里的 --vp-c-brand-1/2/3(浅色与深色两套),
色相方向与 docs/public/logo.svg 的「靛蓝 → 青」一致。改色值请顺手核对对比度 ——
品牌色上的白字要 ≥ 4.5:1(npm run check:contrast 就是那把量尺)。
写文档的约定
页面
- 每个
.md只有一个 H1 标题; - 不写 YAML frontmatter(首页
index.md例外,它要layout: home); - 中文、技术写作风格:精确、简洁。避免"强大的""完美的"这类营销词。
链接
- 站内链接用绝对路径(
/guide/quickstart),不要用相对路径; - VitePress 会把
.md后缀去掉生成 URL(cleanUrls: true); - 链接到不存在的页面会被
check-site报错。
⚠️ config.mts 曾经丢失过
docs/.vitepress/ 整个目录一度不存在(website/ 直到 2026-10 才纳入 git,纳入时
docs/ 里只有 md 与 public/)。后果:站点没有导航/侧边栏/搜索,
而且 check-site.mjs 直接报错退出 —— 那套守门等于没有。
现已按现有目录与各页 H1 生成(不是手写),侧边栏与目录结构因此天然一致。 两个由校验器逼出来的约定:
- 没有
index.md的章节,导航指向它的第一个页面 —— 指向/<sec>/会被判死链 (guide/architecture/reference目前都没有index.md); index.md的链接写/<sec>/,不是/<sec>/index—— 后者能打开, 但校验器会认为该章节首页"没有侧边栏入口"。
侧边栏是生成的,不是手写的
侧边栏不写在 config.mts 里:scripts/gen-sidebar.mjs 扫描 docs/<章节>/**/*.md
生成到 docs/.vitepress/sidebar.mjs,config.mts 只 import { sidebar } from './sidebar.mjs'。
规则都在脚本里(改规则改脚本):
- 显示名取每页第一个 H1(跳过代码块),
guide/quickstart这类一句话式 H1 在 脚本的TEXT_OVERRIDES里换成短标签; - 同一层里子目录与页面按名字字典序混排;
- 目录有
index.md时成为可点击的分组(link指向/<dir>/),index.md 不再单独成条目; - 没有
index.md的目录靠脚本里的GROUP_LABELS起名(如plugin-dev/basics→ 基础)。
加页面、改目录之后必须重跑 npm run gen:sidebar,否则 check-site 会提醒该页
没有侧边栏入口(在站点里不可达)。
它的头部就写着"不要手改"。改了会在下次生成时被覆盖,而那次覆盖会混进 git diff ——
届时看不出哪个才是对的。
容器
允许 ::: tip / ::: warning / ::: danger / ::: details,标题跟中文。
敏感信息
写文档时不要贴出任何真实凭据:
- 数据库 / Redis / RabbitMQ 的连接信息与密码;
- Sa-Token 的 JWT 密钥、加解密公私钥;
- 签名公钥的实际值(写占位符即可);
- 线上的域名与 IP、
VITE_APP_BASE_API的实际地址; - 任何私钥内容。
遇到必须提到的地方,写占位符并加一句「此处为真实凭据,请替换」。
校验
npm run gen:apps
npm run gen:sidebar
node scripts/check-site.mjscheck-site.mjs 会校验三件事:
- 侧边栏与导航里列的链接是否都指向真实存在的页面;
- 所有正文里的站内链接是否都能落到真实页面;
- 首页用的
apps.json是否存在、字段是否完整。
它同时会提醒"没有侧边栏入口"的页面。
部署
构建产物是纯静态文件,放在 docs/.vitepress/dist,扔到任意静态托管即可。
如果站点不是挂在域名根目录,需要改 config.mts 里的 base,否则资源路径会 404。