依赖追踪机制
MobX 在读取 observable 时记录「谁在用」;写入时通知依赖方(computed / reaction / observer 组件)更新。核心是 Derivation(派生)+ 全局 tracking 上下文。
1. 流程(一句话)
text
autorun / render / computed.get
→ track(observable 读取)
→ observable 变更
→ propagate / 重新执行2. 关键概念
| 概念 | 作用 |
|---|---|
| Observable | 可被追踪的数据 |
| Derivation | computed、reaction、observer 渲染 |
| DependencySet | 当前 derivation 依赖哪些 observable |
| runId | 同一轮执行内去重依赖登记 |
3. 追踪发生时机
- 访问
.、数组索引、Map.get 等 → 触发reportObserved。 - Action 内默认不建立新依赖(事务边界,见 07)。
- 未在 derivation 内读取 → 不追踪(纯脚本改 observable 不会触发 UI)。
4. 优化点
- runId_:同一次执行不重复添加同一依赖边。
- lowestObserverState_:传播时跳过已是最新状态的观察者(见 03)。
5. 调试
MobX 6 trace()、spy、浏览器扩展查看依赖图;生产关闭。
6. 总结
MobX 性能来自精确依赖图,不是 Virtual DOM 全量 diff;误用(在 action 外散落赋值、巨大 autorun)会破坏这一优势。