1、MDX 和 React
MDX 和 React
Docusaurus 具有对 MDX 的内置支持,它允许你在 Markdown 文件中编写 JSX 并将它们渲染为 React 组件。
查看 MDX 文档,看看你可以使用 MDX 做哪些奇特的事情。
MDX 格式非常严格,你可能会遇到编译错误。
使用 MDX 在线运行 调试它们并确保你的语法有效。
Prettier,最流行的格式化程序,仅支持旧版 MDX v1。如果你得到无意的格式化结果,你可能需要在有问题的区域之前添加
{/* prettier-ignore */}
,或将*.mdx
添加到.prettierignore
,直到 Prettier 对 MDX v3 提供适当的支持。MDX 的主要作者之一推荐remark-cli
和remark-mdx
。
导出组件
要在 MDX 文件中定义任何自定义组件,你必须将其导出:只有以 export
开头的段落才会被解析为组件而不是散文。
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '2px',
color: '#fff',
padding: '0.2rem',
}}>
{children}
</span>
);
<Highlight color="#25c2a0">Docusaurus green</Highlight> and <Highlight color="#1877F2">Facebook blue</Highlight> are my favorite colors.
I can write **Markdown** alongside my _JSX_!
请注意它如何渲染来自 React 组件的标记和 Markdown 语法:
自己测试效果:
由于所有 doc 文件都是使用 MDX 解析的,因此任何看起来像 HTML 的东西实际上都是 JSX。因此,如果你需要对组件进行内联样式,请遵循 JSX 风格并提供样式对象。
/* Instead of this: */
<span style="background-color: red">Foo</span>
/* Use this: */
<span style={{backgroundColor: 'red'}}>Foo</span>
导入组件
你还可以导入在其他文件中定义的自己的组件或通过 npm 安装的第三方组件。
<!-- Docusaurus theme component -->
import TOCInline from '@theme/TOCInline';
<!-- External component -->
import Button from '@mui/material/Button';
<!-- Custom component -->
import BrowserWindow from '@site/src/components/BrowserWindow';
@site
别名指向你网站的目录,通常是docusaurus.config.js
文件所在的位置。使用别名而不是相对路径 ('../../src/components/BrowserWindow'
) 可以使你在移动文件或 版本控制文档 和 translating 时免于更新导入路径。
虽然在 Markdown 中声明组件对于简单的情况非常方便,但由于有限的编辑器支持、解析错误的风险和低可重用性,它变得很难维护。当你的组件涉及复杂的 JS 逻辑时,请使用单独的 .js
文件:
src/components/Highlight.js
import React from 'react';
export default function Highlight({children, color}) {
return (
<span
style={{
backgroundColor: color,
borderRadius: '2px',
color: '#fff',
padding: '0.2rem',
}}>
{children}
</span>
);
}
markdown-file.mdx
import Highlight from '@site/src/components/Highlight';
<Highlight color="#25c2a0">Docusaurus green</Highlight>
如果你在多个文件中使用相同的组件,则无需将其导入到任何地方 - 考虑将其添加到全局范围。见下文
MDX 组件范围
除了 导入组件 和 导出组件 之外,在 MDX 中使用组件的第三种方法是将其注册到全局范围,这将使其在每个 MDX 文件中自动可用,而无需任何导入语句。
例如,给定此 MDX 文件:
- a
- list!
And some <Highlight>custom markup</Highlight>...
它将被编译为包含 ul
、li
、p
和 Highlight
元素的 React 组件。Highlight
不是原生 html 元素:你需要为其提供自己的 React 组件实现。
在 Docusaurus 中,MDX 组件范围由 @theme/MDXComponents
文件提供。与 @theme/
别名下的大多数其他导出不同,它本身不是一个 React 组件:它是从像 Highlight
这样的标签名称到它们的 React 组件实现的记录。
如果你对该组件进行 swizzle,你将找到已实现的所有标签,并且你可以通过调整相应的子组件来进一步自定义我们的实现,例如 @theme/MDXComponents/Code
(用于渲染 Markdown 代码块)。
如果你想注册额外的标签名称(如上面的 <Highlight>
标签),你应该考虑 封装 @theme/MDXComponents
,这样你就不必维护所有现有的映射。由于 swizzle CLI 还不允许封装非组件文件,因此你应该手动创建封装器:
src/theme/MDXComponents.js
import React from 'react';
// Import the original mapper
import MDXComponents from '@theme-original/MDXComponents';
import Highlight from '@site/src/components/Highlight';
export default {
// Re-use the default mapping
...MDXComponents,
// Map the "<Highlight>" tag to our Highlight component
// `Highlight` will receive all props that were passed to `<Highlight>` in MDX
Highlight,
};