01|如果说前四篇讲的是前端工程机器怎么一步步长大,那最后一篇要讲的就是:它为什么很快又开始被反过来怀疑

写到第四篇,其实这条主线已经走到一个非常典型、也非常现代的位置。

前端手里已经有了:

  • task runner
  • bundler
  • loader / plugin 系统
  • 语法转译平台

换句话说,到这个阶段,前端已经不只是“有工程化”。

它几乎已经长出了一整套庞大的工程机器。

可问题恰恰也在这里。

因为这套机器越强,大家越会感受到另一面:

  • 配置越来越多
  • 启动越来越慢
  • 重建越来越重
  • 概念越来越厚

也就是说,前端工程化在解决旧问题的同时,也开始把自己变成新问题。

这就是第五篇真正要讲的起点。

RollupSnowpackVite 这些后来被看作“新一代工具”的路线,真正重要的地方,并不是“它们更新”。

更不是“它们把旧工具打败了”。

它们更像一场系统性的反问:

既然工程化本来是为了减轻复杂度,那当工程化自己也开始成为复杂度来源时,难道它不该再被重新工程化一次吗?


02|所以这场反攻最早针对的,并不是“工程化本身”,而是那种越来越重的 bundle-first 开发体验

这一步一定要先立住。

因为很多人后来会误以为:

ViteSnowpack 这些工具是在反工程化。

其实并不是。

它们反的,从来不是“有工具链”这件事。

它们反的是:

某一代工程化工具把太多复杂度集中在开发阶段这一件事。

尤其是当项目越来越大之后,bundle-first 的 dev server 体验会越来越明显地暴露出几个问题:

  • 冷启动要先把整套应用处理一遍
  • 改一行代码也可能触发重编
  • HMR 越往后越不像“热”,越像“等”
  • 工具越强,日常开发的等待成本越高

这就是为什么新一代工具最先攻击的,不是生产构建。

而是开发体验。

因为真正让开发者最先受不了的,不是“上线时优化很复杂”。

而是:

每天写代码时,工具链越来越像一台巨大而迟缓的机器压在自己前面。

所以第五篇的第一层一定要讲清楚:

这场反攻首先不是反功能。

它是反重量。


03|Rollup 先代表的是第一种不满:如果项目已经是 ESM 世界了,那产物为什么还要这么粗、这么脏、这么难被静态优化

如果要给这场反攻找一个较早的方向性信号,Rollup 很难绕开。

它的历史位置很特别。

因为它并不是先从 dev server 速度切入的。

它先打的是另一种不满:

既然模块已经越来越走向 ESM,那 bundler 产物为什么还不能更静态、更干净、更适合消掉没用的代码?

Rollup 官方 FAQ 里对 ES modules 的偏爱写得非常直白:

ES modules are the official standard and the clear path forward

而它对 tree-shaking 的解释也特别能说明问题:

Rollup 会基于抽象语法树,把真正没用的代码摇掉。

这一步为什么重要?

因为它代表了一种非常明确的反攻方向:

不是所有 bundling 都必须越来越像一台什么都吞、什么都管的大机器。

如果你的代码天然更静态、更接近标准 ESM

那工具也可以更专注地服务:

  • 更干净的输出
  • 更好的 tree-shaking
  • 更少的运行时代码

所以 Rollup 的历史意义,不只是“一个适合打 library 的 bundler”。

更是:

它第一次大规模提醒社区,工程化不该只追求全能,也该重新追求干净。


04|Snowpack 则代表了第二种更直接的不满:为什么开发时每次改动,都还要继续服从 bundling 这一整套旧秩序

如果说 Rollup 打的是“产物应该更静态、更轻”,

Snowpack 打的就是另一条更激进的线:

开发时,为什么还非得先整包构建?

这条线的冲击力非常大。

因为它第一次公开把很多人心里的抱怨,直接做成了架构选择。

Snowpack 官方对自己“怎么工作”的解释特别有代表性:

它在开发阶段采用的是 unbundled development

什么意思?

不是先把整个应用 bundling 完再给浏览器。

而是:

直接把单个文件按浏览器需要一份份送过去。

而且它非常明确地说:

  • 每个文件只需要构建一次
  • 文件改了就只重建那一个文件
  • 项目规模不该线性拖慢开发速度

这一步的历史意义非常大。

