跳到主要内容

插件

Plugin 为第三方开发者提供了完整的自定义 CLI 行为的能力。通过 Plugin,你可以在编译过程的各个阶段介入,修改生成的代码或添加自定义逻辑。

快速开始

一个最简单的 Plugin 只需要实现 apply 方法:

import { Plugin } from '@keq-request/cli'

export class MyPlugin implements Plugin {
  apply(compiler) {
    console.log('插件已加载!')
  }
}

然后在配置文件中启用 Plugin

.keqrc.ts
import { defineKeqConfig } from "@keq-request/cli"
import { MyPlugin } from "./my-plugin"

export default defineKeqConfig({
  outdir: "./src/apis",
  modules: {
    catService: "./cat-service-swagger.json",
  },
  plugins: [new MyPlugin()],
})

编译生命周期

Plugin 可以通过 Hooks 在编译的各个阶段介入。 因此,在深入了解 Hooks 之前,需要先理解 @keq-request/cli 的编译流程。 整个编译过程分为 4 个阶段,按顺序执行:

1. Setup - 加载配置

加载 .keqrc 配置文件和 .keqignore 忽略规则。

数据输出context.rc(配置信息)、context.matcher(匹配规则)

2. Download - 下载文档

从本地或远程加载 Swagger 3.1 文档

数据输出context.documents(规范化后的文档)

3. Compile - 生成代码

将 OpenAPI 文档编译为 TypeScript 代码文件。

数据输出context.artifacts

4. Persist - 写入文件

context.artifacts 写入磁盘,并将 context.matcher 写入 .keqignore 文件。

Hooks

CLI 基于 tapable 实现了钩子系统。完整的 Hooks 列表如下:

钩子名称触发时机类型参数
setupSetup 阶段开始时(并行)AsyncParallelHook[TaskWrapper]
afterSetupSetup 阶段完成后AsyncSeriesHook[TaskWrapper]
beforeDownloadDownload 阶段开始前AsyncSeriesHook[TaskWrapper]
download自定义文档下载逻辑AsyncSeriesBailHook[address: string, module: ModuleDefinition, task: TaskWrapper]
afterDownloadDownload 阶段完成后AsyncSeriesHook[TaskWrapper]
beforeCompileCompile 阶段开始前AsyncSeriesHook[TaskWrapper]
compileCompile 阶段执行时(并行)AsyncParallelHook[TaskWrapper]
afterCompileCompile 阶段完成后AsyncSeriesHook[TaskWrapper]
beforePersistPersist 阶段开始前AsyncSeriesHook[TaskWrapper]
persistPersist 阶段执行时(并行)AsyncParallelHook[TaskWrapper]
afterPersistPersist 阶段完成后AsyncSeriesHook[TaskWrapper]
done所有阶段完成后SyncHook[]

示例:自定义下载逻辑

export class CustomDownloadPlugin implements Plugin {
  apply(compiler) {
    compiler.hooks.download.tapPromise('CustomDownloadPlugin', async (address, module, task) => {
      if (address.startsWith('custom://')) {
        // 自定义下载逻辑
        return await fetchFromCustomSource(address)
      }
      // 返回 undefined 表示此插件不处理
      return undefined
    })
  }
}