生命周期与清理
插件的清理逻辑通过 context.lifecycle 注册。0.2 的核心语义是:所有清理路径可等待,且钩子持久保留——disable/enable 反复切换时会重复触发。
注册清理钩子
typescript
export default function (context: Context) {
context.lifecycle.onStart(async () => {
await openResources(); // 每次 enable 都会执行
});
context.lifecycle.onStop(async () => {
await releaseResources(); // 禁用、卸载与框架停止都会等待此处完成
});
}四个钩子阶段(完整状态机见 核心概念):
onStart:enable 时按注册顺序执行;允许返回一个清理回调,该回调属于当前启动周期,随下一次 stop 执行一次;onBeforeStop:停止时最先执行,用于停止前的通知;onStop:清理钩子,按注册逆序执行;onDispose:终态钩子,仅在卸载(子作用域销毁)时执行一次。
触发时机
| 操作 | 触发的钩子 |
|---|---|
saukko plugin enable | onStart |
saukko plugin disable | onBeforeStop → onStop |
saukko plugin uninstall | (若启用则先走 disable)→ onDispose |
框架停止(App.stop()) | 按依赖拓扑逆序卸载全部插件 |
| 服务替换触发的 联动重启 | onStop → onStart(同一 Context 上) |
其他保证:
- 单个插件清理失败不会阻断其余插件的停止,失败最终汇总;
- 重复停止是幂等的,同一周期的清理不会重复执行;
- 插件卸载时,其事件监听与子作用域登记的资源一并释放;
- disabled 插件不接收事件:
context.on注册的监听在禁用期间被门控,重新启用后自动恢复,无需重新注册。
失败与重试
- 插件安装失败(主体抛错):框架清理其子作用域且不留安装记录,修正问题后重新
install即可。 - 插件启用失败(
onStart钩子抛错):已启动的资源自动清理,生命周期进入 FAILED,插件保持未启用,可直接重试enable。 - 插件清理失败:禁用状态正常落账;卸载场景中插件保持已禁用状态,可重试卸载。
注意事项
生命周期钩子的所有权属于框架:插件只注册钩子与观察状态,启动与停止由框架驱动。请勿在插件内主动调用 context.lifecycle.start() / stop()。