跳到主要内容
版本:3.8.1

插件

插件是 Docusaurus 网站中功能的基石。每个插件都处理其自己的独立功能。插件可以通过预设作为捆绑包的一部分进行工作和分发。

创建插件

插件是一个函数,它接受两个参数:contextoptions。它返回一个插件实例对象(或一个 Promise)。你可以将插件创建为函数或模块。欲了解更多信息,请参阅插件方法参考部分

函数定义

你可以将插件作为函数直接包含在 Docusaurus 配置文件中

docusaurus.config.js
export default {
// ...
plugins: [
async function myPlugin(context, options) {
// ...
return {
name: 'my-plugin',
async loadContent() {
// ...
},
async contentLoaded({content, actions}) {
// ...
},
/* other lifecycle API */
};
},
],
};

模块定义

你可以将插件用作引用独立文件或 npm 包的模块路径

docusaurus.config.js
export default {
// ...
plugins: [
// without options:
'./my-plugin',
// or with options:
['./my-plugin', options],
],
};

然后在 my-plugin 文件夹中,你可以创建类似这样的 index.js 文件

my-plugin/index.js
export default async function myPlugin(context, options) {
// ...
return {
name: 'my-plugin',
async loadContent() {
/* ... */
},
async contentLoaded({content, actions}) {
/* ... */
},
/* other lifecycle API */
};
}

你可以使用调试插件的元数据面板查看网站中安装的所有插件。

插件有以下几种类型

  • package:你安装的外部包
  • project:你在项目中创建的插件,以本地文件路径的形式提供给 Docusaurus
  • local:使用函数定义创建的插件
  • synthetic:Docusaurus 内部创建的“伪插件”,我们借此利用模块化架构,并避免核心执行过多特殊工作。你不会在元数据中看到它,因为这是一个实现细节。

你可以在客户端使用 useDocusaurusContext().siteMetadata.pluginVersions 访问它们。

插件设计

Docusaurus 的插件系统实现为我们提供了一种便捷的方式,可以挂接到网站的生命周期中,以修改开发/构建期间发生的事情,这包括(但不限于)扩展 webpack 配置、修改加载的数据以及创建要在页面中使用的新组件。

主题设计

当插件加载其内容后,数据通过 createData + addRoutesetGlobalData 等操作在客户端可用。这些数据必须序列化为纯字符串,因为插件和主题在不同的环境中运行。一旦数据到达客户端,其余部分就为 React 开发者所熟悉:数据在组件之间传递,组件通过 Webpack 捆绑,并通过 ReactDOM.render 渲染到窗口...

主题提供用于渲染内容的 UI 组件集。 大多数内容插件需要与主题配对才能真正有用。UI 是独立于数据模式的层,这使得交换设计变得容易。

例如,一个 Docusaurus 博客可能由一个博客插件和一个博客主题组成。

注意

这是一个虚构的例子:实际上,@docusaurus/theme-classic 为文档、博客和布局提供主题。

docusaurus.config.js
export default {
themes: ['theme-blog'],
plugins: ['plugin-content-blog'],
};

如果你想使用 Bootstrap 样式,你可以将主题替换为 theme-blog-bootstrap(另一个虚构的不存在的主题)

docusaurus.config.js
export default {
themes: ['theme-blog-bootstrap'],
plugins: ['plugin-content-blog'],
};

现在,尽管主题从插件接收相同的数据,但主题选择如何将数据“渲染”为 UI 可能大相径庭。

虽然主题与插件共享完全相同的生命周期方法,但主题的实现方式可能与插件的实现方式大相径庭,这取决于主题的设计目标。

主题旨在完成 Docusaurus 网站的构建,并提供你的网站、插件和主题本身所使用的组件。主题仍然像插件一样运作并暴露一些生命周期方法,但它们很可能不会使用 loadContent,因为它们只接收来自插件的数据,而不自己生成数据;主题通常还伴随着一个充满组件的 src/theme 目录,这些组件通过 getThemePath 生命周期被核心知晓。

总结

  • 主题与插件共享相同的生命周期方法
  • 主题在所有现有插件之后运行
  • 主题通过提供 getThemePath 添加组件别名。