跳到主要内容

发布 Docusaurus 3.0

·阅读13分钟
Sébastien Lorber
Docusaurus 维护者,《本周 React》编辑

今天,我们很高兴地 宣布 Docusaurus 3.0!🥳

Meta Open Source,我们相信 Docusaurus 将帮助您以最少的精力构建最佳文档网站,让您专注于真正重要的事情:编写内容。

这是 Docusaurus 的一个新主要版本,带来了令人兴奋的新功能和升级的依赖项。

遵循 Semantic Versioning 原则,此版本包含重大更改,我们已在 v3 升级指南中详细记录。重大更改可能很麻烦,但它们是为我们计划实现新一波 Docusaurus 功能奠定基础所必需的。

v3.0 social-card image

我们最初计划更频繁地发布主要版本,但 Docusaurus v3 的发布时间比预期要长。在我们累积的重大更改中,升级到 MDX v3 可能是采用此新版本的主要挑战。我们额外努力使此次升级尽可能简单,特别是通过添加 MDX v1 兼容性选项

最简单的站点只需升级少量 npm 依赖项。对于更复杂的站点,我们提出了一些策略,可以帮助您更自信地升级

关于 Docusaurus v2

根据我们的 发布流程,Docusaurus v2 现已进入维护模式。它将仅在3个月内(直至2024年1月31日)获得重大安全问题的支持。建议在此时间段内升级到 v3。

重大更改

本节仅提供快速概览。所有重大更改都已在 v3 升级指南中详细记录。

Docusaurus v3 升级了一些依赖项到新的主要版本,每个版本都带有其自身的重大更改

  • Node.js v16 到 v18
  • React v17 到 v18
  • MDX v1 到 v3
  • TypeScript v4 到 v5
  • prism-react-renderer v1 到 v2
  • react-live v2 到 v4
  • Mermaid v9 到 v10
  • import-fresh v3 到 jiti v1
  • remark-emoji v2 到 v4

一个典型的 package.json 依赖项升级如下

package.json
 {
"dependencies": {
// upgrade to Docusaurus v3
- "@docusaurus/core": "2.4.3",
- "@docusaurus/preset-classic": "2.4.3",
+ "@docusaurus/core": "3.0.0",
+ "@docusaurus/preset-classic": "3.0.0",
// upgrade to MDX v3
- "@mdx-js/react": "^1.6.22",
+ "@mdx-js/react": "^3.0.0",
// upgrade to prism-react-renderer v2.0+
- "prism-react-renderer": "^1.3.5",
+ "prism-react-renderer": "^2.1.0",
// upgrade to React v18.0+
- "react": "^17.0.2",
- "react-dom": "^17.0.2"
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
},
"devDependencies": {
// upgrade Docusaurus dev dependencies to v3
- "@docusaurus/module-type-aliases": "2.4.3",
- "@docusaurus/types": "2.4.3"
+ "@docusaurus/module-type-aliases": "3.0.0",
+ "@docusaurus/types": "3.0.0"
}
"engines": {
// require Node.js 18.0+
- "node": ">=16.14"
+ "node": ">=18.0"
}
}

除了 MDX v3,这些升级的依赖项带来的大多数重大更改已在内部为您处理:大多数情况下,您无需做任何事情。除了依赖项,唯一明确来自 Docusaurus 代码库的功能性重大更改是

  • #9189:新的默认博客 RSS feed 限制为 20 条
  • #9308:修复并重新引入 :::warning 警告框,弃用 :::caution
  • #9310:移除旧版带版本号的侧边栏 ID 前缀,用于 v2.0.0-beta.10 之前(2021年12月)的版本化站点
  • #7966:重构文档主题组件,最终可能需要您重新覆盖它们

亮点

以下是此新版本带来的一些有用新功能的非详尽列表。所有功能都列在 Docusaurus v3.0.0 发布说明中。

Markdown

Docusaurus v3 从 MDX v1 升级到 MDX v3

这个新的 MDX 版本对内容作者和插件作者来说更好,并为实现新的令人兴奋的 Markdown 功能奠定了基础。

