Skip to main content

为您的站点准备Docusaurus v3

· 14 min read
Sébastien Lorber
Docusaurus maintainer, This Week In React editor
warning

这篇博客文章是在Docusaurus v3处于测试版时撰写的。如果您要升级到Docusaurus v3当前稳定版本,您应该注意依赖版本和升级步骤的一些变化。请使用升级指南获取最新的迁移步骤。

Docusaurus v3 现在 处于测试阶段,官方发布即将到来。这是为这个新主要版本准备你的网站的最佳时机。

Docusaurus v3 带来了一些重大变化,其中许多可以在Docusaurus v2 下处理。提前准备你的网站可以逐步完成,并且将使升级到 v3 更加容易。

主要的重大变化是从MDX v1升级到MDX v3。请阅读MDX v2MDX v3的发布说明以获取详细信息。MDX现在将更严格地编译您的Markdown内容,并且会有细微的差异

本文将主要关注如何为这个新的MDX版本准备您的内容,并将列出一些您现在可以处理的其他重大更改。

为您的网站准备Docusaurus v3 - 社交卡片

warning

本文提到了大多数Docusaurus v3的重大变更,但并不详尽。请阅读v3.0.0-beta.0发布说明以获取详尽列表。

Don't be afraid

这篇博客文章中有很多内容,但许多Docusaurus v2站点只需很少的更改即可升级。

如果你的站点相对较小,只有一些自定义设置,你可能可以立即升级到Docusaurus v3

准备工作

在准备升级到Docusaurus v3之前,我们建议先升级到最新的Docusaurus v2版本

根据您网站的复杂性,采用我们最近介绍的视觉回归测试工作流程可能是一个好主意。它可以帮助您在Docusaurus v3升级过程中捕捉到意外的视觉副作用。

