直接回答:虚拟 DOM 路线(React)状态变化后重跑组件函数生成新树再 diff 找差异;Signals 路线状态变化直接精确更新绑定的 DOM 节点,组件函数只跑一次——区别在“运行时重新推导差异”与“建立时记录依赖、变化时按依赖直达”。Signals 把响应式粒度从组件级降到表达式级,省掉了整树重渲染与 diff。
展开解析:实现对比:Solid 是纯编译时加运行时 signals——编译器把 JSX 拆成真实 DOM 创建语句加 effect 绑定,无虚拟 DOM 无组件重跑,更新就是 signal set 触发的精确赋值,性能天花板高但 JSX 写法有约束(解构破坏响应式、条件渲染要用 Show 组件);Vue 是混合——响应式是 signals 式依赖收集(ref/reactive),但渲染仍走虚拟 DOM 加编译优化,组件级 effect 触发重渲染,用运行时成本换模板表达力;Preact Signals 与 Vue 类似但以信号直绑 DOM 属性,signal 直接进 JSX 可跳过组件重渲染。共同结构:signal(值容器,get 收集依赖 set 通知)、effect/computed(消费者,自动订阅)、依赖图维护(动态依赖——每次 effect 重跑重新收集,旧订阅清除)。理论代价分析:Signals 初始化建立依赖图有成本(节点多小应用启动略慢),React 则每次更新都付 diff 税——所以微交互密集场景 signals 大胜,静态内容为主两者趋同。生态意义:TC39 正在推进 Signals 标准化提案,Angular 16+、Vue Vapor Mode 都在靠拢,这条路线已从异类变成主流演进方向。
追问方向:动态依赖为什么需要每次重收?signals 的“glitch”(中间不一致态)问题如何处理?
(约 500 字)