MDX v3 - 主要挑战

从 MDX v1 过渡到 MDX v3 是 Docusaurus v3 采用的主要挑战

一些在 Docusaurus v2 下成功编译的文档现在可能在 Docusaurus v3 下编译失败,而另一些可能呈现不同

大多数重大更改来自 MDX v2,而 MDX v3 是一个相对较小的版本。 MDX v2 迁移指南有一个关于如何更新 MDX 文件的部分,这对我们来说特别相关。另外,请务必阅读MDX 故障排除页面,它可以帮助您理解常见的 MDX 错误消息。

不要被吓倒。大多数问题都易于修复,并且通常与您现在需要转义的 {< 字符有关。但是,根据您的站点大小,您可能需要编辑许多文件并感到不知所措。因此,我们提供了一个命令 npx docusaurus-mdx-checker 来帮助您估算所需的工作量,我们建议您提前准备您的站点

如果您创建了自定义 MDX 插件(Remark/Rehype),则 AST 略有不同,您可能需要重构它们。

这使我们能够添加一个 CommonMark 模式,这将使现有文档更容易采用 Docusaurus。它目前是选择性加入的,并且是实验性且有限的(一些 Docusaurus 功能将无法工作)。在 Docusaurus v3 中,所有文件仍然被解释为 MDX,但我们计划在即将到来的主要版本中将 .md 文件解释为 CommonMark,并建议对任何使用 JSX 或 ES 模块的文件使用 .mdx 扩展名。

我们还引入了一种新的方式来全局配置站点的 Markdown,并计划稍后添加更灵活的选项。

docusaurus.config.js
export default {
markdown: {
format: 'mdx',
mermaid: true,
preprocessor: ({filePath, fileContent}) => {
return fileContent.replaceAll('{{MY_VAR}}', 'MY_VALUE');
},
mdx1Compat: {
comments: true,
admonitions: true,
headingIds: true,
},
},
};

Docusaurus 现在使用 remark-directive 插件来支持提示框。这还允许您创建自己的 Remark 插件,以使用自己的 自定义指令扩展 Markdown,例如 :textDirective::leafDirective:::containerDirective

ESM 和 TypeScript 配置

#9317 中,我们增加了对 ES 模块和 TypeScript 配置文件的支持,包括站点配置、文档侧边栏、插件和预设。

以下是两个 TypeScript 示例,为您提供现代化的 IDE 自动补全体验

docusaurus.config.ts
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';

const config: Config = {
title: 'My Site',
favicon: 'img/favicon.ico',
// your site config ...
presets: [
[
'classic',
{
// your preset config ...
} satisfies Preset.Options,
],
],
themeConfig: {
// your theme config ...
} satisfies Preset.ThemeConfig,
};

export default config;
sidebars.ts
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';

const sidebars: SidebarsConfig = {
docs: ['introduction'],
};

export default sidebars;

未列出内容

Docusaurus 已经支持在我们的三个内容插件(docs、blog、pages)中,draft: true 这个 front matter 选项,它允许您从生产构建中移除某些页面。

#8004 中,我们引入了一个新的 unlisted: true front matter 选项,它将使您的页面在生产构建中可用,但会“隐藏”它们,除非您拥有 URL,否则无法被发现。这使得在最终发布之前轻松征求内容反馈的工作流程成为可能。

未列出内容将

  • sitemap.xml 中排除
  • 由于 <meta name="robots" content="noindex, nofollow" /> 而从 SEO 结果中排除
  • 从博客 RSS feeds 中排除
  • 从 Algolia DocSearch 结果中排除
  • 从站点导航栏项目、文档侧边栏、博客侧边栏、博客存档、标签页等中过滤

未列出内容还将显示一个横幅,以免您在内容准备好公开发布后忘记关闭它。这是一个未列出的博客文章的示例

/tests/blog/unlisted-post

React 18

#8961 中,我们升级到了 React 18。这很重要,特别是对于逐步采用并发 React 功能,以及即将推出的令人兴奋的功能,例如构建时 React 服务器组件

这个新版本的 React 对于大多数 Docusaurus 站点来说应该是即插即用的替代品。它带来了一些重大更改,我们已在 Docusaurus 代码库内部处理了这些更改。如果您的站点使用了大量自定义 React 代码,我们建议您查看官方文章 如何升级到 React 18,特别是新的 自动批处理行为。

对 React 18 功能的实验性支持

React 18 带来了新功能

  • <Suspense>
  • React.lazy()
  • startTransition()

它们在 Docusaurus 中的支持被认为是实验性。我们未来可能需要调整集成,从而导致不同的运行时行为。

自动 JSX 运行时

Docusaurus 现在使用 “自动” JSX 运行时

在使用 React API 的 JSX 文件中,不再需要导入 React。

src/components/MyComponent.js
- import React from 'react';

export default function MyComponent() {
return <div>Hello</div>;
}

调试构建

现在可以在开发模式下构建您的静态站点了。

docusaurus build --dev
调试 React 相关问题

Docusaurus 将向控制台记录更多错误,特别是通过新的 onRecoverableError 回调函数记录 React 18 水合(hydration)错误。

这种新的构建模式对于解决 React 问题特别有用。Docusaurus 将使用 React 的开发版本,从而生成详细且可读的错误消息,而不是链接到 React 错误解码页面的压缩版本。

TypeScript

Docusaurus v3 现在需要 TypeScript 5.0 的最低版本。

我们将基础推荐的 TypeScript 配置重新内部化到一个新的官方包中

tsconfig.json
 {
- "extends": "@tsconfig/docusaurus/tsconfig.json",
+ "extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
}
}

