插件 API

插件 API 是由 @vuepress/core 包支持的。你可以查看 Node API 来了解如何使用插件 Hooks 中的 VuePress App 实例。

概览

插件需要在初始化之前使用。基础配置项会在使用插件时立即被处理:

下列 Hooks 会在初始化 App 时处理:

下列 Hooks 会在准备文件时处理:

下列 Hooks 会在 dev / build 时处理:

查看 深入 > 架构 > 核心流程与 Hooks 来更好地理解该流程。

基础配置项

name

  • 类型: string

  • 详情:

    插件的名称。

    它会被用来识别插件,以避免多次使用同一个插件,因此应确保你的插件名称是独一无二的。

    它应遵从如下命名约定:

    • 非 Scoped: vuepress-plugin-foo
    • Scoped: @org/vuepress-plugin-foo
  • 参考:

multiple

  • 类型: boolean

  • 默认值: false

  • 详情:

    插件是否能够被多次使用。

    如果设置为 false ,当有相同名称的插件被使用时,先使用的会被后使用的替换掉。

    如果设置为 true ,相同名称的插件可以被多次使用且不会被替换。

  • 参考:

开发 Hooks

alias

  • 类型: Record<string, any> | ((app: App) => Record<string, any>)

  • 详情:

    定义路径别名。

    该 Hook 接收一个对象,或者一个返回对象的函数。

  • 示例:

  1. export default {
  2. alias: {
  3. '@alias': path.resolve(__dirname, './path/to/alias'),
  4. },
  5. }

define

  • 类型: Record<string, any> | ((app: App) => Record<string, any>)

  • 详情:

    定义全局常量。

    该 Hook 接收一个对象,或者一个返回对象的函数。

    它可以被用于向客户端文件传递变量。注意这里的值都会自动被 JSON.stringify() 处理。

  • 示例:

  1. export default {
  2. define: {
  3. __GLOBAL_BOOLEAN__: true,
  4. __GLOBAL_STRING__: 'foobar',
  5. __GLOBAL_OBJECT__: { foo: 'bar' },
  6. },
  7. }

extendsBundlerOptions

  • 类型: (options: BundlerOptions, app: App) => void | Promise<void>

  • 详情:

    Bundler 配置项扩展。

    该 Hook 接收一个函数,在参数中会收到 Bundler 配置项。

    该 Hook 可以用于修改 Bundler 配置项。

    你可以通过 app.options.bundler.name 判断用户当前使用的 Bundler。

  • 示例:

添加默认的 app.compilerOptions.isCustomElement 配置:

  1. export default {
  2. extendsBundlerOptions: (bundlerOptions, app) => {
  3. // 修改 @vuepress/bundler-vite 的配置项
  4. if (app.options.bundler.name === '@vuepress/bundler-vite') {
  5. bundlerOptions.vuePluginOptions ??= {}
  6. bundlerOptions.vuePluginOptions.template ??= {}
  7. bundlerOptions.vuePluginOptions.template.compilerOptions ??= {}
  8. const isCustomElement = bundlerOptions.vuePluginOptions.template.compilerOptions.isCustomElement
  9. bundlerOptions.vuePluginOptions.template.compilerOptions.isCustomElement = (tag) => {
  10. if (isCustomElement?.(tag)) return true
  11. if (tag === 'my-custom-element') return true
  12. }
  13. }
  14. // 修改 @vuepress/bundler-webpack 的配置项
  15. if (app.options.bundler.name === '@vuepress/bundler-webpack') {
  16. bundlerOptions.vue ??= {}
  17. bundlerOptions.vue.compilerOptions ??= {}
  18. const isCustomElement = bundlerOptions.vue.compilerOptions.isCustomElement
  19. bundlerOptions.vue.compilerOptions.isCustomElement = (tag) => {
  20. if (isCustomElement?.(tag)) return true
  21. if (tag === 'my-custom-element') return true
  22. }
  23. }
  24. },
  25. }

extendsMarkdownOptions

  • 类型: (options: MarkdownOptions, app: App) => void | Promise<void>

  • 详情:

    Markdown 配置项扩展。

    该 Hook 接收一个函数,在参数中会收到 Markdown 配置项。

    该 Hook 可以用于修改 Markdown 配置项。

  • 示例:

修改默认提取的子标题层级:

  1. export default {
  2. extendsMarkdownOptions: (markdownOptions, app) => {
  3. if (markdownOptions.extractHeaders === false) return
  4. markdownOptions.extractHeaders ??= {}
  5. if (markdownOptions.extractHeaders.level) return
  6. markdownOptions.extractHeaders.level = [2, 3, 4, 5, 6]
  7. },
  8. }