因为它第一次让“开发时去 bundling 整个应用”这件事,

不再看起来像自然规律。

它把很多人原本只能抱怨的东西,变成了一句真正的制度挑战:

如果浏览器已经懂 ESM,那开发态凭什么还必须继续假装自己活在 bundle-first 的旧世界里?

这就是 Snowpack 真正震动行业的地方。

它不是终局。

但它第一次把反 bundler 开发体验这件事,认真做成了主张。


05|而 Vite 为什么会真正坐大,不是因为它最先想到这些,而是因为它第一次把这场反攻做成了更完整、更现实的答案

这也是第五篇最关键的一层。

Vite 自己的官方文档其实说得非常坦白:

它不是第一个探索这条路的工具。

官方明确承认:

Snowpack pioneered unbundled development and inspired Vite's dependency pre-bundling.

这句很重要。

因为它直接说明 Vite 的成功,不是凭空冒出来的。

它是建立在前一轮不满和试探之上的。

那它为什么后来会真正成为主流答案?

因为它不像只是提出抗议。

它更像提出了一套折中得更漂亮的制度:

开发时:

  • 源码按原生 ESM 按需服务
  • 浏览器请求什么就处理什么
  • 依赖预构建一次,避免开发时重复折腾

生产时:

  • 仍然承认 bundling 在交付优化上有必要
  • 继续用构建产物去解决网络往返、缓存和部署问题

这一步非常关键。

因为 Vite 真正赢的,不是“彻底消灭 bundler”。

而是:

它把“开发态不必像生产态那样重”这件事,第一次做成了足够完整、足够稳、足够主流的工程答案。


06|所以 Vite 最厉害的,不只是快,而是它重新拆开了很久以来被绑在一起的两件事:开发时如何服务代码,生产时如何交付代码

这点如果不讲清楚,第五篇就会被写成“速度比较帖”。

Vite 的历史意义远远不只是快。

真正更深的一层是:

它重新拆开了开发与交付。

这句话听起来像绕了一圈。

但其实特别关键。

早期前端工程化本来就是因为“开发态”和“上线态”开始分裂,才长出来的。

只是到了 webpack 一代,这两件事又被很强地绑回了一台大机器里:

  • 开发时先整包
  • 生产时也整包
  • 同一套中心系统尽量接住全部现实

Vite 则重新把它们拆开:

开发态问题,就用更贴近浏览器原生能力的方式解决。

生产态问题,就继续承认优化 bundling 的必要。

这其实是一种非常成熟的工程判断。

它不是理想主义地喊“以后都不打包了”。

它是在说:

不同阶段的问题,不必永远被同一套重量级机制一起处理。

这就是为什么 Vite 会让人感觉特别顺。

因为它不是单纯更快。

而是它重新对齐了问题和解法。


07|也就是说,这场反攻真正赢下的,不是“轻量”两个字,而是工程化终于开始反过来利用平台本身的新能力

这一步特别值得点出来。

因为如果只把第五篇写成“旧工具太重,新工具太轻”,还是会写浅。

更准确的说法应该是:

新一代工具赢下的,是它们终于更主动地借用了平台本身已经长出来的能力。

这里最核心的就是浏览器对 ESM 的支持。

以前平台没给到,社区只能用更重的 bundling 先把现实补出来。

后来平台慢慢给到了:

  • 原生 ESM
  • 更现代的模块加载方式
  • 更可接受的浏览器能力基线

于是工具链终于可以重新发问:

既然平台自己已经会一部分了,

那工具还要不要继续把所有事都扛在自己肩上?

SnowpackVite,真正代表的就是这个转向。

它们不是放弃工程化。

而是:

让工程化开始学会把能还给平台的东西,慢慢还给平台。

这也就是为什么 Vite 官方会一再强调,它的架构是要随着 Web platform 一起演化,而不是永远锁死在某一种旧思路里。


08|但这场反攻也不是“一键清算旧世界”,因为它仍然继承了前面那整套工程史留下的现实账本

这也是收束篇必须克制的一层。

我们不能把第五篇写成一个太爽快的胜利故事。

因为事实并不是:

Vite 来了,旧世界立刻终结。

更真实的现实是:

  • 生产构建依然需要 bundling
  • 很多复杂项目依然离不开旧生态能力
  • 插件兼容、框架集成、历史包袱仍然存在
  • Snowpack 自己甚至也没有走到终局