我们还建议在Markdown文件中使用JSX、importexport(即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 v2MDX v3发布博客文章中记录的所有重大更改。大多数重大更改来自MDX v2。MDX v2迁移指南中有一个关于如何更新MDX文件的部分,这对我们特别相关。同时,请确保阅读MDX故障排除页面,它可以帮助你解释常见的MDX错误信息。

请务必阅读我们更新的MDX 和 React文档页面。

Ask for help

我们有一个专门的MDX v3 - 升级支持讨论。

使用MDX游乐场

MDX 游乐场是您的新好朋友。它允许您了解您的内容是如何编译为 React 组件的,并单独解决编译或渲染问题。

每个MDX版本都附带自己的游乐场:

Configuring the MDX playground options for Docusaurus

要获得类似于Docusaurus v2使用的编译行为,请在MDX playground上打开这些选项:

  • 使用MDX
  • 使用remark-gfm
  • 使用remark-directive

MDX playground选项面板的截图,仅选中了“使用MDX”、“使用remark-gfm”和“使用remark-directive”选项

使用两个MDX游乐场并排,您很快会注意到一些内容在v3中编译方式不同或无法编译。

Making your content future-proof

目标将是重构你的问题内容,使其与两个版本的MDX都能正常工作。这样,当你升级到Docusaurus v3时,这些内容将已经可以开箱即用。

使用MDX检查器CLI

我们提供了一个docusaurus-mdx-checker CLI,可以轻松发现有问题内容。今天就在你的Docusaurus v2网站上运行这个命令,以获取在MDX v3下无法编译的文件列表。

npx docusaurus-mdx-checker

对于每个编译问题,CLI 将记录文件路径和需要查看的行号。

终端截图显示了一个MDX检查器CLI输出的示例,带有一些错误信息

tip

使用此CLI来估计使您的内容与MDX v3兼容所需的工作量。

warning

此CLI是尽力而为的,只会报告编译错误。

它不会报告那些不会产生错误但可能影响内容显示的细微编译变化。为了捕捉这些问题,我们建议使用视觉回归测试

常见的MDX问题

我们将一些Docusaurus站点升级到了Docusaurus v3和MDX v3:

这些升级使我们能够汇总最常见的内容问题,并记录如何最好地处理它们。

错误使用 {

{ 字符用于打开 JavaScript 表达式。如果你在 {expression} 中放入的内容不是有效的表达式,MDX 现在将会失败。

example.md
The object shape looks like {username: string, age: number}
Error message

无法使用acorn解析表达式:表达式后出现意外内容

How to prepare

修复此错误的可用选项:

  • 使用内联代码:{username: string, age: number}
  • 使用HTML代码:{
  • 转义它:\{

<的错误使用

< 字符用于打开 JSX 标签。如果 MDX 认为你的 JSX 无效,它现在会失败。

example.md
Use Android version <5

You can use a generic type like Array<T>

Follow the template "Road to <YOUR_MINOR_VERSION>"
Error messages

名称前出现意外的字符 5 (U+0035),期望是一个可以开始名称的字符,例如字母、$_

paragraph结束标签之前,期望有一个 (1:6-1:9)的闭合标签 end-tag-mismatch mdast-util-mdx-jsx

期望在paragraph结束之前有一个 (134:19-134:39)的闭合标签

How to prepare

修复此错误的可用选项:

  • 使用内联代码:Array
  • 使用HTML代码:<<
  • 转义它:\<(不幸的是,在MDX v1下会显示\

Docusaurus 支持 GitHub Flavored Markdown (GFM),但 MDX 不再支持使用 语法的 autolink

example.md
<[email protected]>

<http://localhost:3000>
Error messages

名称中出现意外的字符 @ (U+0040),预期应为字母、数字、$_ 等名称字符;属性前的空白;或标签的结束(注意:在 MDX 中创建链接,请使用 [text](url)

在本地名称之前出现意外的字符 / (U+002F),期望是一个可以开始名称的字符,例如字母、$_(注意:在MDX中创建链接,请使用 [text](url)

How to prepare

使用常规的Markdown链接,或者移除<>。MDX和GFM已经能够自动链接字面量。

example.md
[email protected]
[[email protected]](mailto:[email protected])

http://localhost:3000
[http://localhost:3000](http://localhost:3000)

小写 MDXComponent 映射

对于提供自定义MDXComponent映射的用户,组件现在被“沙盒化”:

  • 一个 MDXComponent 映射仅用于 # hi 而不用于

    hi

  • 一个小写的自定义元素名称将不再由其相应的MDXComponent组件替换
visual difference

您的 MDXComponent 组件映射 可能不会像以前那样应用,您的自定义组件可能不再被使用。

How to prepare

对于原生的Markdown元素,你可以继续使用小写ph1imga...

对于任何其他元素,使用大写名称

src/theme/MDXComponents.js
 import MDXComponents from '@theme-original/MDXComponents';

export default {
...MDXComponents,
p: (props) =>


- myElement: (props) =>
,

+ MyElement: (props) =>
,

};

意外的额外段落

在MDX中,现在可以更轻松地交错使用JSX和Markdown,而不需要额外的换行符。在多行上编写内容也可以产生新的预期的

标签。

visual difference

查看MDX v1和v3如何以不同方式呈现此内容。

example.md
<div>一些 **Markdown** 内容div>
<div>
一些 **Markdown** 内容
div>
MDX v1 输出
<div>一些 **Markdown** 内容div>
<div>一些 **Markdown** 内容div>
MDX v3 输出
<div>一些 <strong>Markdownstrong> 内容div>
<div><p>一些 <strong>Markdownstrong> 内容p>div>

How to prepare

如果你不想要额外的

标签,可以根据具体情况重构内容,使用单行JSX标签。
 

My alt
-

- 我的图片说明
-
+
我的图片说明


如果你的内容包含“Markdown内联元素”(**, *, _, [link](/path)),你可能无法提前重构它,必须在Docusaurus v3升级时一起进行。

指令的意外使用

Docusaurus v3 现在使用 Markdown Directives(通过 remark-directive 实现)作为一种通用方式来支持 admonitions 和其他即将推出的 Docusaurus 功能。

example.md
This is a :textDirective

::leafDirective

:::containerDirective

Container directive content

:::
Visual change

指令被解析的目的是由其他Remark插件处理。未处理的指令将被忽略,并且不会以其原始形式呈现。

example.md
AWS re:Invent 会议很棒

由于 :Invent 被解析为文本指令,现在将呈现为:

AWS re
会议很棒

How to prepare
  • 使用HTML代码::
  • :后添加一个空格(如果有意义的话):: text
  • 转义它:\:(不幸的是,在MDX v1下会显示\

不支持的缩进代码块

MDX 不再将缩进文本转换为代码块。

example.md
    console.log("hello");
Visual change

升级通常不会产生新的MDX编译错误,但由于不再有代码块,可能会导致内容以意外的方式呈现。

How to prepare

使用常规的代码块语法而不是缩进:

example.md
```js
console.log('hello');
```

MDX 插件

MDX生态系统中的所有官方包(Unified、Remark、Rehype...)现在都仅支持ES模块,不再支持CommonJS

实际上,这意味着你不能再做require("remark-plugin")了。

How to prepare

Docusaurus v3 现在支持 ES Modules 配置文件。我们建议您将配置文件迁移到 ES 模块,这样您可以轻松导入 Remark 插件:

docusaurus.config.js
import remarkPlugin from 'remark-plugin';

export default {
title: 'Docusaurus',
/* 在此处使用 remark 插件的站点配置 */
};

如果您想继续使用 CommonJS 模块,您可以使用动态导入作为变通方法,使您能够在 CommonJS 模块中导入 ES 模块。幸运的是,Docusaurus 配置支持使用异步函数来让您实现这一点。

docusaurus.config.js
module.exports = async function () {
const myPlugin = (await import('remark-plugin')).default;
return {
// 站点配置...
};
};

For plugin authors

如果您创建了自定义的Remark或Rehype插件,由于新的AST结构,您可能需要重构这些插件,或者最终完全重写它们。我们创建了一个专门的支持讨论,以帮助插件作者升级他们的代码。

其他重大变更

除了MDX之外,还有其他重大变更,您可以提前为您的网站做好准备,特别是重要依赖项的主要版本升级。

Node.js 18.0

Node.js 16 已达到生命周期结束,Docusaurus v3 现在需要 Node.js >= 18.0

How to prepare

在升级到Docusaurus v3之前,请先将您的Docusaurus v2站点升级到Node.js 18。

React 18.0

Docusaurus v3 现在需要 React >= 18.0

React 18 带来了自己的重大变化,这些变化应该相对容易处理,具体取决于您为网站创建的自定义 React 代码的数量。

仅使用我们官方主题代码而不进行swizzling的简单Docusaurus站点无需做任何事情。

How to prepare

阅读官方的React v18.0如何升级到React 18,并查看你的第一方React代码,以确定哪些组件可能会受到这次React 18升级的影响。

我们建议特别关注:

  • 有状态组件的自动批处理
  • 报告到控制台的新React水合错误

TypeScript 5.0

Docusaurus v3 现在需要 TypeScript >= 5.0

How to prepare

在升级到Docusaurus v3之前,先将您的Docusaurus v2站点升级到TypeScript 5。

TypeScript 基础配置

官方的Docusaurus TypeScript配置已经从外部包@tsconfig/docusaurus重新内部化到我们的新monorepo包@docusaurus/tsconfig

这个新包的版本与所有其他Docusaurus核心包的版本保持一致,并将用于确保TypeScript的向后兼容性以及在主要版本升级时的破坏性更改。

How to prepare

新的 Docusaurus v3 TypeScript 配置与之前的 Docusaurus v2 TypeScript 配置基本相同。如果你已经升级到 TypeScript 5,那么在 v2 站点上使用 Docusaurus v3 配置已经是可行的:

package.json
 {
"devDependencies": {
- "@tsconfig/docusaurus": "^1.0.7",
+ "@docusaurus/tsconfig": "^3.0.0-beta.0",
}
}
tsconfig.json
 {
- "extends": "@tsconfig/docusaurus/tsconfig.json",
+ "extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
}
}

警告提示

由于历史原因,我们支持一个未记录的警告 :::warning,它以红色呈现。

Warning

这是一个 Docusaurus v2 :::warning 警告提示。

然而,颜色和图标在历史上是错误的。Docusaurus v3 正式重新引入了 :::warning 警告提示,记录了它,并修复了颜色和图标。

warning

这是一个 Docusaurus v3 :::warning 警告提示。

How to prepare

如果您之前使用了未记录的:::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 不再支持

versioned_sidebars/version-v1.0.0-sidebars.json
{
"version-v1.0.0/docs": [
"version-v1.0.0/introduction",
"version-v1.0.0/prerequisites"
]
}
How to prepare

您的 Docusaurus v2 站点能够类似地处理两种侧边栏格式。

您可以从版本化的侧边栏中删除无用的版本前缀。

versioned_sidebars/version-v1.0.0-sidebars.json
{
"docs": ["introduction", "prerequisites"]
}

今天试试 Docusaurus v3

Docusaurus v3 现在处于测试阶段,并且已经被React-NativeJest我们自己的网站用于生产环境。

我们认为这个新版本的Docusaurus非常稳健,已经准备好投入生产环境。在收到我们社区早期采用者的积极反馈后,它应该很快就会正式发布。

如果您尝试升级并在3.0.0-beta.0 发布讨论线程上报告问题,我们将非常感激。

对于大多数网站来说,升级应该很容易。如果您按照这里的文档提前准备了您的网站,升级以下依赖项应该就足够了:

package.json
 {
"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 服务提供商来为您执行此升级。如果您的网站是开源的,您也可以向我们的社区寻求免费、善意的帮助

结论

Docusaurus v3 已经准备好试用,并将很快发布。本文已经为您提供了升级所需的所有主要更改的概述。

初始的3.0版本主要关注依赖性和基础设施的升级,这将使我们能够实现新的令人兴奋的功能。它还附带了一些有用的功能,我们将在最终发布说明中详细介绍。