
2026年的前端圈,一个有趣的现象正在发生:曾经被 React 推上神坛的虚拟 DOM,正在被一种叫做 Signal 的响应式原语所挑战。从 Angular 到 Vue,从 Svelte 到 SolidJS,几乎所有主流框架都在以不同的方式拥抱 Signal。这不是一次简单的技术更替,而是前端响应式范式的一次深层演进。今天,我想聊聊这条进化路径背后的逻辑。
虚拟 DOM 的辉煌与瓶颈

2013 年,React 带着虚拟 DOM 横空出世,用一句”声明式渲染,框架替你算 diff”彻底改变了前端开发的思维方式。在那个 jQuery 手动操作 DOM 的蛮荒年代,虚拟 DOM 提供了一个优雅的抽象层:你只需要描述 UI 应该长什么样,框架负责高效地更新真实 DOM。
虚拟 DOM 的核心机制是全量重渲染 + diff 算法。当状态变化时,React 会重新构建整棵虚拟 DOM 树,然后通过 diff 算法找出新旧树的差异,最后只更新有变化的部分。这个设计在当时是革命性的——它让开发者从命令式的 DOM 操作中解放出来,专注于状态管理本身。
但辉煌之下,瓶颈也在悄然积累。第一个问题是性能粒度:虚拟 DOM 的 diff 是组件级的,即使一个组件只有一个小字段变化,整个组件的虚拟 DOM 子树都需要重新构建和比较。第二个问题是内存开销:维护一棵完整的虚拟 DOM 树意味着大量的 JavaScript 对象分配,在移动端低端设备上尤为明显。第三个问题更微妙——开发者心智负担:useMemo、useCallback、React.memo 这些性能优化手段的存在,本身就说明虚拟 DOM 的默认行为不够精细,需要开发者手动介入。
当 SolidJS 用真实 DOM + Signal 实现了比 React 快数倍的基准测试成绩时,社区的讨论开始从”虚拟 DOM 是不是最优解”转向”我们是否需要虚拟 DOM”。
Signal:细粒度响应式的回归
Signal 并非新概念。它的思想可以追溯到 2010 年代初的响应式编程(Reactive Programming)——Knockout.js 的依赖追踪、Meteor 的 Tracker,都在用类似的方式实现细粒度更新。Signal 的本质是一个携带响应式依赖追踪能力的值容器:当你读取它的值时,系统自动记录”谁依赖了这个值”;当你修改它的值时,系统精确地通知那些依赖者更新,而且只更新它们。
与虚拟 DOM 的组件级更新不同,Signal 实现的是表达式级甚至 DOM 节点级的细粒度更新。一个 Signal 变化,只有直接绑定了它的那个 DOM 节点会更新,不需要重新渲染任何组件,不需要 diff,不需要 reconcile。这意味着:
- 零 diff 开销:没有虚拟树构建和比较的过程
- 精确更新:只有真正受影响的 DOM 节点被触碰
- 自动依赖追踪:不需要手动声明 useMemo/useCallback
2026 年的框架格局已经清晰地反映了这一趋势:Vue 3 的 Composition API 底层就是 Signal;Angular 引入了 Signals API 作为一等公民;Svelte 5 的 Runes 本质上也是编译时 Signal;SolidJS 从一开始就基于 Signal 构建。甚至连 React 团队也在 React RFC 中讨论过引入类似 Signal 的响应式原语(尽管最终选择了一条不同的路径)。
更有意思的是,Signal 的复兴并非简单的”历史倒退”,而是建立在现代 JavaScript 引擎优化和编译技术进步之上的——今天的 Signal 实现比十年前精细得多,依赖追踪的开销被压到了极致。
范式转移背后的设计哲学

从虚拟 DOM 到 Signal 的转变,表面上是一次技术选型,深层次却反映了几组设计哲学的碰撞。
推(Push)vs 拉(Pull)。虚拟 DOM 采用的是”拉”模式:状态变化后,框架不知道谁需要更新,于是把整棵树重新跑一遍,通过 diff 来发现问题。Signal 采用的是”推”模式:状态变化时,依赖图已经建立好了,直接沿着依赖链推送更新。推模式的代价是建立依赖图时的追踪开销,收益是更新时的精确性。这就像消防系统的演进——从”全楼喷淋”到”精准定位火源”。
运行时 vs 编译时。React 的虚拟 DOM 是纯运行时方案,框架在运行时完成所有工作,好处是灵活、可调试工具丰富。而 Svelte 和 SolidJS 选择在编译时做更多事情——分析模板、提取依赖关系、生成精确的更新代码。编译时优化换取了运行时的极致性能,但也牺牲了一定的灵活性(HMR、动态组件等场景需要额外处理)。
框架驱动 vs 数据驱动。虚拟 DOM 让框架成为更新的中枢——”框架来决定什么时候更新、怎么更新”。Signal 则让数据本身成为更新的发起者——”数据变了,它自己知道该通知谁”。后者的心智模型更接近数据的自然流动,也更符合”单一数据源”的设计理念。
结语:没有银弹,只有权衡
写到这里,我并不想传达”Signal 会取代虚拟 DOM”这样的简单结论。虚拟 DOM 不会消失——React 的生态、调试工具、并发模式(Concurrent Mode)仍然有不可替代的价值,而且对大多数业务应用来说,虚拟 DOM 的性能已经足够好。Signal 也不是终点——它有自己的复杂度陷阱,依赖追踪在动态场景下的行为有时令人困惑,调试工具远不如 React DevTools 成熟。
真正值得思考的是:技术演进从来不是线性的。虚拟 DOM 解决了 2013 年的问题(如何让声明式渲染变得可行),Signal 解决了 2026 年的问题(如何在声明式的基础上实现极致性能)。每一代解决方案都会催生新的问题,而新的问题又会推动下一代范式。作为开发者,我们需要做的不是追逐每一个新技术潮流,而是理解每个范式解决了什么问题、引入了什么新的 tradeoff。
毕竟,理解权衡的能力,比掌握任何一个具体框架都更有价值。