React 已死?不,是 React 的“舒适区”正在崩塌
过去十年,React 以“UI = f(state)”的简洁公式,征服了全球前端开发者。它用组件化、单向数据流和虚拟 DOM,构筑了一座宏伟的抽象神庙。但如今,当 Solid、Svelte 5 以及 React 自己的 Server Components 开始浮出水面,我们不得不直面一个尴尬事实:React 的舒适区,正在从基石变成枷锁。
这种舒适感并非来自性能,而是来自认知惯性。React 教会我们用“渲染函数”思考,却让我们对“什么时候渲染”失去了敏感度。每一次 setState 都是一次全局心智重放,即便 React 拥有协调(Reconciliation)算法,也无法掩盖其运行时决策的盲目性。我们习惯了在 useEffect 里手动同步副作用,在 memo 里手动标记纯组件,在 useCallback 里手动稳定引用——这哪里是声明式?分明是手动的补偿式编程。
更触目惊心的是,React 的生态繁荣反而成为了范式进化的阻碍。当 Svelte 把编译时干掉虚拟 DOM,当 Solid 用细粒度响应式重建运行逻辑,当 Vue 3 的 signal 机制越来越清晰,React 社区却在用“React 方式”修补一切:比如 useMemo 依赖数组、React Compiler 的自动缓存、以及 Server Components 的“类 Async 函数”设计。这些方案无一例外,都是在不改变核心心智模型的前提下,试图用工程复杂度换回一点确定性。但真正的矛盾在于:React 的模型本质上是“推倒重来”的,这与现代交互所需的“精准定点更新”天然冲突。
对比度:虚拟 DOM 不是解药,而是症状
我们习惯性地认为虚拟 DOM 是 React 的性能护城河,这是历史上最大的误读。虚拟 DOM 之所以出现,是因为 React 无法精确知道哪个 DOM 节点需要变化,所以只能用暴力 diff 模拟“所有可能”。而 Svelte 在编译时直接生成了对 DOM 的精准操作指令,Solid 在运行时通过信号订阅建立了微观依赖图,这两者都在“知道变化”的前提下,将虚拟 DOM 变成了多余的中间层。
这里有一个残酷的换算:虚拟 DOM 本身就是“不知道”的代偿机制。当你的应用复杂度上升到一定阈值,“不知道”带来的成本(协调时间、垃圾回收压力、内存占用)呈非线性增长,而 React 团队给出的答案——Concurrent Features、Transition、Offscreen——依然没有跳出那个基本的“同步渲染树”框架。它们只是把割裂的调度优先级做成了更高级的排队机制。
再看 Server Components。它试图把组件变成“异步服务端计算的产物”,这确实改变了数据获取模式,但本质上还是把 UI 切成了“服务端渲染片段”和“客户端交互片段”,这种二元切分依旧是在 React 的递归渲染模型内部打转。真正值得反思的是:当一个 UI 节点 99% 的部分不需要动态更新时,为什么我们要为那 1% 的动态性付出 100% 的协调成本?
全新观点:React 需要“自我否认”式重构
我的观点是:React 的未来不在于更快地执行现有范式,而在于主动摧毁自身的两条支柱——渲染函数至上,以及运行时协调。具体来说,React 应该引入“信号驱动的局部组件边界”。这不是说抛弃 JSX 或组件,而是让每个组件可以声明自己内部哪些状态是“信号”(Signal),这些信号变化时只触发组件内一个极小的“效果”(Effect),而不是整个函数体重新执行。
更进一步,React 应该把“渲染”降级为“编译期概念”。想象一下,在构建阶段,编译器分析组件树,生成一份静态的依赖执行图。运行时只负责响应信号和调度最小更新。这样的 React,实际上已经不再是“React”,而是一个披着 React API 外衣的 Svelte 或 Solid。但关键在于,这种牺牲自我身份的勇气,才是 React 突破当前瓶颈的唯一路径。我们不需要另一个 React,我们需要的是 React 承认自己的运行时神话已经终结,并转身拥抱编译时与信号的混合范式。
此外,我们还要重新审视 Hooks。Hooks 是 React 对 mixin 和 render props 的优雅替代,但它隐含了一个错误假设:组件的状态变迁必然与组件的渲染周期绑定。这让很多开发者养成了“为渲染而优化状态”的坏习惯。如果 React 能够支持更独立的“可观察状态”(Observable State),让状态与渲染彻底解耦,那么 useEffect 中 90% 的滥用场景都会消失,开发者不再需要绞尽脑汁思考“要不要加依赖项”这种反人类问题。
结语:舒适区的死亡,是成长的开始
React 的故事远未结束,但它的主导者必须意识到:舒适区是世界上最危险的区域。当社区还在为“React 17 到 18 的并发魔法”喝彩时,真正的对手已经从编译时和信号响应式两个方向包抄过来。这不是一场零和博弈,而是一次范式觉醒。
如果 React 愿意放弃“运行时永远正确”的自尊,如果它愿意把虚拟 DOM 从核心位置挪到兼容层,如果它允许开发者只写“当 X 变化时更新 Y”而非“整个组件重新计算”……那么,React 依旧可以站在下一个十年的潮头。而如果它继续在舒适的抽象里打补丁,那么,等来的不是死亡,而是成为当年它亲手埋葬的 AngularJS——一个属于上一个时代的、被挂在博物馆里供人凭吊的“优雅遗产”。
作为开发者,我们不应该忠于任何框架,而应该忠于那个不断追问“为什么必须这样”的好奇心。毕竟,所有框架都是我们通往更好交互体验的垫脚石,而非终点。React 若能迈出这一步,它就不再只是工具,而是一面镜子,照出前端工业化的全部野心与局限。
本文无意否定 React 的历史价值,只是提出一种从范式内部观察到的危机。真正有未来的框架,恰恰是那些敢于对自己说“不”的框架。