Signals 与细粒度响应式(跨框架范式)

共 28 题
#

1. TC39 Signals 提案(Stage 1)的 Signal.State/Computed/Effect 设计

A Computed 在被写入 State 变化时立即重新计算
B Signal.State 是可写状态单元,Computed 是惰性求值并缓存的派生值,effect 订阅依赖变化后执行副作用 ✓ 正确答案
C effect 每次依赖变化都会同步执行多次以保证准确
D Computed 可以直接修改 State 的值
#

2. Signals 与虚拟 DOM diff 的边界,何时仍需组件级更新

A Signals 出现后虚拟 DOM 完全失去存在价值
B 虚拟 DOM diff 在值级更新上比 Signals 更高效
C 值级变化由 Signals 细粒度更新,结构级变化(增删、插槽、条件分支)仍需 diff 或结构协调机制 ✓ 正确答案
D Signals 无法更新任何 DOM 内容
#

3. Signals 与 Virtual DOM 的更新机制对比,什么场景下 Signals 收益最大?

A 虚拟 DOM 的更新成本只与实际变化量有关
B Signals 每次更新都需要重新执行整个组件的 render
C Signals 收益最大的场景是大组件树中高频局部状态更新与高频值流,其成本与变化量相关而虚拟 DOM 与组件规模相关 ✓ 正确答案
D 虚拟 DOM 在深层属性更新时比 Signals 更高效
#

4. 原生 Signals 与现有框架响应式系统的互操作路径

A 原生 Signals 的目标是取代所有框架的响应式系统
B 可通过包装(框架底层换用原生信号)、桥接(边界处同步)与适配工具实现互操作,关键是保证单向数据流与调度、生命周期对齐 ✓ 正确答案
C 原生 signal 与框架状态之间不需要任何同步机制
D 互操作只能在编译期完成,运行时无法桥接
#

5. 异步 Signal(async computed/loading 态)的提案进展,Suspense 集成与竞态处理

A computed 可以直接返回 promise 而无需状态建模
B 异步请求返回顺序不影响最终结果,无需竞态处理
C 异步派生值建模为 pending/success/error 状态机,可与 Suspense 集成,并用代次校验与取消处理请求竞态 ✓ 正确答案
D 异步 signal 无法表达加载中状态
#

6. Vue 3.5+ 的响应式重构与 Vapor Mode 对 Signals 的借鉴

A Vapor Mode 仍然依赖虚拟 DOM diff 更新视图
B Vue 3.5 的响应式重构放弃了依赖追踪机制
C Vapor Mode 只能在运行时追踪依赖,无法静态分析
D Vue 3.5 优化了响应式性能(版本计数、调度去重),Vapor Mode 通过编译期生成细粒度更新代码实现无虚拟 DOM 渲染,借鉴了 Signals 的细粒度范式 ✓ 正确答案
#

7. 如何定位响应式系统的「过度计算」与「无效依赖」

A 无效依赖是指 computed 依赖太少导致结果不更新
B 过度计算是依赖粒度过粗导致的冗余重算,无效依赖是订阅了不影响结果的节点;应通过调试工具定位并拆分粒度、收敛依赖 ✓ 正确答案
C 响应式系统的依赖集合越大更新越精确
D 过度计算只能通过减少代码量解决,无法定位
#

8. Signal 图的循环依赖检测与防护

A 循环依赖不会影响 computed 的正常求值
B 循环依赖只能靠开发者肉眼发现
C 循环依赖源于 computed 自读、相互依赖或 effect 写回读,框架通过活跃求值链检测并报错防护,设计上要求 computed 保持纯函数 ✓ 正确答案
D effect 写入自己读取的 signal 是推荐做法
#

9. 细粒度响应式与不可变数据(Immer)的协作与冲突

A 不可变状态装入 signal 并配合引用相等判定可裁剪更新,但深代理的字段级追踪与不可变整体替换存在粒度冲突,应分层使用 ✓ 正确答案
B 不可变数据必须搭配深代理才能用于 Signals
C Immer 的 produce 与 Signals 完全冲突,无法共存
D 引用比较会让每次更新都触发全量重算
#

