LAYER 02 · 掌握组合语法
Effect 与 Fiber:让卸载真正完成
同步注册需要撤销函数,异步工作需要停稳协议;两者缺一不可
register → disposer · start → stop → join调用 AbortController.abort(),为什么不等于插件已经卸载?
先建立直觉
关店不只是挂出“停止营业”:还要停止接单、让厨房收尾、清点设备、归还钥匙,并确认没有员工留在里面。
MECHANISM
机制拆解
Effect 记录服务注册、监听器、计时器等可同步撤销的副作用;插件 Context dispose 时按所有权逆向执行 disposer。
Fiber 拥有持续或异步工作:先请求停止,再等待 done;只有完全停稳后,依赖它的世界才能安全拆除。
第 1 步 / 共 5 步
登记副作用
每次注册都返回并归属一个 disposer。
INVARIANTS
无论怎么扩展,都不能破坏
- 请求停止与确认停稳是两个不同阶段
- dispose 必须幂等
- 依赖方必须在提供方服务撤销前停止
FAILURE MODES
最容易踩中的坑
- ×fire-and-forget 后台 Promise
- ×只 clearInterval 却不等待当前 tick
- ×在 disposer 中抛错导致后续资源无法回收
VERIFY IN SOURCE
不要相信结论,去源码里复核
以下链接固定到官方 deepseek-harness@47f9438;查看当前上游时请留意后续 breaking changes。
KNOWLEDGE CHECK
先停十秒,再揭晓答案
为什么 HMR 最容易暴露生命周期 bug?
为什么下一章紧接在这里
有了可靠生命周期,服务与事件才能成为稳定的协作协议。