Skip to content

生命周期与清理

插件的清理逻辑通过 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 enableonStart
saukko plugin disableonBeforeStoponStop
saukko plugin uninstall(若启用则先走 disable)→ onDispose
框架停止(App.stop()按依赖拓扑逆序卸载全部插件
服务替换触发的 联动重启onStoponStart(同一 Context 上)

其他保证:

  • 单个插件清理失败不会阻断其余插件的停止,失败最终汇总;
  • 重复停止是幂等的,同一周期的清理不会重复执行;
  • 插件卸载时,其事件监听与子作用域登记的资源一并释放;
  • disabled 插件不接收事件context.on 注册的监听在禁用期间被门控,重新启用后自动恢复,无需重新注册。

失败与重试

  • 插件安装失败(主体抛错):框架清理其子作用域且不留安装记录,修正问题后重新 install 即可。
  • 插件启用失败onStart 钩子抛错):已启动的资源自动清理,生命周期进入 FAILED,插件保持未启用,可直接重试 enable
  • 插件清理失败:禁用状态正常落账;卸载场景中插件保持已禁用状态,可重试卸载。

注意事项

生命周期钩子的所有权属于框架:插件只注册钩子与观察状态,启动与停止由框架驱动。请勿在插件内主动调用 context.lifecycle.start() / stop()

Saukko.js 系列项目均使用 Apache 2.0 协议开源。