可逆副作用是 Cordis 最核心的特性,也是其实现安全热插拔与无残留卸载的基础。
插件的所有副作用都通过上下文对象上的 ctx.effect() 方法注册。调用时立即执行注册逻辑,同时必须返回一个清理函数,运行时把清理函数存入该插件 Fiber 的处置栈中。例如注册一个定时器时,立即执行的逻辑里启动定时器,返回的清理函数里清除该定时器,二者成对交出。
当插件被卸载时,Cordis 会沿着依赖树自动撤销该插件注册的一切:事件监听、定时器、提供的服务、注册的命令等,全部按照注册的逆序(LIFO)逐一调用对应的清理函数。整个过程由运行时完成,插件作者无需手写清理逻辑,也不会因为遗漏某一项清理而导致资源泄漏。
ctx.effect() 常与生成器配合使用,可以做到分步注册、分步回滚:初始化过程中如果中途报错,已经执行过的操作可以被精准回滚,不会留下执行到一半的中间状态。这一能力使得插件的加载与卸载都具备原子性,是"创造模式"下运行时动态装卸插件仍能保持系统干净的关键。