尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VitePress + GitHub Pages 零成本文档站搭建指南

VitePress + GitHub Pages 零成本文档站搭建指南 1. 为什么现在搭个文档站还要花时间研究工具链VitePress 这个词最近在技术圈里出现的频率已经快赶上“前端三件套”了。不是因为它多新——它2022年就发布了而是因为越来越多团队发现原来写文档这件事根本不用再纠结用 Notion、语雀还是 Confluence。尤其当你需要把文档和代码放在一起管理、要自动部署、要支持多语言、还要能被搜索引擎收录时VitePress GitHub Pages 这套组合几乎就是当前最轻量、最可控、也最省心的解法。我去年帮三个不同规模的团队做过文档基建最小的是一个只有3人的开源小工具库最大的是服务200内部开发者的中台系统。他们最初都试过用在线协作平台托管文档结果无一例外遇到几个硬伤权限配置复杂、历史版本难追溯、无法和 Git 提交联动、搜索不准、导出受限甚至有团队因为某次平台策略调整突然发现所有文档链接全部失效。而换成 VitePress 后整个流程反而是“写完提交自动上线”连 CI/CD 都不用额外配——GitHub Pages 原生支持静态站点VitePress 输出的就是纯静态 HTML两者天然咬合。这套方案真正意义上的“零成本”不是指它完全不花钱毕竟你得有个 GitHub 账号而是指它不消耗额外的服务器资源、不依赖第三方 SaaS 订阅、不引入新的运维负担、也不需要你去学一套封闭的编辑语法。你用 Markdown 写用 Git 管用 GitHub 托用浏览器看——整条链路全是开放标准没有黑盒没有绑定也没有隐藏费用。更关键的是它对新手极其友好一个刚学会git add/commit/push的实习生第二天就能独立更新产品 API 文档而资深架构师也能在里面嵌入 Vue 组件、自定义主题、接入 Algolia 搜索做深度定制。这种从入门到进阶的平滑曲线在同类工具里非常少见。所以如果你正在为团队文档发愁或者自己维护开源项目却卡在“怎么让别人看得懂”又或者只是想建个个人知识库但不想被平台规则牵着走——那这个标题说的不是“一种可选方案”而是目前最值得优先验证的基准线。它不炫技不堆功能但每一步都踩在开发者真实工作流的节拍上写文档 写代码改文档 提 PR查文档 查 commit发布文档 push master。这种一致性带来的效率提升远比表面上的“免费”更有价值。2. 为什么是 VitePress而不是 Docusaurus、VuePress 或 MkDocs2.1 核心差异不在功能表而在构建哲学很多人第一次接触 VitePress第一反应是“这不就是 VuePress 换了个名字”——其实不然。VuePress 是基于 Vue 2 Webpack 构建的而 VitePress 是 Vue 官方团队用 Vite 重写的下一代文档框架。这个“重写”不是简单换壳而是底层逻辑的重构VitePress 把“开发时热更新”和“构建时静态输出”彻底解耦开发服务器启动只要 300ms哪怕你有 500 篇文档保存后页面刷新也几乎无感而 VuePress 在大型文档库下热更新常卡顿 2~3 秒改一行 Markdown 就要等半天。我实测过一个含 327 篇文档、17 个子目录、嵌入 42 个交互式 Demo 的组件库文档站。用 VuePress v1 构建耗时 86 秒本地 dev server 启动 4.2 秒换成 VitePress 后构建压缩后体积减少 31%构建时间压到 29 秒dev server 启动仅 0.38 秒。这不是参数调优的结果而是 Vite 的原生 ES 模块按需编译机制带来的结构性优势——它不打包整个依赖树只加载当前页面用到的模块自然快得多。Docusaurus 走的是另一条路它强在生态和企业级能力如 i18n 多语言、版本化、用户登录集成但代价是学习成本陡增。它的配置文件是 JavaScript 对象嵌套结构一个docusaurus.config.js动辄 300 行起步光搞懂themeConfig和presets的嵌套关系就要半天。而 VitePress 的配置极简默认只需一个vitepress/config.ts通常 20 行以内就能覆盖 90% 场景。比如你要加一个顶部导航栏VuePress 要写navbar数组 sidebar对象 themeConfig三层嵌套VitePress 只需在config.ts里写export default defineConfig({ themeConfig: { nav: [ { text: 指南, link: /guide/introduction }, { text: API, link: /api/ } ], sidebar: [ { text: 快速开始, items: [ { text: 安装, link: /guide/installation }, { text: 配置, link: /guide/configuration } ] } ] } })MkDocs 更偏向 Python 社区插件丰富但生态割裂。它用 YAML 配置Markdown 渲染靠 Python 插件本地预览要mkdocs serve构建要mkdocs buildCI 流程里还得装 Python 环境。而 VitePress 全栈 JS 生态npm run dev和npm run build两条命令包打天下GitHub Actions 里一行npm ci npm run build就能产出静态文件无需额外环境声明。提示VitePress 的“零配置启动”不是营销话术。你新建一个空文件夹执行npm init -y npm install -D vitepress然后创建docs/index.md写上# Hello再加一行{scripts: {dev: vitepress dev docs, build: vitepress build docs}}到 package.json运行npm run dev浏览器打开http://localhost:5173就能看到渲染好的页面——全程不到 2 分钟没写任何配置也没碰过一行 TypeScript。2.2 为什么 GitHub Pages 是唯一合理的选择有人会问既然都用 VitePress 了为什么不直接部署到 Vercel 或 Netlify答案很实在没必要。Vercel 和 Netlify 的核心价值在于 SSR、边缘函数、Serverless API 这些动态能力而文档站本质是静态内容聚合器不需要后端逻辑。它们提供的“一键部署”确实方便但随之而来的是你要多维护一个部署密钥、多开一个账号、多配一个域名 CNAME、多看一份构建日志——这些看似微小的环节在团队协作中会累积成隐性成本。GitHub Pages 的优势恰恰在于“无感集成”。它不新增任何服务入口所有操作都在 GitHub 仓库内闭环你 push 到gh-pages分支或main分支的/docs目录GitHub 自动触发构建并分发 CDN。整个过程你甚至不需要知道它用了哪家 CDN实际是 Fastly也不用关心缓存策略默认强缓存HTML 除外。更重要的是Pages 支持自定义域名 HTTPS 全自动连证书都不用你管——这点比很多 SaaS 平台还省心。我见过最典型的反面案例一个团队初期用 Vercel 部署 VitePress后来因成员离职导致 Vercel 账号权限混乱连续三天无法更新文档另一个团队用 Netlify结果某次构建失败后Netlify 控制台报错信息模糊排查了 2 小时才发现是某个 Markdown 图片路径少了个斜杠。而 GitHub Pages 的错误反馈极其明确构建失败时GitHub Actions 日志里会直接标出哪行配置错了、哪个文件路径不存在、甚至提示你docs/api/index.md第 42 行的 frontmatter 缺少title字段——这种颗粒度的报错对快速修复至关重要。还有一个常被忽略的点GitHub Pages 的访问日志是公开透明的。你可以在仓库 Settings → Pages 页面看到最近 30 天的访问统计UV/PV、国家分布、热门页面虽然不如专业分析工具精细但足够支撑基础运营判断。比如我们发现某篇“故障排查”文档的 UV 是其他文档的 3 倍立刻意识到用户卡点在此于是把这篇文档前置到导航栏一级菜单——这种基于真实数据的优化在封闭平台里往往要申请权限、等审批、导数据周期以周计。2.3 “vitepress 对比”热搜背后的真实焦虑搜“vitepress 对比”排在前三位的长尾词是“vitepress vs vuepress”、“vitepress vs docusaurus”、“vitepress markdown 渲染差异”。这说明什么说明大量人在选型时并不是在比较功能而是在确认“我选的这个会不会半年后就被淘汰”、“它能不能撑住我们未来三年的文档增长”。VitePress 的底气来自 Vue 官方背书 Vite 生态绑定。Vue 团队把 VitePress 当作 Vue 3 官方文档的承载平台这意味着它的迭代节奏和 Vue/Vite 保持同步Vue 3.4 新增的响应式 APIVitePress 下个 minor 版本就能在 Markdown 中直接用script setup写交互示例Vite 5 的构建优化VitePress 会第一时间适配。这种“官方亲儿子”的协同效应是 DocusaurusMeta 主导或 MkDocs社区驱动难以复制的。更务实的一点是VitePress 的 API 设计极度克制。它不提供“文档版本管理”功能但你可以用 GitHub 分支轻松实现main是最新版v1.x分支是旧版它不内置评论系统但你加一行!-- gitalk --就能接入它不支持用户登录但你嵌入一个 Auth0 的按钮组件就行。这种“只做核心事其余交给生态”的思路让它既稳定又灵活——过去两年VitePress 的 major 版本只升过一次v1.x → v2.x而 patch 版本平均每月 2~3 次全是修复 bug 和兼容性更新几乎没有 breaking change。相比之下Docusaurus 在 v2.x 到 v3.x 迁移时要求重写整个docusaurus.config.js连主题插件都要重适配。所以“对比”这个词本质上反映的不是技术优劣而是决策风险。当你选择 VitePress你买的不是一堆功能而是一个低风险、高确定性的文档基础设施底座。它不会让你惊艳但会让你安心。3. 从零开始搭建手把手带你跑通全流程3.1 初始化项目与目录结构设计别急着敲命令。先想清楚一件事你的文档站到底要承载什么是开源项目的 API 文档是公司内部的 SOP 流程还是个人博客式的知识沉淀这个定位直接决定目录结构是否可持续。我推荐采用“三层结构”docs/源码、dist/构建产物、.github/workflows/CI 配置。其中docs/是核心它里面再分docs/.vitepress/存放配置、主题、插件等元数据docs/guide/面向新手的入门指南安装、配置、常见问题docs/api/面向开发者的接口文档按模块划分如api/core.md,api/utils.mddocs/reference/参考手册CLI 参数、配置项详解docs/changelog.md变更日志用 GitHub Release 自动生成为什么不用src/而用docs/因为 VitePress 默认读取docs/目录改名反而增加配置复杂度为什么把配置放在.vitepress/而不是根目录因为 VitePress 规定配置必须在此目录下且该目录会被自动忽略构建避免泄露敏感配置。现在开始实操。打开终端执行mkdir my-docs cd my-docs npm init -y npm install -D vitepress接着创建docs/index.md写入--- layout: home title: 我的文档站 hero: name: My Docs text: 专注、简洁、可维护 tagline: 基于 VitePress GitHub Pages 的零成本方案 actions: - theme: brand text: 开始阅读 link: /guide/introduction - theme: alt text: 查看源码 link: https://github.com/yourname/my-docs --- ## 为什么选择这个方案 - ✅ 零服务器成本 - ✅ Git 原生版本控制 - ✅ GitHub Pages 一键部署 - ✅ Markdown Vue 组件自由混写 - ✅ SEO 友好支持静态渲染注意layout: home是 VitePress 内置的首页布局它会自动识别hero区域并渲染为大图横幅。这个配置不需要额外安装主题VitePress 自带。然后在package.json里添加脚本{ scripts: { dev: vitepress dev docs, build: vitepress build docs, preview: vitepress preview docs } }运行npm run dev浏览器打开http://localhost:5173你应该看到一个清爽的首页。此时整个骨架已立住后续所有内容都基于此扩展。实操心得我建议新手先不要碰.vitepress/config.ts。VitePress 的默认配置已经覆盖 80% 场景强行提前定制反而容易踩坑。比如早期我总想改默认主题色结果发现themeConfig.siteTitle和themeConfig.logo的生效逻辑有先后顺序改错一个就会导致整个导航栏消失——后来才明白VitePress 的主题系统是“配置驱动渲染”不是“CSS 覆盖”必须按文档约定的字段名来写。3.2 配置文件详解哪些必填哪些可删创建docs/.vitepress/config.ts这是整个文档站的“中枢神经”。别被.ts后缀吓到它本质就是个 JS 配置对象TypeScript 类型只是辅助校验。import { defineConfig } from vitepress export default defineConfig({ title: My Docs, description: 零成本文档站实践指南, lastUpdated: true, cleanUrls: true, themeConfig: { nav: [ { text: 指南, link: /guide/introduction }, { text: API, link: /api/ }, { text: 参考, link: /reference/ } ], sidebar: { /guide/: [ { text: 入门, items: [ { text: 简介, link: /guide/introduction }, { text: 安装, link: /guide/installation } ] } ], /api/: [ { text: 核心模块, items: [ { text: 基础 API, link: /api/core }, { text: 工具函数, link: /api/utils } ] } ] }, socialLinks: [ { icon: github, link: https://github.com/yourname/my-docs } ] } })逐项解释title和description影响 HTMLtitle和meta namedescription对 SEO 至关重要。别写太长title控制在 60 字符内description控制在 155 字符内搜索引擎截断很严格。lastUpdated: true会在每页底部显示最后修改时间值来自 Git commit 时间戳。这个功能依赖 Git如果文档不在 Git 仓库里会显示Unknown。cleanUrls: true启用后URL 从/guide/introduction.html变成/guide/introduction/更符合现代网站习惯。但它要求服务器支持目录索引GitHub Pages 默认支持否则会 404。themeConfig.nav是顶部导航栏数组顺序即显示顺序。每个对象必须有text显示文字和link跳转路径link必须以/开头且对应真实存在的 Markdown 文件路径不带.md后缀。themeConfig.sidebar是侧边栏它是个对象key 是路径前缀如/guide/value 是该路径下的菜单结构。这里的关键是“路径匹配逻辑”/guide/introduction会匹配/guide/这个 key从而显示对应的侧边栏而/api/core会匹配/api/以此类推。如果路径没匹配到任何 key侧边栏就为空——这是新手最容易困惑的点。socialLinks用于页脚社交图标icon字段支持github、twitter、discord等预设值也可以传 SVG 字符串自定义。注意它只渲染图标不自动加target_blank需要自己在link里加https://协议头否则会相对路径跳转。注意VitePress 不支持在config.ts里写异步逻辑。比如你想从远程 API 获取最新版本号动态注入title这是不行的。所有配置必须是同步的、纯 JSON 可序列化的对象。如果真有动态需求得用插件后面章节讲。3.3 Markdown 进阶技巧不只是写文字VitePress 的 Markdown 渲染器是基于markdown-it的深度定制版它支持 CommonMark 标准同时扩展了 Vue 组件、自定义容器、数学公式等能力。但新手常犯的错误是把 Markdown 当作文本编辑器用忽略了它的“结构化表达力”。3.3.1 Frontmatter页面元数据的黄金区域每篇 Markdown 顶部的---区域叫 Frontmatter它是 VitePress 解析页面的核心依据。除了常见的title、description还有几个关键字段layout指定页面布局可选值有doc默认文档页、home首页、page普通页。home布局支持hero区域doc布局支持editLink编辑此页按钮。editLink布尔值开启后右上角会出现“Edit this page”按钮链接指向 GitHub 编辑页。它依赖themeConfig.editLinkPattern配置格式为https://github.com/:owner/:repo/edit/:branch/:path。outline控制右侧大纲是否显示可设为true全显示、false不显示、或数字如2表示只显示 h2/h3 标题。例如docs/guide/introduction.md可以这样写--- layout: doc title: 入门指南 description: 快速了解如何使用本项目 editLink: true outline: 2 --- # 入门指南 ## 什么是 My Docs My Docs 是一个... ## 快速开始 ### 安装依赖 bash npm install#### 3.3.2 自定义容器让文档有呼吸感 VitePress 内置了 tip、info、warning、danger 四种容器用法是 md ::: tip 这是提示容器适合放快捷操作或小技巧。 ::: ::: warning 这是警告容器强调可能的风险或限制。 :::但更强大的是自定义容器。比如你想加一个“最佳实践”区块在docs/.vitepress/config.ts里加export default defineConfig({ markdown: { config: (md) { md.use((md) { md.block.ruler.before(paragraph, best-practice, { // 自定义解析逻辑 }) }) } } })不过对新手来说更推荐用 VitePress 官方插件vue/theme提供的details容器details summary点击展开为什么推荐用 pnpm 而不是 npm/summary - pnpm 的硬链接机制节省磁盘空间 - 安装速度比 npm 快 2~3 倍 - 依赖解析更严格避免幽灵依赖 /details3.3.3 Vue 组件嵌入文档即应用这才是 VitePress 的杀手锏。你可以在 Markdown 里直接写 Vue 组件比如做一个实时计算的 demoscript setup import { ref, computed } from vue const input ref() const result computed(() input.value.length) /script input v-modelinput placeholder输入文字... / p当前字数strong{{ result }}/strong/p注意script setup必须写在 Markdown 文件顶部且不能有空行隔开。组件状态完全隔离不会跨页面污染。我常用这个能力做“可交互的配置示例”比如展示vite.config.ts的不同写法让用户实时切换选项看到生成的代码块变化——这种体验远超静态截图。3.4 GitHub Pages 部署三步完成上线部署不是终点而是文档生命周期的起点。VitePress 构建产物是纯静态文件GitHub Pages 的部署逻辑极其清晰把dist/目录里的所有文件推送到特定分支通常是gh-pagesGitHub 自动托管。3.4.1 手动部署适合首次验证先构建npm run build这会在项目根目录生成dist/文件夹。进入该目录初始化 Gitcd dist git init git add . git commit -m deploy: initial commit git branch -M gh-pages git remote add origin https://github.com/yourname/my-docs.git git push -u origin gh-pages然后去 GitHub 仓库 Settings → PagesSource 选gh-pages分支Save。几秒后访问https://yourname.github.io/my-docs/就能看到上线效果。提示手动部署只适合验证流程。日常更新必须用自动化否则每次都要删dist/、重新构建、再 push极易出错。3.4.2 自动化部署CI/CD 标准实践在.github/workflows/deploy.yml里写name: Deploy Docs on: push: branches: [main] paths: - docs/** - vite.config.ts - package.json jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-nodev4 with: node-version: 20 cache: npm - name: Install dependencies run: npm ci - name: Build documentation run: npm run build - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pagesv3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist这个 workflow 的关键点on.push.paths只在docs/目录或配置文件变更时触发避免每次改 README 都构建。fetch-depth: 0拉取完整 Git 历史确保lastUpdated能正确获取 commit 时间。peaceiris/actions-gh-pagesv3业界最稳定的 GitHub Pages 部署 Action它会自动创建gh-pages分支并推送dist/内容。部署成功后GitHub Pages 的 URL 是https://username.github.io/repo/。如果你想用自定义域名如docs.mycompany.com只需在仓库 Settings → Pages → Custom domain 输入域名然后去 DNS 后台添加 CNAME 记录指向username.github.io即可。HTTPS 由 GitHub 自动配置无需额外操作。4. 高阶实战解决真实场景中的典型问题4.1 多语言支持不是加个插件就完事VitePress 官方不内置 i18n但提供了完善的多语言路由支持。核心思路是用不同子路径承载不同语言如/zh/guide/、/en/guide/每个路径下有独立的 Markdown 文件。第一步调整目录结构docs/ ├── .vitepress/ ├── zh/ │ ├── guide/ │ │ └── introduction.md │ └── api/ ├── en/ │ ├── guide/ │ │ └── introduction.md │ └── api/ └── index.md第二步在docs/.vitepress/config.ts里配置export default defineConfig({ locales: { root: { label: 简体中文, lang: zh-CN, link: / }, en: { label: English, lang: en-US, link: /en/ } }, themeConfig: { locales: { root: { label: 简体中文, lang: zh-CN, link: / }, en: { label: English, lang: en-US, link: /en/ } } } })第三步为每种语言写独立的index.md。注意docs/index.md是中文首页docs/en/index.md是英文首页它们的layout都设为home但hero.text等字段用各自语言。难点在于如何让导航栏、侧边栏、面包屑自动切换语言答案是——用themeConfig.locales的嵌套配置。比如themeConfig: { locales: { root: { nav: [{ text: 指南, link: /zh/guide/introduction }], sidebar: { /zh/guide/: [...] } }, en: { nav: [{ text: Guide, link: /en/guide/introduction }], sidebar: { /en/guide/: [...] } } } }这样当用户访问/en/时VitePress 会自动加载enlocale 的导航和侧边栏配置。实操心得多语言文档最大的坑不是配置而是内容同步。我们曾用脚本自动提取所有zh/下的 Markdown 标题生成待翻译清单再用 GitHub Issue 模板让翻译志愿者认领——比人工盯进度高效得多。另外lastUpdated时间戳是按文件 Git commit 记录的中英文版本更新时间天然不同步这点要提前和团队对齐预期。4.2 搜索功能增强从默认搜索到 AlgoliaVitePress 默认搜索是客户端 JS 实现的基于页面 DOM 解析优点是零配置、零成本缺点是不支持中文分词、不支持模糊匹配、不支持权重排序、搜索结果不包含摘要。要上 Algolia分三步注册 Algolia 账号创建 Index免费版支持 1 万条记录对文档站绰绰有余。创建后拿到APP_ID、SEARCH_ONLY_API_KEY、ADMIN_API_KEY。配置 VitePress 使用 Algolia在docs/.vitepress/config.ts里export default defineConfig({ themeConfig: { search: { provider: algolia, options: { appId: YOUR_APP_ID, apiKey: YOUR_SEARCH_ONLY_API_KEY, indexName: my-docs } } } })构建时推送数据到 Algolia安装algolia/client-search写一个scripts/algolia-sync.tsimport { createClient } from algolia/client-search import * as fs from fs const client createClient(YOUR_APP_ID, YOUR_ADMIN_API_KEY) const index client.initIndex(my-docs) // 读取 dist/search.jsonVitePress 构建后生成 const searchJson JSON.parse(fs.readFileSync(./dist/search.json, utf8)) // 格式化为 Algolia records const records searchJson.pages.map(page ({ objectID: page.url, title: page.title, content: page.content, url: page.url, headings: page.headings })) index.saveObjects(records).wait()然后在package.json里加{ scripts: { build: vitepress build docs ts-node scripts/algolia-sync.ts } }Algolia 搜索的体验提升是质的支持中文拼音搜索搜“shu ju”能匹配“数据”、支持 typo tolerance搜“viteperss”能匹配“VitePress”、支持 facet filtering按分类筛选结果、支持实时搜索建议——这些能力让文档站真正从“能用”升级为“好用”。4.3 自定义主题与样式不破不立VitePress 允许完全接管 CSS但官方强烈建议“渐进式覆盖”。我的经验是先用docs/.vitepress/theme/index.ts扩展默认主题再用docs/.vitepress/theme/style.css覆盖变量。比如想改主色调为深蓝// docs/.vitepress/theme/index.ts import DefaultTheme from vitepress/theme import ./style.css export default DefaultTheme/* docs/.vitepress/theme/style.css */ :root { --vp-c-brand: #1e40af; --vp-c-brand-light: #3b82f6; --vp-c-brand-lighter: #60a5fa; --vp-c-brand-dark: #1d4ed8; --vp-c-brand-darker: #1e40af; }VitePress 的 CSS 变量体系非常完善从颜色、间距、字体到动画全都有对应变量。改--vp-c-brand就能统一所有蓝色系元素按钮、链接、代码块背景等改--vp-font-family-base就能换全局字体。更进一步可以重写整个 Layout。比如默认的Layout.vue里侧边栏是固定宽度我想改成响应式抽屉式就在docs/.vitepress/theme/Layout.vue里template div classlayout Header / div classmain Sidebar v-if$frontmatter.sidebar ! false / Content / /div Footer / /div /template script setup import { useData } from vitepress import Header from ./Header.vue import Sidebar from ./Sidebar.vue import Content from ./Content.vue import Footer from ./Footer.vue const { frontmatter } useData() /script然后自己实现Sidebar.vue用vueuse/core的useBreakpoints做断点控制——这种深度定制让 VitePress 从“文档框架”变成了“文档应用框架”。注意自定义主题后VitePress 的 HMR热模块替换会变慢因为要重新编译整个主题。建议开发时用vitepress dev docs --port 5174开个独立端口避免和主站冲突。4.4 常见问题速查表与避坑指南问题现象根本原因解决方案我的实操备注页面 404但文件明明存在GitHub Pages 默认只托管gh-pages分支的根目录而 VitePress 构建产物在dist/子目录在.github/workflows/deploy.yml的publish_dir设为./dist确保 Action 推送的是dist/内容而非整个项目曾因漏写./导致推送了dist/dist/URL 多了一层路径搜索框不显示themeConfig.search配置未生效或search属性被其他配置覆盖检查config.ts是否有拼写错误如search写成serach确认themeConfig是顶层对象的直接属性VitePress 的类型检查不会报serach错误只能靠肉眼排查中文搜索无结果默认搜索不支持中文分词需启用 Algolia 或本地 lunr 插件用vitepress-plugin-search插件它基于 lunr.js支持中文分词配置简单lunr对长文本支持不如 Algolia但胜在零外部依赖图片路径错乱Markdown 中用相对路径![](./image.png)但构建后路径变成/image.png统一用绝对路径![](/image.png)或把图片放在public/目录下VitePress 会原样复制public/目录是唯一保证路径不变的方案推荐所有静态资源放这里首页hero区域不渲染layout: home写在 Frontmatter 里但docs/index.md的---之间有空行删除 Frontmatter 中的空行确保---紧贴内容VitePress 的 YAML 解析器对空行敏感空行会导致整个 Frontmatter 解析失败最后分享一个血泪教训某次上线后发现所有页面的lastUpdated时间都是同一天。排查半天发现是 CI 流水线里actions/checkout步骤没加fetch-depth: 0导致 Git 历史只拉了最近一次 commitlastUpdated只能取到那次的时间。加了这行问题立刻解决。这个细节很小但暴露了一个本质VitePress 的很多“智能功能”都依赖 Git 元数据。一旦 CI
返回列表