01|如果说前四篇讲的是前端工程机器怎么一步步长大,那最后一篇要讲的就是:它为什么很快又开始被反过来怀疑
写到第四篇,其实这条主线已经走到一个非常典型、也非常现代的位置。
前端手里已经有了:
- task runner
- bundler
- loader / plugin 系统
- 语法转译平台
换句话说,到这个阶段,前端已经不只是“有工程化”。
它几乎已经长出了一整套庞大的工程机器。
可问题恰恰也在这里。
因为这套机器越强,大家越会感受到另一面:
- 配置越来越多
- 启动越来越慢
- 重建越来越重
- 概念越来越厚
也就是说,前端工程化在解决旧问题的同时,也开始把自己变成新问题。
这就是第五篇真正要讲的起点。
Rollup、Snowpack、Vite 这些后来被看作“新一代工具”的路线,真正重要的地方,并不是“它们更新”。
更不是“它们把旧工具打败了”。
它们更像一场系统性的反问:
既然工程化本来是为了减轻复杂度,那当工程化自己也开始成为复杂度来源时,难道它不该再被重新工程化一次吗?
02|所以这场反攻最早针对的,并不是“工程化本身”,而是那种越来越重的 bundle-first 开发体验
这一步一定要先立住。
因为很多人后来会误以为:
Vite、Snowpack 这些工具是在反工程化。
其实并不是。
它们反的,从来不是“有工具链”这件事。
它们反的是:
某一代工程化工具把太多复杂度集中在开发阶段这一件事。
尤其是当项目越来越大之后,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 - 更现代的模块加载方式
- 更可接受的浏览器能力基线
于是工具链终于可以重新发问:
既然平台自己已经会一部分了,
那工具还要不要继续把所有事都扛在自己肩上?
从 Snowpack 到 Vite,真正代表的就是这个转向。
它们不是放弃工程化。
而是:
让工程化开始学会把能还给平台的东西,慢慢还给平台。
这也就是为什么 Vite 官方会一再强调,它的架构是要随着 Web platform 一起演化,而不是永远锁死在某一种旧思路里。
08|但这场反攻也不是“一键清算旧世界”,因为它仍然继承了前面那整套工程史留下的现实账本
这也是收束篇必须克制的一层。
我们不能把第五篇写成一个太爽快的胜利故事。
因为事实并不是:
Vite 来了,旧世界立刻终结。
更真实的现实是:
- 生产构建依然需要 bundling
- 很多复杂项目依然离不开旧生态能力
- 插件兼容、框架集成、历史包袱仍然存在
Snowpack自己甚至也没有走到终局
这说明什么?
说明新一代反攻真正赢下的,
也不是“从此不需要旧工程化”。
它赢下的是一种新的共识:
工程化不该把所有复杂度都默认堆在开发时。
这点一旦成立,整个行业的方向感就变了。
所以即便旧工具没有立刻消失,
它们也会开始被迫回答同一个问题:
你到底还值不值得这么重。
这就是第五篇要写出来的那种时代气氛。
不是旧世界瞬间崩塌。
而是旧世界第一次被系统性追问其合法性。
09|为什么 Vite 这轮反攻真正质疑的,不只是工具,而是默认重量
把前面这些线叠一起看,第五篇最重要的判断可以压成一句:
Rollup / Snowpack / Vite 代表的,不是简单换代,而是前端工程化第一次公开反问自己是不是也太重了。
这句话里面有三层意思。
第一,Rollup 提醒大家重新追求更静态、更干净的构建产物。
第二,Snowpack 第一次认真把“开发时不必先整包”做成公开路线。
第三,Vite 则把这股反攻真正变成了可大规模采用的主流工程答案。
所以理解这批工具的历史意义,最不该只记住“它们更快”。
更该记住的是:
它们第一次让前端工程化从“不断加工具”转向“开始重新分配工具该承担多少复杂度”。
这才是收束篇真正要立住的判断。
10|这轮新工具反攻,本质上是工程化开始认真改造自己
前端工程化江湖的最后一篇,最值得记住的,不是“Vite 比 webpack 快”这种表层比较。
更值得记住的是:
这场新一代工具反攻,本质上是前端工程化第一次开始认真改造自己。
从无构建时代,到 task runner,到 webpack,再到 Babel,前端一路都是在给自己加能力。
而到了 Rollup、Snowpack、Vite 这一代,
它第一次开始意识到:
能力不是越堆越好,工程机器本身也必须重新学会轻、学会分层、学会把一部分工作还给平台。
所以第五篇如果只记一句,就记这句:
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 Vite 与 Project Philosophy 中对原生 ESM 开发服务器、依赖预构建、开发态按需服务、生产态仍保留 bundling、以及受 Snowpack 启发的明确表述。正文将这一代工具概括为“工程化对自身重量的第一次系统性反问”,属于基于其开发体验、平台能力借用与复杂度重分配逻辑做出的历史总结。
关键人物速览
- Rich Harris:
Rollup的发起者。理解为什么社区会重新追求更静态、更干净的构建产物,绕不开他。 - Fred K. Schott:
Snowpack的发起者。理解“开发时不必先整包”为什么会从抱怨变成一条公开路线,绕不开他。 - Evan You:
Vite的发起者。理解为什么这场反攻最终会以更完整、更主流的方式落地,绕不开他。
参考与延伸阅读
Rollup FAQ
https://rollupjs.org/faqs/Integrating Rollup With Other Tools
https://rollupjs.org/toolsHow Snowpack Works
https://www.snowpack.dev/concepts/how-snowpack-worksSnowpack README
https://github.com/FredKSchott/snowpackWhy Vite
https://vite.dev/guide/whyProject Philosophy | Vite
https://vite.dev/guide/philosophy.htmlVite Comparisons
https://v5.vite.dev/guide/comparisons.html
这一支主线至此收束。若继续自然外溢,最顺的下一条线会是:npm 江湖、TypeScript 江湖,或者更贴近今天工程现实的 框架脚手架江湖。