1. TC39 Signals 提案(Stage 1)的 Signal.State/Computed/Effect 设计
TC39 Signals 提案(已进入 Stage 1)设计了哪三个核心原语?它们的语义与相互约束关系是怎样的?
- Signal.State(可读写状态单元)、Signal.Computed(派生值)、Signal.effect(副作用)三个原语
- 拉取式求值、惰性 computed 与依赖追踪的语义
- 三原语的关系:computed 依赖 state、effect 订阅依赖图
TC39 Signals 提案定义三个核心原语:Signal.State 是可变状态单元,持有一个值并支持 get/set(set 触发依赖失效);Signal.Computed 是派生计算值,基于其他 signal 计算、惰性求值并缓存(只有在被读取时才计算,依赖变化后标记失效、下次读取时重算);Signal.effect 是副作用函数,显式订阅其读取的所有 signal,依赖变化时自动重新执行(微任务中调度、批量去重)(注:官方提案目前仅包含 Signal.State、Signal.Computed 与底层 Signal.subtle,effect 由 signal-polyfill 提供,属 polyfill 层能力)。三者构成响应式图:State 是叶节点,Computed 是派生节点(只读视图、可组合),effect 是图的"输出端点"。
设计要点:一是"拉取式(pull-based)+ 脏标记"的求值模型——computed 只在被读取时按需重算,避免无谓计算;二是依赖收集是动态的(执行时记录读取的 signal,而非声明式声明),因此条件分支中的依赖变化也能被正确追踪;三是 effect 对同一轮变更批量执行一次(去重),且写入 effect 内的 signal 会触发新的调度(避免死循环有额外约束)。三原语的约束关系:computed 只能读其他 signal(不能直接写 State,保证派生可重放)、effect 可读写并产生外部副作用;提案目标是为框架提供统一底层,各框架可在其上实现自己的响应式 API。
先逐个讲清三个原语的语义(State 可变、Computed 惰性缓存、effect 副作用订阅),再讲它们构成响应式图的关系与"拉取式求值 + 动态依赖收集 + 微任务批量"三个设计机制,即完整覆盖提案核心。