架构概览
本页从“状态如何读、如何写、如何扩展”三个问题出发,帮助你快速建立 IO 运行时心智模型。
1. 先看全局:四层运行时
Section titled “1. 先看全局:四层运行时”IO 的运行时由四个核心层组成:
- 状态层:
Unit(叶子值)与Tree(Scope/Array)构成可读写的状态网格。 - 派生层:
derived()用信号系统追踪读取,提供只读计算值。 - 日志层:每次写入生成
patch,聚合成update,支持回放与撤销。 - 扩展层:
withBehaviors()将持久化、调度、DevTools 等能力注入视图。
flowchart TD A[Write: set/commit] --> B[Create patches] B --> C[Mark dirty & bump revision] C --> D[Emit update] D --> E[Emit value] E --> F[Subscribers render] G[Read: get/snapshot] --> H[Snapshot cache]
2. 关键模块与职责
Section titled “2. 关键模块与职责”core/:io()、ioTree()与derived()入口。负责把 plain object/array 转成树结构。units/:Unit的实现,维护 revision、值缓存与订阅。extensions/:行为扩展与IoView适配(persist/schedule/devtools)。utils/:批处理、更新日志、快照冻结、调度与类型定义。container/:树节点缓存与 path 索引工具。
代码位置:
packages/io/src/lib/。
3. 读取路径(Read)
Section titled “3. 读取路径(Read)”get()会记录依赖(用于derived的依赖追踪)。snapshot()返回冻结快照,适合序列化、日志与跨层传递。- 树节点会做快照缓存,只在相关路径脏时重建局部快照。
4. 写入路径(Write)
Section titled “4. 写入路径(Write)”set/commit会生成patch,递增 revision。- 写入过程会标记脏节点,并触发
subscribeUpdate与subscribe。 - 批处理
batch()会合并多次更新,减少重复通知。
5. 订阅模型(值流 vs 变更流)
Section titled “5. 订阅模型(值流 vs 变更流)”subscribe(fn)关注“新值”(常用于 UI)。subscribeUpdate(fn)关注“发生了什么变化”(patch/revision)。- 在树根订阅
subscribeUpdate可捕获整个 store 的变更流。
6. 扩展机制
Section titled “6. 扩展机制”withBehaviors(view, [persist(), schedule(), devtools()])返回增强视图。- 行为通过
IoView统一接口扩展get/set/subscribe。 extensions挂载扩展实例,destroy()统一清理资源。
7. 框架适配层
Section titled “7. 框架适配层”- React/Vue/Svelte 适配统一依赖
snapshot() + subscribe()。 - 适配器通过调度策略合并通知,降低重渲染抖动。
8. 实践建议
Section titled “8. 实践建议”- 业务读操作优先
snapshot(),计算依赖用get()。 - 多字段联动更新优先
commit(),避免碎片通知。 - 需要追踪变更时,在根上订阅
subscribeUpdate()并落日志。