入坑 Docusaurus,看这一篇就够了
使用官方 V3 Demo,根据本文实战生成的模板代码 template-docusaurus。
在众多的 SSG 框架中,我基于第一印象、支持特性、用户数据、上手难易、界面设计等客观主观方面的比较,最终选择了 Meta 家的基于 React 的 Docusaurus。
选择 Docusaurus 的 n 个理由:
- 天然支持 TypeScript
- 基于 React(符合我目前的技术栈)
- 支持 Markdown、Mermaid、MDX
- 支持搜素、国际化等文档站必要因素
- 拥有大量的用户,处于积极维护的状态
- 上手简单,对新手友好
- 大厂出品
但真要找毛病,也不是没有:
- 名字是虚构的单词,难写难读(
-saurus为表示爬行动物的后缀,多为恐龙,从图标可以看出) - 本地启动项目,用的是 Webpack,很明显的慢(但我认为这不是什么大不了的事情,晚些他们底层悄咪咪改了也有可能,事实上他们 正在做这个事情)
- 部分界面元素偏大,不够精致
- TOC 及书签点击后的定位,没有考虑到顶栏的高度,部分内容在跳转后被遮挡
总之,无论从 UX 还是 DX 来讲,Docusaurus 都是一个非常不错的 SSG 框架,虽然有些小瑕疵,但瑕不掩瑜。
为何需要 SSG
README 是最接近文档的存在,大家应该都会用 Markdown 来写 README。
但作为技术文档,读者可能需要直观的代码运行效果,最好可交互,并且能够一键复制相关代码以便快速验证。这些就不是 README 这样的纯 Markdown 的工作职责了。
即便如此,Markdown 仍然是我们写文档的不二选择,只不过,我们想要的更多——这就需要一个文档框架。
🧐 如何挑选 SSG
0 - 候选列表
Jamstack Generators 这里提到了 300 多个 SSG 的框架。但对 Language 和 Templates 的分析并不全面,而且有一部分也没有包含进来。这么多,也没有必要都去研究,以下是我略研究过的(字母序):
| 名称 | 自述 | TS | MDX | React | Vue |
|---|---|---|---|---|---|
| astro | The web framework for content-driven websites | ✅ | ✅ | ✅ | ✅ |
| docsify | A magical documentation site generator | ✅ | |||
| docusaurus | Build optimized websites quickly, focus on your content | ✅ | ✅ | ✅ | |
| docz | It's never been easier to document your things! | ✅ | ✅ | ✅ | |
| dumi | 为组件研发而生的静态站点框架 | ✅ | ✅ | ✅ | ✅ |
| eleventy | Eleventy is a simpler static site generator | ✅ | ✅ | ✅ | |
| gatsby | Gatsby is a React-based open source framework for creating websites. | ✅ | ✅ | ✅ | |
| gitbook | Build docs as a product, not an afterthought | ✅ | |||
| gridsome | A Jamstack framework for Vue.js | ✅ | |||
| hugo | The world’s fastest framework for building websites | Go | |||
| jekyll | Transform your plain text into static websites and blogs | Ruby | |||
| next | The React Framework for the Web | ✅ | ✅ | ✅ | |
| nuxt | The Intuitive Vue Framework | ✅ | ✅ | ||
| pelican | Static site generator powered by Python | Python | |||
| rspress | Lightning Fast Static Site Generator | ✅ | ✅ | ✅ | |
| vitdoc | A new way to write Component Usage | ✅ | ✅ | ||
| vitepress | Vite & Vue Powered Static Site Generator | ✅ | ✅ | ✅ | |
| vuepress | Vue-powered Static Site Generator | ✅ | ✅ |
SSG 这个赛道也是很卷,相互间会暗自较劲,要么做比较,要么提供迁移方案(这些也是了解有哪些 SSG 的途径),比如:
1 - 第一印象
找一个趁手的工具,很多时候跟相亲一样,第一印象,眼缘很重要。
眼缘首先看官网。作为 SSG 来说,官网必须是自己的第一个用户,是其展现自身能力的第一演练场。从官网,我们可以看其整体设计感,以及是否有我们需要的相关功能。
| 名称 | 第一眼好感 | 个人评价 |
|---|---|---|
| astro | ★★★★☆ | 很有设计感,文档排版及色调也不错,该有的功能都有;但顶栏上的下拉用了原生的 select,略拉低档次,且默认不是 SPA |
| docsify | ★★★ | 相对简陋,没有顶栏,没有暗色,没有独立的 TOC |
| docusaurus | ★★★★☆ | 整体样式偏重,但不难看,文档全面;但部分设计偏大(比如侧边栏的图标),不够精致 |
| dumi | ★★★☆ | 首页略简陋,文档树略丑 |
| eleventy | ★★☆ | 内容区域偏窄;有搜索但交互不方便;没有暗色;非 SPA,点击后,左侧文档树会刷新,导致丢失位置;没有 TOC 是最致命的 |
| gatsby | ★★★ | 广义的应用框架,上手略难 |
| gitbook | ★★★ | 老牌 SSG,整体样式比较清爽;但要账号,且没有暗色切换 |
| gridsome | ★★★★☆ | 布局、排版等细节非常棒,非常契合写文档 |
| next | ★★★☆ | 更广义的应用框架,基于 React,上手略难;虽然也有人用它来做文档站,但更多的是商业站 |
| nuxt | ★★★☆ | 从名字上看,它和 Next 的定位是一样的,也是广义上的应用框架,基于 Vue |
| rspress | ★★★☆ | 让人很有尝试欲的 SSG |
| vitdoc | ★ | 文档内容很少,可能烂尾了 |
| vitepress | ★★★★ | 内容全面,结构清晰,整体样式也不错;Vue 技术栈可以看看 |
| vuepress | ★★ | 被 vitepress 代替了 |
总结:论排版的清爽而言,个人认为 Gridsome 最符合文档站的审美需求。从功能的全面性来讲,Astro、Docusaurus、Next、Vitepress 等都不错。
2 - Showcase
其次看它的用户,一来能够判断其受欢迎程度,二来可以作为借鉴学习的参考。用户量大的,自然会很骄傲地秀出来。
| 名称 | Showcase | 数量 |
|---|---|---|
| astro | astro.build/showcase | 1200+ |
| docsify | docsify.js.org/#/awesome?i… | 130+,但相当一部分已经无效 |
| docusaurus | docusaurus.io/showcase | 270+ |
| gatsby | www.gatsbyjs.com/showcase | 600+ |
| gitbook | www.gitbook.com/customer-sh… | 100+ |
| gridsome | 收集中... | |
| jekyll | jekyllrb.com/showcase/ | 47+ |
| next | nextjs.org/showcase | 120+ |
| nuxt | nuxt.com/showcase | 100+ |
3 - 文档基本需求
从官网还可以简单看它是否符合文档站的基本需求。每个人的需求可能都不大一样,我的如下:
- 支持 TS,必需,无 TS 不 Coding
- 支持标准 Markdown:必需,并支持 FrontMatter、右侧独立 TOC、代码高亮、外链默认
target="_blank" - 支持 MDX:必需,以支持更多动态特性,比如可交互 Demo
- 支持熟悉的 UI 框架:必需,否则不会需要 MDX
- 支持黑白主题:必需
- 支持全文搜索:必需,最好是本地搜素
- 支持国际化:非必需,有则善
- 支持多版本:非必需,有则善
- 支持 RTL:非必需
- SEO:非必需
以下判断,时间有限,不一定正确。
| 名称 | TS | Markdown | TOC | FrontMatter | 代码高亮 | 自动外链 | MDX | 框架 | 黑/白 | 搜索 | 国际化 | 多版本 | RTL |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| astro | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | React | ✅ | ✅ | ✅ | ❓ | |
| docsify | ❌ | ✅ | 左侧 | ✅ | ✅ | ✅ | Vue | Vue | ✅ | ✅ | ✅ | ❌ | |
| docusaurus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | React | ✅ | ✅ | ✅ | ✅ | |
| docz | ✅ | ✅ | 左侧 | ✅ | ✅ | ✅ | ✅ | React | ❌ | ❌ | ❌ | ❌ | |
| dumi | ✅ | ✅ | 左侧 | ✅ | ✅ | ❌ | ✅ | React | ✅ | ✅ | ✅ | ✅ | ✅ |
| eleventy | ✅ | ✅ | 顶部 | ✅ | ✅ | ❌ | ✅ | React | ❌ | ✅ | ✅ | ✅ | |
| gatsby | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | React | ❌ | ✅ | ✅ | ✅ | |
| gitbook | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❓ | ✅ | ✅ 很慢 | ❌ | ❌ | |
| gridsome | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❓ | Vue | ❌ | ✅ | ❌ | ❌ | |
| hugo | Go | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❓ | ✅ | ✅ | ✅ | ❌ | |
| jekyll | Ruby | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❓ | ❌ | ✅ | ❌ | ❌ | |
| next | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | React | ✅ 底部 | ✅ | ✅ | ❌ | |
| nuxt | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | Vue | Vue | ✅ | ✅ | ✅ | ❌ | |
| pelican | Python | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❓ | ✅ | ✅ | ✅ | ✅ | |
| rspress | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | React | ✅ | ✅ | ✅ | ❌ | |
| vitdoc | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❓ | React | ✅ | ✅ | ✅ | ❌ | |
| vitepress | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Vue | Vue | ✅ | ✅ | ✅ | ✅ | |
| vuepress | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Vue | Vue | ✅ | ✅ | ✅ | ✅ |
4 - 客观数据
受欢迎程度(下载量、Star 数、Issue 数)和更新频次(版本数、更新时间),属于比较客观的信息,能进一步帮我们确定选择。
以下数据,收集时间为 2025/03/14,纯手工,非 AI。
| 名称 | NPM 周下载 | Github Star | Open Issue | 版本数 | 第一版 | 上次更新 |
|---|---|---|---|---|---|---|
| astro github npm | 365k | 49.7k | 148 | 1170 | 2021/03 | 2025/03 |
| docsify github npm | 43.7k | 29k | 143 | 193 | 2016/11 | 2023/06 |
| docusaurus github npm | 387.6k | 58.5k | 281 | 2027 | 2017/06 | 2025/01 |
| docz github npm | 3.5k | 23.7k | 108 | 268 | 2018/04 | 2022/02 💥 官宣停更 |
| dumi github npm | 40.2k | 3.7k | 130 | 366 | 2019/12 | 2025/02 |
| eleventy github npm | 70k | 17.7k | 396 | 193 | 2018/01 | 2024/10 |
| gatsby github npm | 219.5k | 55.8k | 210 | 2979 | 2015/05 | 2024/12 |
| gitbook github npm | 3.4k | 27.6k | 42 | 21 | 2015/02 | 2017/07 |
| gridsome github npm | 1.4k | 8.6k | 540 | 75 | 2018/09 | 2020/11 |
| hugo github | - | 78.7k | 454 | 316 | 2013/06 | 2025/02 |
| next github npm | 7559.5k | 130k | 2.6k | 3029 | 2011/07 | 2025/03 |
| nuxt github npm | 666.3k | 56.5k | 869 | 349 | 2016/? | 2025/03 |
| rspress github npm | 6.4k | 1.6k | 73 | 675 | 2022/10 | 2025/03 |
| vitdoc github npm | 40 | 83 | 1 | 140 | 2022/08 | 2025/03 |
| vitepress github npm | 114.6k | 14.1k | 336 | 251 | 2020/05 | 2025/01 |
| vuepress github npm | 36.4k | 22.7k | 541 | 249 | 2018/04 | 2023/08 💥 基本停更 |
选择工具,跟买车一样,最怕停产了,根据上面的数据,可以放弃停产 2 年以上的那些。
5 - 上手
以上框架,不论是否已停产,在我研究 SSG 框架的最初,应该也有试过(但当时未做记录)。出于篇幅的考虑,以下仅对持续更新中的进行上手演练,以便读者根据自己的喜好进行选择。
🌻 实战总结
我们以一个新手的视角,从零开始,用 Docusaurus 搭建了一个文档站的基本内容,并配设了文档站十分重要的搜索功能。但这并不是 Docusaurus 的全部,也不是文档站的全部,本文尚未覆盖的相关部分有:
🎯 最佳实践
- 使用 Husky + LintStaged + MarkdownLint 规范 Markdown 格式
- 文档标题统一用 FrontMatter,并且 TOC 从二级标题
##开始 - 尽可能每个目录有个
index,或者在_category_.yaml|json中设置link.type为generated-index _category_.yaml|json,JSON 或 YAML 仅取其一,并设置link.slug- 图片,尽可能就近放在当前目录的
img子目录下,只有全局通用的放在static/img下
📌️ 附录
有用的资源和网站
文档,除了文字之外,图标、图片等装饰必不可少,这些网站可以收藏一下:
- favicon.io 快速简单地生成 FavIcon
- SVG Stack 可免费下载 SVG 图标,还能编辑后下载
- SVG Repo 免费的装饰性多色 SVG 图标
- unDraw 免费的装饰性 SVG 插图
- Web SVG 很多好看的 SVG 装饰图
- Flat Icon 图标和装饰图,SVG 要收费,但 PNG 免费
- SVGOMG SVG 优化
SSG 标识
自从开始研究文档框架,每打开一个文档站,我都会预判其 SSG 选型(同源的基因很容易看出来),然后在开发工具中找 HTML 上的标识以确定预判是否正确。以下是一些比较明显的标记:
body.astro-...div#___gatsbydiv#__docusaurusdiv#__nextdiv#__nuxtnext-route-announcerdiv#VPContentVitepress
前端常用工具的文档站选型
以下基于 Docusaurus:
| 站点 | 分类 | 可参考 |
|---|---|---|
| babel | 编译 | |
| electron | 前端 App 化 | 顶栏下拉菜单 |
| format.js | 国际化 | |
| gulp | 构建 | |
| hooks-ts | React Hook | |
| immer | immutable 辅助 | |
| jest | 单元测试 | 多版本 |
| lerna | monorepo 工作流 | |
| npmpackagejsonlint | 代码质量 | |
| playwright | e2e 测试 | |
| pnpm | 包管理 | |
| prettier | 代码格式 | |
| react-live | React Playground | |
| redux-saga | 状态管理 | 自定义主题切换按钮 |
| redux-toolkit | 状态管理 | 不一样的搜索 |
| remirror | 在线编辑 | |
| stylelint | 代码质量 | |
| tauri@v1 | 前端 App 化 | 顶栏下拉菜单 |
| testing-library | 单元测试 | |
| verdaccio | NPM 仓库 | 多版本、多语言 |
以下基于其他框架
| 站点 | 分类 | 使用框架 |
|---|---|---|
| atlassian design | 设计系统 | Gatsby |
| biome | 代码质量 | Astro |
| commitlint | Git 工作流 | Vitepress |
| cypress | e2e 测试 | Next |
| eslint | 代码质量 | ? |
| highlight.js | 代码高亮 | Next |
| husky | Git 工作流 | Vitepress |
| mermaid | 文字转图表 | Vitepress |
| npm docs | NPM | Gatsby |
| parcel | 构建 | ? |
| radashi | 工具集 | Astro |
| react | Lib | Next |
| rollup | 构建 | Vitepress |
| shiki | 代码高亮 | Vitepress |
| styled-components | Css-in-JS | Next |
| tauri | 前端 App 化 | Astro |
| typescript | 编译 | Gatsby |
| use-hooks | React Hook | Astro |
| vite | 构建 | Vitepress |
| vitest | 单元测试 | Vitepress |
| vue | Lib | Vitepress |
| webpack | 构建 | ? |
| zustand | 状态管理 | Next |
关于技术文档的一些文章
- Writing useful Documentation 从读者的角度出发写文档,技术写作的意见和建议(包括用词、结构等)
- Create fast, modern API docs using Docusaurus API 文档的重要性、推荐工具、为何用 Docusaurus 以及如何使用
- How to Write Good API Documentation API 文档的结构和建议
- How to write effective documentation for your open source project 一些写文档的 Tip
- Documentation by Developers 作为开发者,写文档非常重要,以及有哪些文档类型
🙋 FAQ
❓ 为什么不选 Storybook?
首先要说明的是,个人非常喜欢 storybook,在我的项目中少不了它。
Storybook 非常受欢迎,它不仅仅是一个 UI 测试框架,甚至可以用它写文档,甚至写文档非常方便(支持 MDX,并且只需要一行配置就可以自动生成相关的文档)。
而且已经有不少团队已经在用 Storybook 辅助生成文档,一些例子:
我不选择它作为文档基座,有以下原因:
- Storybook 自己没用它来写文档
- Storybook 自动生成的文档比较生硬,不像自己写那样自然
- 没有全局搜索
- 左侧树状导航很紧凑,没有层次感,影响阅读
- 生成的文档默认没有 TOC,但应该可以加上,比如 circuit.sumup.com 有个比较丑的 TOC
❓ 如何显示代码行号?
Docusaurus 并没有提供全局开启代码行号的配置,但你可以针对特定的一块代码显示行号,给代码块加上 showLineNumbers 即可。
我认为这样的按需策略是正确的,毕竟多数情况下,两三行的代码,并不需要行号。
md
体验AI代码助手
代码解读
复制代码\`\`\`type showLineNumbers
...code...
\`\`\`
❓ 如何增加代码高亮的语言种类?
Docusaurus 使用 Prism 对代码块进行高亮处理,并且内置了一些常用语言,但可能漏了你需要的,比如我们经常会在文档中写一些命令行,就没有高亮。
在配置项中,增加 prism.additionalLanguages:
ts
体验AI代码助手
代码解读
复制代码export default {
// ...
themeConfig: {
// ...
prism: {
// ...
additionalLanguages: ['bash']
}
}
};
注意,填 Prism 不支持的语言会导致运行时报错,从而白屏。更多内容可以看 Code Blocks - Supported Languages。
❓ 如何 include Markdown/MDX 代码片段?
比你想象的简单,但仅支持在 MDX 中引别处的 Markdown 或 MDX,只需要 import,然后把它当成 React 组件进行渲染即可:
mdx
体验AI代码助手
代码解读
复制代码---
sidebar_position: 100
title: 变更历史
---
import Changelog from '../../../CHANGELOG.md';
<Changelog />
被 import 的文件,甚至不必须在文档项目目录下,比如以上的 CHANGELOG.md,其实位于 Monorepo 根目录下。
作者:驳是 链接:https://juejin.cn/post/7518188007541489704 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。