10. 在大型表格/画布场景中 Signals 的渲染优化实证

A 高频值更新场景中 Signals 更新成本与变化量成正比,可通过基准对比量化收益,但虚拟滚动与批处理等渲染预算管理仍然必需 ✓ 正确答案
B Signals 的更新成本与总节点数成正比,适合大表格
C 大型表格场景中虚拟 DOM diff 比 Signals 更高效
D Signals 不需要任何渲染预算管理即可支撑大画布
#

11. 原生 Signal 作为底层、框架响应式作为上层的分层架构

A 原生信号层负责组件渲染与 DOM 更新
B 分层架构完全没有性能与心智成本
C 分层后框架不再需要任何自有响应式实现
D 底层提供通用依赖图与调度机制,上层负责渲染语义;价值是统一与互操作,风险是抽象泄漏与调度对齐成本 ✓ 正确答案
#

12. Signal 的只读视图(Signal.readonly)与封装性

A readonly 会复制一份独立的状态副本
B readonly 视图的内部修改不会反映到外部
C readonly 返回同一状态的只读视图,类型层面禁止写入,用于强化单一写入者与模块边界 ✓ 正确答案
D readonly 只影响运行时,不影响类型检查
#

13. Signals 在服务端(SSR)的水合对齐问题

A SSR 中信号只需服务端求值,客户端无需重建
B 水合时 DOM 与信号不一致会自动消失,无需处理
C effect 在服务端执行副作用是推荐做法
D 通过序列化传递服务端状态快照初始化客户端信号、effect 仅在客户端订阅执行、保证双端求值确定性,可解决水合不一致 ✓ 正确答案
#

14. 如何在 React 中通过 polyfill 使用 TC39 原生 Signals

A 通过 polyfill 与适配层(如 useSyncExternalStore 桥接)让信号驱动 React 更新,高频场景可绕过 React 渲染直接更新实例,同时需处理并发调度与清理 ✓ 正确答案
B React 组件天然支持信号订阅,无需任何适配
C 信号变化会精确重渲染单个 DOM 节点,无需组件重渲染
D polyfill 只能用于类组件
#

15. Signals 与 Angular/Vue/Solid 类型系统的统一尝试

A 各框架信号类型完全相同,无需统一
B 通过通用信号接口与转换工具层统一信号类型,但框架读写语义差异与工具链分歧使统一只能以兼容层形态落地 ✓ 正确答案
C 统一类型必须删除各框架的个性化 API
D 类型统一后各框架 Devtools 无需任何适配
#

16. Signal 与 React 状态、Vue ref、Solid store 的语义对齐与差异

A React 状态是可变的,支持直接修改值
B 四种状态原语的订阅粒度完全相同
C React 是不可变快照 + 重渲染,Vue ref 是深响应式代理,Solid 是细粒度访问器,TC39 Signal 是显式订阅的值容器,四者在读写模型与订阅粒度上各有差异 ✓ 正确答案
D Solid store 的更新是组件级粗粒度
#

17. Signals 的「拉取(lazy)」计算与响应式图(dependency graph)更新

A 状态变化先沿依赖图做脏标记传播,读取时按需重算并缓存,effect 在微任务中批量执行 ✓ 正确答案
B computed 在依赖变化时立即同步重新计算
C 每次读取 computed 都会全量重算其所有依赖
D 拉取式计算不需要缓存机制
#

18. Signal.subtle.Watcher 与 effect 的语义差异及调度时机(微任务批处理 vs 同步触发)

A effect 自动收集依赖并在微任务中批量执行副作用,Watcher 是底层受控订阅点,由调用方管理观察与调度,适合框架接入 ✓ 正确答案
B Watcher 自动管理订阅生命周期,适合业务代码直接使用
C effect 每次状态变化同步执行多次
D Watcher 与 effect 的语义完全相同
#

19. Signals 提案中「equals」函数(去重/相等判定)的作用

A equals 决定读取信号时返回哪个值
B 自定义 equals 对复杂对象深比较没有任何开销
C equals 每次读取都会执行,用于缓存结果
D equals 在写入时判定新旧值是否相等,相等则不传播更新,可用于结构相等、容差与引用相等场景以过滤无效刷新 ✓ 正确答案
#