extendsMarkdown

  • 类型: (md: Markdown, app: App) => void | Promise<void>

  • 详情:

    Markdown 增强。

    该 Hook 接收一个函数,在参数中会收到一个由 markdown-it 提供的 Markdown 实例。

    该 Hook 可以用来添加额外的 markdown-it 插件、应用额外的自定义功能。

  • 示例:

  1. export default {
  2. extendsMarkdown: (md) => {
  3. md.use(plugin1)
  4. md.linkify.set({ fuzzyEmail: false })
  5. },
  6. }

extendsPageOptions

  • 类型: (options: PageOptions, app: App) => void | Promise<void>

  • 详情:

    页面配置项扩展。

    该 Hook 接收一个函数,在参数中会收到 createPage 传入的配置项。

    该 Hook 可以用于修改页面配置项。

  • 示例:

_posts 目录下的页面设置永久链接 Pattern :

  1. export default {
  2. extendsPageOptions: (pageOptions, app) => {
  3. if (pageOptions.filePath?.startsWith(app.dir.source('_posts/'))) {
  4. pageOptions.frontmatter = pageOptions.frontmatter ?? {}
  5. pageOptions.frontmatter.permalinkPattern = '/:year/:month/:day/:slug.html'
  6. }
  7. },
  8. }

extendsPage

  • 类型: (page: Page, app: App) => void | Promise<void>

  • 详情:

    页面扩展。

    该 Hook 接收一个函数,在参数中会收到一个 Page 实例。

    该 Hook 可以用来在 Page 对象上添加额外的属性,或修改现有的属性等。

    值得一提的是,针对 page.datapage.routeMeta 的改动可以在客户端代码中使用。

  • 示例:

  1. export default {
  2. extendsPage: (page) => {
  3. page.foo = 'foo'
  4. page.data.bar = 'bar'
  5. },
  6. }

在客户端组件中:

  1. import { usePageData } from '@vuepress/client'
  2. export default {
  3. setup() {
  4. const page = usePageData()
  5. console.log(page.value.bar) // bar
  6. },
  7. }

客户端文件 Hooks

clientAppEnhanceFiles

  • 类型: string | string[] | ((app: App) => string | string[] | Promise<string | string[]>)

  • 详情:

    Client App Enhancement 文件路径。

    该 Hook 接收文件绝对路径,或者一个返回路径的函数。

    该 Hook 中的文件会在客户端 App 创建后被调用,用以对其进行一些增强。

  • 示例:

  1. const { path } = require('@vuepress/utils')
  2. export default {
  3. clientAppEnhanceFiles: path.resolve(
  4. __dirname,
  5. './path/to/clientAppEnhance.js'
  6. ),
  7. }

clientAppRootComponentFiles

  • 类型: string | string[] | ((app: App) => string | string[] | Promise<string | string[]>)

  • 详情:

    Client Root Component 文件路径。

    该 Hook 接收文件绝对路径,或者一个返回路径的函数。

    该 Hook 中的组件会被渲染到客户端 App 的根节点。

  • 示例:

  1. const { path } = require('@vuepress/utils')
  2. export default {
  3. clientAppRootComponentFiles: path.resolve(
  4. __dirname,
  5. './path/to/RootComponent.vue'
  6. ),
  7. }

clientAppSetupFiles

  • 类型: string | string[] | ((app: App) => string | string[] | Promise<string | string[]>)

  • 详情:

    Client App Setup 文件路径。

    该 Hook 接收文件绝对路径,或者一个返回路径的函数。

    该 Hook 中的文件会在客户端 App 的 setup 函数中被调用。

  • 示例:

  1. const { path } = require('@vuepress/utils')
  2. export default {
  3. clientAppSetupFiles: path.resolve(__dirname, './path/to/clientAppSetup.js'),
  4. }

生命周期 Hooks

onInitialized

  • 类型: (app: App) => void | Promise<void>

  • 详情:

    该 Hook 会在 VuePress App 初始化后被立即调用。

onPrepared

  • 类型: (app: App) => void | Promise<void>

  • 详情:

    该 Hook 会在 VuePress App 完成文件准备后被立即调用。

onWatched

  • 类型: (app: App, watchers: Closable[], restart: () => Promise<void>) => void | Promise<void>

  • 详情:

    该 Hook 会在 VuePress App 启动开发服务器并开始监听文件修改后被调用。

    watchers 是一个文件监听器的数组。在修改配置文件导致重启 dev 命令时,这些监听器会被自动关闭。如果你在当前 Hook 中添加了新的监听器,你应该把它们也加入到这个数组中,确保在重启 dev 命令时它们能被正确关闭。

    restart 方法用来重启 dev 命令。调用该方法时, watchers 数组中的监听器也会被自动关闭。

onGenerated

  • 类型: (app: App) => void | Promise<void>

  • 详情:

    该 Hook 会在 VuePress App 完成静态文件生成后被立即调用。