01|React 赢得越彻底,它留下来的默认重量就越容易被重新审问

前两篇讲的是框架为什么会出现,

前一篇讲的是 ReactVue 怎样分别拿到主流秩序位置。

可历史到了这里,并不会自然停下。

因为每一代框架胜利之后,

都会留下新的默认成本。

React 也一样。

它把很多事情重写得更统一:

  • 组件化
  • 状态驱动视图
  • 单向数据流
  • 整套生态接口

可与此同时,

它也把另一类东西慢慢推成了新默认:

  • 更重的运行时参与
  • 更强的重新渲染心智
  • 更多围绕 Virtual DOM 的工作
  • 更多为了性能而额外学习和调优的负担

这些东西在 React 上升期都能被接受,

因为当时它解决的旧问题更大。

但一旦整套心智成了主流,

新的追问就会自然冒出来:

声明式 UI 当然很对,可为了这份声明式,我们是不是已经给运行时交了太多税?

这就是 SvelteSignals、细粒度响应式重新抬头的真正背景。

它们争的不是“能不能更潮”。

它们争的是:

React 时代的默认成本,到底是不是已经该被重估了。


02|Svelte 的厉害,不只是它反 Virtual DOM,而是它公开把问题重新提了一遍

Svelte 这条线特别有戏,

因为它不是悄悄换条技术路线。

它是公开掀桌。

Rich Harris 那篇 Virtual DOM is pure overhead

标题本身就非常强势。

它不是温和讨论:

“我们有另一种实现。”

它直接是在说:

你们这套默认常识本身就该被怀疑。

这篇文章真正值得写的,不只是态度很猛。

而是它把一个长期被压住的问题重新摆回台面:

Virtual DOM 当然不是毫无价值,

它解决了声明式 UI 在现实里的落地问题。

但如果每一轮更新都还要先在运行时做一整层对比与协调,

这份成本是不是可以更早被处理掉?

于是 Svelte 给出的答案是:

可以。把更多工作前移给编译器。

这就是为什么 Svelte 真正值得写的,不是“写法清爽”。

而是:

它重新分配了复杂度的位置。

不再默认交给运行时。

而是尽量交给编译时。


03|Svelte 3 最狠的一句,其实不是性能口号,而是“最好的 API 是没有 API”

Svelte 3: Rethinking reactivity 里,

Rich Harris 有一句特别值得记:

the best API is no API at all

这句话为什么重要?

因为它背后的野心,不只是减少几个函数调用。

而是在反问:

响应式这件事,为什么一定要通过额外运行时抽象和额外心智负担来表达?

Svelte 3 想做的是把一部分响应式工作重新塞回语言使用体验里。

比如让你写:

count += 1

而不是总要显式调用某种特别的状态更新协议。

这意味着什么?

意味着它在争另一种合法性:

框架不一定要把自己表现得越来越像一个厚重运行时,它也可以尽量把自己藏进编译过程。

这和 ReactAngularJS 那些时代的主流直觉非常不一样。

因为它直接把框架价值重新定义成:

不一定是“运行时替你做更多事”,而可以是“编译器提前替你把很多事消化掉”。

这就是 Svelte 路线最锋利的地方。

不是“更小更快”这么简单。

而是它重新提案:

框架到底应该以什么形态存在。


04|Signals 的重新流行说明,React 时代的问题意识已经外溢了

如果说 Svelte 更像从“编译器 vs 运行时”这条线公开反攻,

Signals 更像另一种路线:

既承认响应式是核心问题,又不想接受整块重新渲染的默认代价。

Signals 当然不是凭空出现的新思想。

依赖跟踪、响应式、细粒度更新,这些想法以前都存在。

Signals 这几个字最近几年重新变热,

特别值得注意。

因为这说明整个生态都在重新问同一件事:

当状态发生变化时,到底有没有必要让那么大一片 UI 跟着走完整套协调流程?

Preact Signals 的文档里说得很直接:

它们是 reactive primitives

强调的是自动依赖跟踪、直接绑定和更细的更新粒度。

而官方博客 Signal Boosting 又特别提到,

