插件系统
更新: 2026-05-01
状态: ✅ 稳定
概述
PluginManager 是一个独立的插件管理器,负责:
- 注册 / 安装 / 卸载插件
- 管理插件钩子
- 提供
EventEmitter兼容事件系统 - 通过
context暴露插件注册表和钩子表
重要说明
PluginManager本身不会自动接入dsl()、Validator、各类 Exporter 的执行流程。
如果你希望在验证、编译或导出阶段运行某些 hook,需要由你的集成代码显式调用pluginManager.runHook(...)。
快速开始
插件对象结构
参数说明
钩子系统
1. 自动触发的内置生命周期
这些 hook 由 PluginManager 自动触发:
2. 约定式 hook 名称
以下名称是常用约定,PluginManager 支持注册它们,但是否执行取决于你的代码是否调用 runHook():
hook()/runHook()支持任意字符串名称,不限于上表。
3. 注册与运行 hook
4. 在插件中声明 hook
事件系统
PluginManager 继承自 EventEmitter,因此可以使用:
on()once()off()emit()removeListener()removeAllListeners()
可用事件
示例
API 参考
register(plugin)
注册插件,并自动触发:
onBeforeRegister- 写入注册表 / 注册插件自带 hooks
onAfterRegisterplugin:registered
install(core, [pluginName], [options])
安装插件。
install(core):安装所有已注册插件install(core, 'name', options):安装指定插件install()时会把第三个参数context传给插件- 安装成功后触发
plugin:installed - 安装失败时触发
plugin:error,然后抛错
unregister(name, [core])
卸载插件并移除该插件注册的 hooks。
plugin.uninstall(core, context)成功后才会真正移除插件- 卸载成功后触发
plugin:uninstalled - 卸载失败时触发
plugin:error,然后抛错
uninstall(name, [core])
unregister() 的别名,兼容 v1。
hook(name, handler)
注册一个 hook 处理器。
unhook(name, handler)
移除指定 hook 处理器。
runHook(name, ...args)
异步运行某个 hook 下的全部处理器,返回结果数组。
- 单个 handler 抛错不会中断后续 handler
- 抛错时会触发
hook:error - 同时会执行
onError
has(name)
检查插件是否已注册。
get([name])
get(name):获取单个插件get():获取全部插件Map
list()
返回插件元数据数组:
clear([core])
逐个卸载所有插件,清空注册表和 hooks,最后触发 plugins:cleared。
属性
最佳实践
1. 命名
使用 kebab-case:
2. 错误处理
3. 资源清理
4. 插件间通信
故障排查
插件未生效
确认插件已注册、已安装,并且 install() 确实执行到了你的逻辑。
hook 未触发
检查两件事:
- hook 名称是否一致
- 你的代码是否真的调用了
pluginManager.runHook('hookName', ...)
当前仓库的发布方式
当前仓库已恢复 v1 风格的官方插件子路径入口,可直接使用:
schema-dsl/plugins/custom-formatschema-dsl/plugins/custom-validatorschema-dsl/plugins/custom-type-example
⚠️ 注意:官方插件子路径只补齐了 v1 已存在的三个示例插件入口;
PluginManager仍然不会自动接入validate()/compile()/ exporter 流程,hook 是否执行仍取决于你的集成代码是否显式调用runHook()。
相关文档
对应示例文件
示例入口: plugin-system.ts
说明: 覆盖自定义插件的注册 / 安装 / 卸载、runHook() 执行结果,以及官方 custom-format 子路径插件的安装效果。