这说明什么?

说明新一代反攻真正赢下的,

也不是“从此不需要旧工程化”。

它赢下的是一种新的共识:

工程化不该把所有复杂度都默认堆在开发时。

这点一旦成立,整个行业的方向感就变了。

所以即便旧工具没有立刻消失,

它们也会开始被迫回答同一个问题:

你到底还值不值得这么重。

这就是第五篇要写出来的那种时代气氛。

不是旧世界瞬间崩塌。

而是旧世界第一次被系统性追问其合法性。


09|为什么 Vite 这轮反攻真正质疑的,不只是工具,而是默认重量

把前面这些线叠一起看,第五篇最重要的判断可以压成一句:

Rollup / Snowpack / Vite 代表的,不是简单换代,而是前端工程化第一次公开反问自己是不是也太重了。

这句话里面有三层意思。

第一,Rollup 提醒大家重新追求更静态、更干净的构建产物。

第二,Snowpack 第一次认真把“开发时不必先整包”做成公开路线。

第三,Vite 则把这股反攻真正变成了可大规模采用的主流工程答案。

所以理解这批工具的历史意义,最不该只记住“它们更快”。

更该记住的是:

它们第一次让前端工程化从“不断加工具”转向“开始重新分配工具该承担多少复杂度”。

这才是收束篇真正要立住的判断。


10|这轮新工具反攻,本质上是工程化开始认真改造自己

前端工程化江湖的最后一篇,最值得记住的,不是“Vitewebpack 快”这种表层比较。

更值得记住的是:

这场新一代工具反攻,本质上是前端工程化第一次开始认真改造自己。

从无构建时代,到 task runner,到 webpack,再到 Babel,前端一路都是在给自己加能力。

而到了 RollupSnowpackVite 这一代,

它第一次开始意识到:

能力不是越堆越好,工程机器本身也必须重新学会轻、学会分层、学会把一部分工作还给平台。

所以第五篇如果只记一句,就记这句:

Rollup / Snowpack / Vite 为什么会代表反攻,不是因为它们突然终结了工程化,而是因为当前端终于把工程化做得太成功、太庞大之后,它又第一次认真回头追问:这套机器自己,是不是也该被重新工程化了。


编者注(事实核对):文中关于 Rollup 的定位,主要依据官方 FAQ 对 ES modules、tree-shaking 与静态分析优势的说明,其中明确强调 ESM 更适合优化,tree-shaking 是通过对语法树进行标记与剔除来实现的。关于 Snowpack 的定位,主要依据官方 How Snowpack Works 与 README 中对 unbundled development、按文件重建、开发时利用原生 ESM、以及 50ms 级 dev server 启动的说明;同时也参考其仓库中后续“项目不再积极维护、建议使用 Vite”的公开说明。关于 Vite 的定位,主要依据官方 Why ViteProject Philosophy 中对原生 ESM 开发服务器、依赖预构建、开发态按需服务、生产态仍保留 bundling、以及受 Snowpack 启发的明确表述。正文将这一代工具概括为“工程化对自身重量的第一次系统性反问”,属于基于其开发体验、平台能力借用与复杂度重分配逻辑做出的历史总结。


关键人物速览

  • Rich HarrisRollup 的发起者。理解为什么社区会重新追求更静态、更干净的构建产物,绕不开他。
  • Fred K. SchottSnowpack 的发起者。理解“开发时不必先整包”为什么会从抱怨变成一条公开路线,绕不开他。
  • Evan YouVite 的发起者。理解为什么这场反攻最终会以更完整、更主流的方式落地,绕不开他。

参考与延伸阅读

  1. Rollup FAQ
    https://rollupjs.org/faqs/

  2. Integrating Rollup With Other Tools
    https://rollupjs.org/tools

  3. How Snowpack Works
    https://www.snowpack.dev/concepts/how-snowpack-works

  4. Snowpack README
    https://github.com/FredKSchott/snowpack

  5. Why Vite
    https://vite.dev/guide/why

  6. Project Philosophy | Vite
    https://vite.dev/guide/philosophy.html

  7. Vite Comparisons
    https://v5.vite.dev/guide/comparisons.html


这一支主线至此收束。若继续自然外溢,最顺的下一条线会是:npm 江湖TypeScript 江湖,或者更贴近今天工程现实的 框架脚手架江湖