进阶 docusaurus.io 2026-10-13 10:58:59 · 22 阅读

第21章 Docusaurus 第21章:文档版本控制指南

Version: 2.x版本控制 你可以使用版本控制 CLI 基于当前 docs 目录中的最新内容创建一个新的文档版本。这样一来,即使 docs 目录中的文档继续演进,这一特定版本的文档也会被保留下来,随时可以访问。 warning在开始对文档做版本控制之前,请三思——这可能会让贡献者难以帮忙改进文档! 大多数情况下你并不需要版本控制,它只会拖慢构建速度,并给代码库增加复杂度。版本控制最适合文档访问量大、且各版本之间文档变动频繁的网站。如果你的文档很少变动,就不要加版本控制。 想进一步了解版本控制的工作原理、判断它是否适合你的需求,可以继续往下读。 概述​ 一个典型的带版本控制的文档站点结构如下: website
├── sidebars.json # 当前文档版本的侧边栏
├── docs # 当前文档版本的目录
│ ├── foo
│ │ └── bar.md # https://mysite.com/docs/next/foo/bar
│ └── hello.md # https://mysite.com/docs/next/hello
├── versions.json # 标明可用版本的文件
├── versioned_docs
│ ├── version-1.1.0
│ │ ├── foo
│ │ │ └── bar.md # https://mysite.com/docs/foo/bar
│ │ └── hello.md
│ └── version-1.0.0
│ ├── foo
│ │ └── bar.md # https://mysite.com/docs/1.0.0/foo/bar
│ └── hello.md
├── versioned_sidebars
│ ├── version-1.1.0-sidebars.json
│ └── version-1.0.0-sidebars.json
├── docusaurus.config.js
└── package.json

versions.json 文件是一个按时间倒序排列的版本名称列表(从最新到最旧)。

下表说明了带版本的文件如何映射到其对应的版本及生成的 URL:

路径 版本 URL
versioned_docs/version-1.0.0/hello.md 1.0.0 /docs/1.0.0/hello
versioned_docs/version-1.1.0/hello.md 1.1.0(最新) /docs/hello
docs/hello.md 当前 /docs/next/hello

