Hook 系统 — 拦截与增强启动器方法
插件可通过 Hook 系统在启动器的方法执行前后注入逻辑:修改参数、修改返回值、阻止执行或完全替换实现。适用于功能强化、性能优化、逻辑重构(例如:为启动注入自定义 JVM 参数、为版本扫描添加虚拟版本、拦截下载等)。执行模型:Koa 式洋葱管道
每个 hook 是一个中间件函数(ctx, next) => Promise<void>,按洋葱模型执行:
- before:
await next()之前的代码,可修改ctx.args(参数) - after:
await next()之后的代码,可修改ctx.result(返回值) - 阻止:调用
ctx.prevent()跳过默认实现与后续 hook - 替换:
ctx.prevent()+ 设置ctx.result即完全替换实现 - 嵌套:多个插件按注册顺序洋葱执行,先注册者在外层
权限与声明
权限
hook:register(危险级)。manifest permissions 需包含,否则注册被拒绝。
manifest 声明(可选)
registerHook 注册。
registerHook — 注册 hook
- 权限:
hook:register - 参数:
(method: string, handler: (ctx, next) => Promise<void>) method为启动器可 hook 的方法名(见下表)- 插件停用时自动注销其全部 hooks
Context 对象
可 hook 的方法
典型示例
阻止特定实例启动
完全替换实现
修改启动参数(注入 JVM 参数)
执行位置与架构
插件 hook 函数在插件 iframe 沙箱中执行,默认实现(impl)在主窗口执行。两者经两阶段桥通信(before → impl → after),保证洋葱语义跨窗口成立:已知限制
- 仅覆盖前端方法层(用
hookable()包装器暴露的方法);后端 Rust 进程内 hook 规划中。 - 内联渲染插件(
render: "inline")的 hook 在主窗口上下文直接执行(共享同一注册表)。 - L4 WebView 插件暂未接入跨窗口 registerHook。