我们还提供了更清晰、标准化的 Docusaurus 核心类型、插件和预设选项导出,您可以在全新的 TypeScript 配置文件中使用它们

docusaurus.config.ts
import type {Config} from '@docusaurus/types';
import type {Options, ThemeConfig} from '@docusaurus/preset-classic';
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';

代码块

#9316 中,我们通过 prism-react-renderer v2 升级,改进了语法高亮显示。例如,bash 参数 --save 现在有了颜色

npm install --save some-package

这个交互式代码编辑器也升级到了 react-live v4,带来了新的 sucrase 编译器。它更快、更轻量,并支持现代功能,特别是 TypeScript 类型注解。

实时编辑器
function Hello() {
  const name: string = 'World';
  return <div>Hello {name}</div>;
}
结果
加载中...

#8982#8870 中,我们还增加了对 魔术注释的支持,用于类似 TeX、Haskell 和 WebAssembly 的注释语法。

haskell.hs
stringLength :: String -> Int
stringLength [] = 0
stringLength (x:xs) = 1 + stringLength xs
matlab.m
function result = times2(n)
result = n * 2;
end
x = 10;
y = times2(x);

Mermaid 图表

#9305 中,我们升级到了 Mermaid v10.4,并增加了对异步图表渲染的支持。Docusaurus 现在能够渲染新型图表。

思维导图
象限图

查询字符串数据属性

#9028 中,我们使得通过 docusaurus-data-x 查询字符串参数来设置自定义 HTML 数据属性成为可能。这使得在另一个站点嵌入 Docusaurus iframe 更容易,并允许您使用 CSS 自定义嵌入版本的外观。

/src/css/custom.css
html[data-navbar='false'] .navbar {
display: none;
}

html[data-red-border] div#__docusaurus {
border: red solid thick;
}
/docs/?docusaurus-data-navbar=false&docusaurus-data-red-border

其他功能

其他值得提及的新功能

阅读 Docusaurus v3.0.0 发布说明以获取完整的更改列表。

总结

此版本带来了一些功能,但更重要的是升级了 Docusaurus 基础设施的许多部分

MDX 升级今年花费了我们大量时间,我们努力让这次重要的升级对大家来说不那么困难。

既然我们已经赶上了基础设施的步伐,我们将很快在即将发布的次要版本中提供有用的文档功能

我们感谢您多年来使用 Docusaurus。文档框架领域最近变得更具竞争力,我们将尽最大努力确保 Docusaurus 仍然是一个有竞争力的解决方案,以其卓越的灵活性脱颖而出。