20. Signal.Computed 的缓存失效(dirty/checked)状态机

A computed 依赖变化时立即重算并同步传播
B 状态写入先标 dirty,读取时按 clean/dirty/checking 分流重算或复用缓存,值未变的传播可停止,版本号用于快速判定 ✓ 正确答案
C dirty 状态表示缓存一定失效,必须全量重算
D 状态机只用于防止循环依赖,与缓存无关
#

21. SolidJS 的 createSignal/createStore 无虚拟 DOM 更新原理

A Solid 依赖虚拟 DOM diff 计算最小更新
B Solid 每次更新都会重建整个组件树
C 编译器把模板表达式转译为细粒度更新函数,运行时信号订阅直达对应 DOM 节点更新,createStore 基于路径代理实现不可变式更新 ✓ 正确答案
D createSignal 的 setter 只能同步更新整页
#

22. Preact Signals 如何在 React 生态中实现细粒度更新

A 信号变化仍然触发整组件重渲染与 diff
B Preact Signals 只能用于 Preact,无法用于 React
C 通过渲染期订阅与提交期精准 DOM 更新绕过组件级重渲染,但依赖 React 内部实现、对版本敏感且有并发边界限制 ✓ 正确答案
D 信号更新与 React 的 startTransition 完全无冲突
#

23. Angular Signals 与 Zone.js 解耦后的变更检测模型

A 信号在模板中被读取时建立依赖,变化时只标记并检测受影响组件,实现 zoneless 的按需变更检测 ✓ 正确答案
B 解耦后仍由 Zone.js 通知全树执行变更检测
C 信号变化时 Angular 仍会扫描全部组件绑定
D zoneless 模式不需要处理任何异步触发
#

24. 为什么 Signals 有望成为跨框架统一的状态原语

A 状态原语需求与渲染模型解耦且各框架已收敛到信号模型,统一带来互操作与工具共享,但框架差异化与标准落地节奏是主要障碍 ✓ 正确答案
B 信号模型只适合 Solid,其他框架无法借鉴
C TC39 提案已完全落地,无需框架自研实现
D 统一后所有框架必须放弃自身渲染优化
#

25. 从 Redux/MobX 迁移到 Signals 心智模型的转变

A Redux 的全局 store 应原样迁移为全局信号以保持一致性
B 迁移需从集中显式数据流转向局部信号组合,注意 computed 不应含副作用、订阅生命周期要随组件清理,并建议渐进式迁移 ✓ 正确答案
C Signals 的派生计算与 Redux selector 完全等价,无任何差异
D 信号的 effect 订阅会自动随组件销毁而清理
#

26. 细粒度响应式对高频更新(实时数据/协作编辑)的收益量化

A 细粒度响应式能优化布局重排与绘制成本
B 高频小值场景细粒度更新成本与变化量相关、与组件规模弱相关,实测吞吐显著高于组件级重渲染,但批量写、结构变化与渲染预算是收益边界 ✓ 正确答案
C 细粒度在任何场景都优于组件级更新,无边界
D 量化只需对比单次更新耗时,无需关注帧率与内存
#

27. 响应式调试工具(如 Solid Devtools)追踪依赖关系

A 工具在运行时包装信号并记录依赖与更新触发链,可排查无效依赖、过度重算、订阅泄漏与渲染根因 ✓ 正确答案
B 调试工具通过静态分析源码即可展示依赖图
C 调试工具只能显示信号值,无法显示依赖关系
D 依赖图可视化仅对框架作者有意义
#

28. 跨框架的 Signal 标准提案(TC39)现状与生态影响?

A 提案已完全落地,所有浏览器原生支持
B 提案处于 Stage 1 并配套 polyfill,落地后框架可对齐标准信号实现互操作,库与工具链围绕统一语义演进,过渡期标准信号与框架自有 API 并存 ✓ 正确答案
C 提案只影响 Solid 一个框架
D 原生支持后信号只能用于非框架代码