Signals 这套说法本身就受到了 SolidJSVueSvelte 这类响应式传统的影响。

也就是说,Signals 的上升很说明问题:

它不是某一家的小技巧。

而是:

React 时代塑造出来的默认问题意识,已经逼着整个生态去重新寻找更细粒度的更新答案。


05|所以这轮新战争真正争的,不是“谁 benchmark 更快”,而是复杂度该压给谁

这是这一篇最重要的判断。

因为一说到 SvelteSignalsSolid、细粒度响应式,

很多讨论很容易立刻滑到 benchmark。

可如果只停在“谁更快”,这篇就会写废。

因为真正值得写的根本不是跑分。

而是:

同一份声明式 UI 的复杂度,最后到底应该放在哪一层。

React 一代给出的主流答案,大致是:

  • 组件声明 UI
  • 状态变化触发重新渲染
  • 运行时协调差异

Svelte 的反问是:

  • 既然编译时能知道更多,为什么不提前展开更多工作

Signals 一类路线的反问是:

  • 既然依赖关系可以更细,为什么不更精确地更新

这就说明,

今天框架战争最深的层面其实已经回到了一个老问题:

复杂度消失不了,那它该被安排到运行时、编译器,还是依赖图本身?

这才是这轮反攻真正值钱的地方。

不是口水。

是重新分账。


06|这轮反攻也没有推翻 React,但它确实逼着大家重新谈“默认值”

这里也不能写成“新路线正在取代旧王朝”的简单戏码。

因为现实远没这么干净。

React 仍然很强,

生态、工具链、人才市场、文档入口都还在它那边。

可这不代表这轮反攻没有意义。

恰恰相反,

它最重要的意义可能是:

它逼着整个框架世界重新思考默认值。

以前很多东西可以被当作不证自明:

  • Virtual DOM 够快
  • 重新渲染是自然方案
  • 运行时多做点事没问题

而现在这些默认前提都开始被系统性重问。

一旦默认前提开始被重问,

哪怕旧秩序没立刻被掀翻,

战争也已经重新开打了。

这就是为什么我更愿意把这一阶段理解成:

React 时代之后的一次问题意识反攻。

不是大家统一投奔了某个新王者。

而是很多人开始不再愿意无条件接受旧王者留下来的那套默认成本。


07|这轮反攻没有结束,它已经变成今天的默认追问

为什么这篇值得放进主线,而不是写成技术小番外?

因为这轮争论今天已经深到会影响大家日常理解框架。

比如:

  • 大家重新关心编译时优化是不是核心路线
  • 大家越来越能接受“细粒度响应式”是一种底层优势
  • 大家更在意框架有没有把不必要的工作交给运行时
  • 大家会重新问:框架到底应该显得多重,才算合理

这些问题说明,

前端框架战争从来没有结束。

它只是从以前的:

  • 模板 vs 组件
  • 双向绑定 vs 单向数据流

继续走到了今天的:

  • 运行时 vs 编译时
  • 粗粒度协调 vs 细粒度更新

所以下一篇要做的,就是把整套系列拉回今天的现实:

为什么框架最后已经不只是 UI 工具,而是长成了现代前端默认的治理层。


参考与延伸阅读

  1. Virtual DOM is pure overhead
    https://svelte.dev/blog/virtual-dom-is-pure-overhead

  2. Svelte 3: Rethinking reactivity
    https://svelte.dev/blog/svelte-3-rethinking-reactivity

  3. Rich Harris - Rethinking reactivity
    https://www.youtube.com/watch?v=AdNJ3fydeao

  4. Sapper: Towards the ideal web app framework
    https://svelte.dev/blog/sapper-towards-the-ideal-web-app-framework

  5. Introducing Signals - Preact
    https://preactjs.com/blog/introducing-signals

  6. Signals | Preact Guide
    https://preactjs.com/guide/v10/signals

  7. Signal Boosting
    https://preactjs.com/blog/signal-boosting

  8. Signals | Angular
    https://angular.dev/guide/signals

  9. Signals | SolidJS Docs
    https://docs.solidjs.com/concepts/signals