为您的站点准备Docusaurus v3
这篇博客文章是在Docusaurus v3处于测试版时撰写的。如果您要升级到Docusaurus v3当前稳定版本,您应该注意依赖版本和升级步骤的一些变化。请使用升级指南获取最新的迁移步骤。
Docusaurus v3 现在 处于测试阶段,官方发布即将到来。这是为这个新主要版本准备你的网站的最佳时机。
Docusaurus v3 带来了一些重大变化,其中许多可以在Docusaurus v2 下处理。提前准备你的网站可以逐步完成,并且将使升级到 v3 更加容易。
主要的重大变化是从MDX v1升级到MDX v3。请阅读MDX v2和MDX v3的发布说明以获取详细信息。MDX现在将更严格地编译您的Markdown内容,并且会有细微的差异。
本文将主要关注如何为这个新的MDX版本准备您的内容,并将列出一些您现在可以处理的其他重大更改。

本文提到了大多数Docusaurus v3的重大变更,但并不详尽。请阅读v3.0.0-beta.0发布说明以获取详尽列表。
这篇博客文章中有很多内容,但许多Docusaurus v2站点只需很少的更改即可升级。
如果你的站点相对较小,只有一些自定义设置,你可能可以立即升级到Docusaurus v3。
准备工作
在准备升级到Docusaurus v3之前,我们建议先升级到最新的Docusaurus v2版本。
根据您网站的复杂性,采用我们最近介绍的视觉回归测试工作流程可能是一个好主意。它可以帮助您在Docusaurus v3升级过程中捕捉到意外的视觉副作用。
我们还建议在Markdown文件中使用JSX、import或export(即MDX功能)时使用.mdx扩展名。这在语义上更正确,并提高了与外部工具(IDE、格式化程序、linter等)的兼容性。在Docusaurus的未来版本中,.md文件将被解析为标准CommonMark,不支持这些功能。在Docusaurus v3中,.md文件仍然被编译为MDX文件,但可以选择CommonMark。
为MDX v3准备内容
MDX 是 Docusaurus 的主要依赖项,负责将您的 .md 和 .mdx 文件编译为 React 组件。
MDX v3 更好,但也带来了一些变化,可能需要您稍微重构您的内容。MDX v3 更严格,一些在 v1 下编译良好的组件现在可能在 v3 下编译失败,很可能是因为 { 和 < 字符。
升级MDX会带来MDX v2和MDX v3发布博客文章中记录的所有重大更改。大多数重大更改来自MDX v2。MDX v2迁移指南中有一个关于如何更新MDX文件的部分,这对我们特别相关。同时,请确保阅读MDX故障排除页面,它可以帮助你解释常见的MDX错误信息。
请务必阅读我们更新的MDX 和 React文档页面。
我们有一个专门的MDX v3 - 升级支持讨论。
使用MDX游乐场
MDX 游乐场是您的新好朋友。它允许您了解您的内容是如何编译为 React 组件的,并单独解决编译或渲染问题。
每个MDX版本都附带自己的游乐场:
Configuring the MDX playground options for Docusaurus
使用两个MDX游乐场并排,您很快会注意到一些内容在v3中编译方式不同或无法编译。
目标将是重构你的问题内容,使其与两个版本的MDX都能正常工作。这样,当你升级到Docusaurus v3时,这些内容将已经可以开箱即用。
使用MDX检查器CLI
我们提供了一个docusaurus-mdx-checker CLI,可以轻松发现有问题内容。今天就在你的Docusaurus v2网站上运行这个命令,以获取在MDX v3下无法编译的文件列表。
npx docusaurus-mdx-checker
对于每个编译问题,CLI 将记录文件路径和需要查看的行号。

使用此CLI来估计使您的内容与MDX v3兼容所需的工作量。
此CLI是尽力而为的,只会报告编译错误。
它不会报告那些不会产生错误但可能影响内容显示的细微编译变化。为了捕捉这些问题,我们建议使用视觉回归测试。
常见的MDX问题
我们将一些Docusaurus站点升级到了Docusaurus v3和MDX v3:
这些升级使我们能够汇总最常见的内容问题,并记录如何最好地处理它们。
错误使用 {
{ 字符用于打开 JavaScript 表达式。如果你在 {expression} 中放入的内容不是有效的表达式,MDX 现在将会失败。
The object shape looks like {username: string, age: number}
无法使用acorn解析表达式:表达式后出现意外内容
修复此错误的可用选项:
- 使用内联代码:
{username: string, age: number} - 使用HTML代码:
{ - 转义它:
\{
<的错误使用
< 字符用于打开 JSX 标签。如果 MDX 认为你的 JSX 无效,它现在会失败。
Use Android version <5
You can use a generic type like Array<T>
Follow the template "Road to <YOUR_MINOR_VERSION>"
名称前出现意外的字符
5(U+0035),期望是一个可以开始名称的字符,例如字母、$或_
在
paragraph结束标签之前,期望有一个(1:6-1:9)的闭合标签 end-tag-mismatch mdast-util-mdx-jsx
期望在
paragraph结束之前有一个(134:19-134:39)的闭合标签
修复此错误的可用选项:
- 使用内联代码:
Array - 使用HTML代码:
<或< - 转义它:
\<(不幸的是,在MDX v1下会显示\)
GFM自动链接的错误使用
Docusaurus 支持 GitHub Flavored Markdown (GFM),但 MDX 不再支持使用 语法的 autolink。
<[email protected]>
<http://localhost:3000>
名称中出现意外的字符
@(U+0040),预期应为字母、数字、$或_等名称字符;属性前的空白;或标签的结束(注意:在 MDX 中创建链接,请使用[text](url))
在本地名称之前出现意外的字符
/(U+002F),期望是一个可以开始名称的字符,例如字母、$或_(注意:在MDX中创建链接,请使用[text](url))
使用常规的Markdown链接,或者移除<和>。MDX和GFM已经能够自动链接字面量。
[email protected]
[[email protected]](mailto:[email protected])
http://localhost:3000
[http://localhost:3000](http://localhost:3000)
小写 MDXComponent 映射
对于提供自定义MDXComponent映射的用户,组件现在被“沙盒化”:
- 一个
MDXComponent映射仅用于# hi而不用于hi
- 一个小写的自定义元素名称将不再由其相应的
MDXComponent组件替换
您的 MDXComponent 组件映射 可能不会像以前那样应用,您的自定义组件可能不再被使用。
对于原生的Markdown元素,你可以继续使用小写:p,h1,img,a...
对于任何其他元素,使用大写名称。
import MDXComponents from '@theme-original/MDXComponents';
export default {
...MDXComponents,
p: (props) =>
- myElement: (props) => ,
+ MyElement: (props) => ,
};
意外的额外段落
在MDX中,现在可以更轻松地交错使用JSX和Markdown,而不需要额外的换行符。在多行上编写内容也可以产生新的预期的标签。
查看MDX v1和v3如何以不同方式呈现此内容。
<div>一些 **Markdown** 内容div>
<div>
一些 **Markdown** 内容
div>
<div>一些 **Markdown** 内容div>
<div>一些 **Markdown** 内容div>
<div>一些 <strong>Markdownstrong> 内容div>
<div><p>一些 <strong>Markdownstrong> 内容p>div>
如果你不想要额外的标签,可以根据具体情况重构内容,使用单行JSX标签。

-
- 我的图片说明
-
+ 我的图片说明
如果你的内容包含“Markdown内联元素”(**, *, _, [link](/path)),你可能无法提前重构它,必须在Docusaurus v3升级时一起进行。
指令的意外使用
Docusaurus v3 现在使用 Markdown Directives(通过 remark-directive 实现)作为一种通用方式来支持 admonitions 和其他即将推出的 Docusaurus 功能。
This is a :textDirective
::leafDirective
:::containerDirective
Container directive content
:::
指令被解析的目的是由其他Remark插件处理。未处理的指令将被忽略,并且不会以其原始形式呈现。
AWS re:Invent 会议很棒
由于 :Invent 被解析为文本指令,现在将呈现为:
AWS re
会议很棒
- 使用HTML代码:
: - 在
:后添加一个空格(如果有意义的话):: text - 转义它:
\:(不幸的是,在MDX v1下会显示\)
不支持的缩进代码块
MDX 不再将缩进文本转换为代码块。
console.log("hello");
升级通常不会产生新的MDX编译错误,但由于不再有代码块,可能会导致内容以意外的方式呈现。
使用常规的代码块语法而不是缩进:
```js
console.log('hello');
```
MDX 插件
MDX生态系统中的所有官方包(Unified、Remark、Rehype...)现在都仅支持ES模块,不再支持CommonJS。
实际上,这意味着你不能再做require("remark-plugin")了。
Docusaurus v3 现在支持 ES Modules 配置文件。我们建议您将配置文件迁移到 ES 模块,这样您可以轻松导入 Remark 插件:
import remarkPlugin from 'remark-plugin';
export default {
title: 'Docusaurus',
/* 在此处使用 remark 插件的站点配置 */
};
如果您想继续使用 CommonJS 模块,您可以使用动态导入作为变通方法,使您能够在 CommonJS 模块中导入 ES 模块。幸运的是,Docusaurus 配置支持使用异步函数来让您实现这一点。
module.exports = async function () {
const myPlugin = (await import('remark-plugin')).default;
return {
// 站点配置...
};
};
如果您创建了自定义的Remark或Rehype插件,由于新的AST结构,您可能需要重构这些插件,或者最终完全重写它们。我们创建了一个专门的支持讨论,以帮助插件作者升级他们的代码。
其他重大变更
除了MDX之外,还有其他重大变更,您可以提前为您的网站做好准备,特别是重要依赖项的主要版本升级。
Node.js 18.0
Node.js 16 已达到生命周期结束,Docusaurus v3 现在需要 Node.js >= 18.0。
在升级到Docusaurus v3之前,请先将您的Docusaurus v2站点升级到Node.js 18。
React 18.0
Docusaurus v3 现在需要 React >= 18.0。
React 18 带来了自己的重大变化,这些变化应该相对容易处理,具体取决于您为网站创建的自定义 React 代码的数量。
仅使用我们官方主题代码而不进行swizzling的简单Docusaurus站点无需做任何事情。
阅读官方的React v18.0和如何升级到React 18,并查看你的第一方React代码,以确定哪些组件可能会受到这次React 18升级的影响。
我们建议特别关注:
- 有状态组件的自动批处理
- 报告到控制台的新React水合错误
TypeScript 5.0
Docusaurus v3 现在需要 TypeScript >= 5.0。
在升级到Docusaurus v3之前,先将您的Docusaurus v2站点升级到TypeScript 5。
TypeScript 基础配置
官方的Docusaurus TypeScript配置已经从外部包@tsconfig/docusaurus重新内部化到我们的新monorepo包@docusaurus/tsconfig。
这个新包的版本与所有其他Docusaurus核心包的版本保持一致,并将用于确保TypeScript的向后兼容性以及在主要版本升级时的破坏性更改。
新的 Docusaurus v3 TypeScript 配置与之前的 Docusaurus v2 TypeScript 配置基本相同。如果你已经升级到 TypeScript 5,那么在 v2 站点上使用 Docusaurus v3 配置已经是可行的:
{
"devDependencies": {
- "@tsconfig/docusaurus": "^1.0.7",
+ "@docusaurus/tsconfig": "^3.0.0-beta.0",
}
}
{
- "extends": "@tsconfig/docusaurus/tsconfig.json",
+ "extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
}
}
警告提示
由于历史原因,我们支持一个未记录的警告 :::warning,它以红色呈现。
这是一个 Docusaurus v2 :::warning 警告提示。
然而,颜色和图标在历史上是错误的。Docusaurus v3 正式重新引入了 :::warning 警告提示,记录了它,并修复了颜色和图标。
这是一个 Docusaurus v3 :::warning 警告提示。
如果您之前使用了未记录的:::warning警告,请确保每次使用时验证黄色是否仍然是合适的颜色。如果您想保留红色,请改用:::danger。
Docusaurus v3 还弃用了:::caution警告。请将:::caution(黄色)重构为:::warning(黄色)或:::danger(红色)。
版本化侧边栏
此重大更改仅会影响在v2.0.0-beta.10(2021年12月)之前对其文档进行版本控制的Docusaurus v2早期采用者。
在创建版本 v1.0.0 时,侧边栏文件包含了一个前缀 version-v1.0.0/,该前缀 Docusaurus v3 不再支持。
{
"version-v1.0.0/docs": [
"version-v1.0.0/introduction",
"version-v1.0.0/prerequisites"
]
}
您的 Docusaurus v2 站点能够类似地处理两种侧边栏格式。
您可以从版本化的侧边栏中删除无用的版本前缀。
{
"docs": ["introduction", "prerequisites"]
}
今天试试 Docusaurus v3
Docusaurus v3 现在处于测试阶段,并且已经被React-Native、Jest和我们自己的网站用于生产环境。
我们认为这个新版本的Docusaurus非常稳健,已经准备好投入生产环境。在收到我们社区早期采用者的积极反馈后,它应该很快就会正式发布。
如果您尝试升级并在3.0.0-beta.0 发布讨论线程上报告问题,我们将非常感激。
对于大多数网站来说,升级应该很容易。如果您按照这里的文档提前准备了您的网站,升级以下依赖项应该就足够了:
{
"dependencies": {
- "@docusaurus/core": "2.4.3",
- "@docusaurus/preset-classic": "2.4.3",
- "@mdx-js/react": "^1.6.22",
+ "@docusaurus/core": "3.0.0-beta.0",
+ "@docusaurus/preset-classic": "3.0.0-beta.0",
+ "@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^1.3.5",
- "react": "^17.0.2",
- "react-dom": "^17.0.2"
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "2.4.3"
+ "@docusaurus/module-type-aliases": "3.0.0-beta.0"
}
}
寻求帮助
我们将通过以下支持渠道帮助您升级:
- Docusaurus v3 - 升级支持
- Docusaurus v3 - Discord 频道 #migration-v2-to-v3
- MDX v3 - 升级支持
- MDX v3 - Remark/Rehype 插件支持
- MDX v3 - Discord 频道 #migration-mdx-v3
或者,您可以寻找一个付费的Docusaurus 服务提供商来为您执行此升级。如果您的网站是开源的,您也可以向我们的社区寻求免费、善意的帮助。
结论
Docusaurus v3 已经准备好试用,并将很快发布。本文已经为您提供了升级所需的所有主要更改的概述。
初始的3.0版本主要关注依赖性和基础设施的升级,这将使我们能够实现新的令人兴奋的功能。它还附带了一些有用的功能,我们将在最终发布说明中详细介绍。

