使用 MDX

Rspress 支持 MDX,这是一种功能强大的内容开发方式。

Markdown

MDX 是 Markdown 的超集,这意味着你可以像往常一样编写 Markdown 文件。例如:

  1. # Hello World

使用组件

当你想在 Markdown 文件中使用 React 组件时,你应该使用 .mdx 扩展名来命名你的文件。例如:

index.mdx

  1. import { CustomComponent } from './custom';
  2. # Hello World
  3. <CustomComponent />

所有的 mdx 文件也被视为组件,它们可以被互相引用:

  1. import Foo from './shared/foo.mdx';
  2. # Hello world
  3. <Foo />

TIP

相关组件需要通过 route.exclude 配置从路由信息中排除。

你也可以将组件放到 root 以外的相邻目录,例如:

  1. // <cwd>/docs/index.mdx
  2. import { Button } from '../components/button';
  3. # Button
  4. <Button />
  5. // <cwd>/components/button.mdx
  6. export Button = () => <button />;

Front Matter

你可以在 Markdown 文件的开头添加 Front Matter,它是一个 YAML 格式的对象,用于定义一些元数据。例如:

  1. ---
  2. title: Hello World
  3. ---

注意:默认情况下,Rspress 使用 h1 标题作为 html 的标题。

你还可以在正文中访问 Front Mattter 中定义的属性,例如:

  1. ---
  2. title: Hello World
  3. ---
  4. # {frontmatter.title}

前面定义的属性将作为 frontmatter 属性传递给组件。所以最终输出将是:

  1. <h1>Hello World</h1>

自定义容器

::: 语法

你可以使用 ::: 语法来创建自定义容器,且支持自定义标题。例如:

输入:

  1. :::note
  2. 这是一个 `note` 类型的 `block`
  3. :::
  4. :::tip
  5. 这是一个 `tip` 类型的 `block`
  6. :::
  7. :::info
  8. 这是一个 `info` 类型的 `block`
  9. :::
  10. :::warning
  11. 这是一个 `warning` 类型的 `block`
  12. :::
  13. :::danger
  14. 这是一个 `danger` 类型的 `block`
  15. :::
  16. :::details
  17. 这是一个 `details` of type `block`
  18. :::
  19. :::tip 自定义标题
  20. 自定义标题的 `block`
  21. :::
  22. :::tip{title=自定义标题}
  23. 自定义标题的 `block`
  24. :::

输出:

NOTE

这是一个 note 类型的 block

TIP

这是一个 tip 类型的 block

INFO

这是一个 info 类型的 block

WARNING

这是一个 warning 类型的 block

DANGER

这是一个 danger 类型的 block

DETAILS

这是一个 details of type block

自定义标题

自定义标题的 block

自定义标题

自定义标题的 block

GitHub Markdown Alerts 语法

你可以使用 GitHub Markdown Alerts 语法 来创建自定义容器。

Input:

  1. > [!NOTE]
  2. > 这是一个 `note` 类型的 `block`
  3. > [!TIP]
  4. > 这是一个 `tip` 类型的 `block`
  5. > [!INFO]
  6. > 这是一个 `info` 类型的 `block`
  7. > [!WARNING]
  8. > 这是一个 `warning` 类型的 `block`
  9. > [!DANGER]
  10. > 这是一个 `danger` 类型的 `block`
  11. > [!DETAILS]
  12. > 这是一个 `details` 类型的 `block`

Output:

NOTE

这是一个 note 类型的 block

TIP

这是一个 tip 类型的 block

INFO

这是一个 info 类型的 block

WARNING

这是一个 warning 类型的 block

DANGER

这是一个 danger 类型的 block

DETAILS

这是一个 details 类型的 block

代码块

基本使用

你可以使用 ``` 语法来创建代码块,且支持自定义标题。例如:

输入:

  1. ```js
  2. console.log('Hello World');

```js title=”hello.js” console.log(‘Hello World’);

  1. ```
  2. **输出:**
  3. ```js
  4. console.log('Hello World');

hello.js

  1. console.log('Hello World');

代码行高亮

你可以通过如下的语法指定代码行高亮,比如:

输入:

  1. ```js {1,3-5}
  2. console.log('Hello World');
  3. const a = 1;
  4. console.log(a);
  5. const b = 2;
  6. console.log(b);
  1. **输出:**
  2. ```js
  3. 1console.log('Hello World');
  4. 2
  5. 3const a = 1;
  6. 4console.log(a);
  7. 5const b = 2;
  8. 6console.log(b);

你也可以同时应用代码行高亮和代码块标题,比如:

输入:

  1. ```js title="hello.js" {1,3-5}
  2. console.log('Hello World');
  3. const a = 1;
  4. console.log(a);
  5. const b = 2;
  6. console.log(b);
  1. **输出:**
  2. hello.js
  3. ```js
  4. 1console.log('Hello World');
  5. 2
  6. 3const a = 1;
  7. 4
  8. 5console.log(a);
  9. 6
  10. 7const b = 2;
  11. 8
  12. 9console.log(b);

显示代码行号

如果你想要显示代码行号,你可以在配置文件中开启 showLineNumbers 选项:

rspress.config.ts

  1. export default {
  2. // ...
  3. markdown: {
  4. showLineNumbers: true,
  5. },
  6. };

Wrap Code

如果你想要默认启用长代码换行展示,你可以在配置文件中开启 defaultWrapCode 选项:

rspress.config.ts

  1. export default {
  2. // ...
  3. markdown: {
  4. defaultWrapCode: true,
  5. },
  6. };

自定义锚点 id

默认情况下,Rspress 会根据各个标题的内容自动生成 id,这个 id 也会作为锚点的内容,你可以通过如下的语法来自定义 header 的 id:

  1. ## Hello World \{#custom-id}

其中 custom-id 就是你自定义的 id。

关闭 Rust 版本编译器

默认情况下,Rspress 使用 Rust 版本的 MDX 编译器,但是在某些情况下,你需要添加自定义的 MDX 编译插件,此时你可以通过如下的配置关闭 Rust 版本的 MDX 编译器,从而切换到 JavaScript 版本的编译器:

是否使用 MDX 的 Rust 版本编译器,默认开启。比如:

rspress.config.ts

  1. import { defineConfig } from 'rspress/config';
  2. export default defineConfig({
  3. markdown: {
  4. // 使用 JS 版本的 MDX 编译器
  5. mdxRs: false,
  6. },
  7. });

你也可以提供函数来决定哪些文件使用 MDX 的 Rust 版本编译器。比如:

rspress.config.ts

  1. import { defineConfig } from 'rspress/config';
  2. export default defineConfig({
  3. markdown: {
  4. mdxRs: {
  5. include: (filepath: string) => filepath.includes('foo.mdx'),
  6. },
  7. },
  8. });

注意

mdxRs 能力底层基于 Rspress 自研的 @rspress/mdx-rs 库来实现,性能比 JS 版本的 MDX 编译器提升 10 倍以上,但不支持 JS 的插件。