提示:docs 目录中的文件属于当前文档版本。默认情况下,当前文档版本被标记为 Next,并托管在 /docs/next/* 下,但你可以完全根据项目的发布周期进行自定义配置。

术语定义

注意我们在这里使用的术语:

  • 当前版本(Current version):放置于 ./docs 文件夹中的版本。
  • 最新版本(Latest version)/ 上一个版本(Last version):文档导航栏默认指向的版本,通常路径为 /docs。

“当前版本”由文件系统位置定义,而“最新版本”由导航行为定义。两者可能相同,也可能不同!(在上述默认配置中,它们被视为不同:当前版本位于 /docs/next,最新版本位于 /docs。)

教程

标记新版本

  1. 首先,确保当前文档版本(./docs 目录)已准备就绪,可以被冻结。
  2. 输入新的版本号。
// npm
npm run docusaurus docs:version 1.1.0

// Yarn
yarn docusaurus docs:version 1.1.0

// pnpm
pnpm run docusaurus docs:version 1.1.0

// bun
bun run docusaurus docs:version 1.1.0

当标记一个新版本时,文档版本机制将执行以下操作:

  • 复制完整的 docs/ 文件夹内容到新的 versioned_docs/version-[versionName]/ 文件夹中。
  • 基于当前的侧边栏配置(如果存在)创建带版本的侧边栏文件,保存为 versioned_sidebars/version-[versionName]-sidebars.json。
  • 将新的版本号追加到 versions.json 中。

创建新文档

  1. 将新文件放入对应的版本文件夹中。
  2. 根据版本号,在对应的侧边栏文件中包含对新文件的引用。

当前版本结构

# 新文件。
docs/new.md

# 编辑对应的侧边栏文件。
sidebars.js

旧版本结构

# 新文件。
versioned_docs/version-1.0.0/new.md

# 编辑对应的侧边栏文件。
versioned_sidebars/version-1.0.0-sidebars.json
### 更新现有版本 可以同时更新多个文档版本,因为 `versioned_docs/` 目录下的每个文件夹在发布时都代表特定的路由。 1. 编辑任意文件。 2. 提交并推送更改。 3. 这些更改将发布到对应版本中。 示例:如果您修改 `versioned_docs/version-2.6/` 中的任何文件,这只会影响 2.6 版的文档。 ### 删除现有版本 您也可以删除版本。 从 `versions.json` 中移除该版本。 示例: [ "2.0.0", "1.9.0", - "1.8.0" ] 删除对应的版本文档目录。示例:`versioned_docs/version-1.8.0`。 删除对应的版本侧边栏文件。示例:`versioned_sidebars/version-1.8.0-sidebars.json`。 ### 配置版本行为 “当前”版本(current)是指 `./docs` 文件夹的版本名称。管理版本的方式多种多样,但以下两种模式非常常见: 1. 发布 v1 后,立即开始开发 v2(包括其文档)。此时,当前版本是 v2,位于 `./docs` 源文件夹中,可通过 `example.com/docs/next` 访问。最新版本是 v1,位于 `./versioned_docs/version-1` 源文件夹中,大多数用户通过 `example.com/docs` 访问该版本。 2. 发布 v1 后,在考虑 v2 之前会维护一段时间。此时,当前版本和最新版本都将指向 v1,因为 v2 的文档尚未存在! Docusaurus 的默认设置非常适合第一种场景。我们会将当前版本标记为 “next”,您甚至可以选择不发布它。 对于第二种场景:如果您发布 v1 且近期不打算开发 v2,为了避免版本化 v1 并维护两个文档文件夹(`./docs` 和 `./versioned_docs/version-1.0.0`),您可以尝试“假装”当前版本是一个裁剪版,通过为其分配一个路径和标签来实现: docusaurus.config.js module.exports = { presets: [ '@docusaurus/preset-classic', docs: { lastVersion: 'current', versions: { current: { label: '1.0.0', path: '1.0.0', }, }, }, ], }; ./docs 中的文档将部署到 /docs/1.0.0 而不是 /docs/next,1.0.0 会成为导航栏下拉菜单中默认链接的版本,而且你只需维护一个 ./docs 文件夹。 我们提供了以下插件选项来自定义版本行为: disableVersioning:即使存在版本也显式禁用版本管理,这样站点只会包含当前版本。 includeCurrentVersion:是否包含文档的当前版本(即 ./docs 文件夹)。 提示:如果当前版本还在开发中、尚未准备好发布,可以关闭它。 lastVersion:设置“最新版本”(即 /docs 路由)指向哪个版本。 提示:如果你的当前版本是一个持续修复并发布的大版本,那么 lastVersion: 'current' 是合理的。最新版本的实际路由路径和标签都是可配置的。 onlyIncludeVersions:从 versions.json 中选取一个版本子集进行部署。 提示:在开发和部署预览时限制为 2 到 3 个版本,可以缩短启动和构建时间。 versions:版本元数据的字典。对每个版本,你可以自定义以下内容: label:版本下拉菜单和横幅中显示的标签。 path:该版本的路由基础路径。默认情况下,最新版本是 /,当前版本是 /next。 banner:可选值为 'none'、'unreleased' 和 'unmaintained',决定每个文档页面顶部显示什么。比最新版本更高的版本会显示"unreleased",更低的版本则显示"unmaintained"。 badge:在该版本的文档页面顶部显示带有版本名称的徽章。 className:为该版本文档页面的 元素添加自定义 className。 更多细节请参考 docs plugin configuration。 Navbar items​ 我们提供了几种导航栏组件,帮你快速搭建导航,而无需关心版本化的路由。 doc:指向某个文档的链接。 docSidebar:指向某个侧边栏第一项的链接。 docsVersion:指向当前浏览版本主文档的链接。 docsVersionDropdown:包含所有可用版本的下拉菜单。 这些链接会按以下顺序查找合适的目标版本: 当前浏览的版本:如果用户正在浏览此文档插件提供的页面,就使用该版本。如果不在文档页面上,则回退到…… 用户偏好的版本:用户上次浏览的版本。如果没有历史记录,则回退到…… 最新版本:默认导航到的版本,由 lastVersion 选项配置。 推荐做法​ 只在必要时创建文档版本​ 举个例子:你在为 npm 包 foo 编写文档,当前版本是 1.0.0。之后你发布了一个修复小 bug 的补丁版本,变成了 1.0.1。 需要为此创建新的文档版本 1.0.1 吗?大概率不需要。按照 semver 的语义,1.0.1 和 1.0.0 的文档不应有区别,因为没有新功能!为它创建新版本只会产生不必要的重复文件。 控制版本数量​ 根据经验,尽量把版本数量控制在 10 个以内。否则你很可能会积累大量早已无人阅读的过时文档。例如,Jest 目前版本是 27.4,但只维护最近的几个文档版本,最低到 25.X。保持精简 😊 归档旧版本如果你把站点部署在 Jamstack 服务商上(如 Netlify),服务商会把每次生产构建保存为不可变 URL 下的快照。你可以把不再重新构建的归档版本作为外部链接指向这些不可变 URL。Jest 官网和 Docusaurus 官网都采用了这种做法,以减少持续构建的版本数量。 在文档中使用绝对路径导入​ 不要在文档中使用相对路径导入。因为创建版本后路径会失效(嵌套层级不同,还有其他原因)。你可以使用 Docusaurus 提供的 @site 别名,它指向站点目录。例如: - import Foo from '../src/components/Foo';
+ import Foo from '@site/src/components/Foo';
通过文件路径链接文档 使用 .md 扩展名的相对文件路径引用其他文档,以便 Docusaurus 在构建时将它们重写为实际的 URL 路径。文件将链接到对应的正确版本。 [@hello](hello.mdx#paginate) 文档非常出色。

详情请参阅 [教程](../getting-started/tutorial.mdx)。
全局或版本化的资源 你需要决定像图片和文件这类资源是按版本管理还是跨版本共享。 如果资源需要版本化,将其放在 docs 版本目录中,并使用相对路径: ![img alt](./myImage.png)

[下载此文件](./file.pdf)
如果资源是全局的,将其放在 /static 目录中,并使用绝对路径: ![img alt](/myImage.png)

[下载此文件](/file.pdf)

评论 (0)