Vite 在开发环境利用浏览器原生 ESM 实现瞬时启动,而生产构建则默认使用 Rollup。这并不是因为 Webpack 不够好,而是 Rollup 的设计理念与 Vite 的优化目标高度契合。
Rollup 的核心优势在于它天然以 ES 模块标准 为输入格式,能够基于静态的 import/export 语法进行更彻底的 Tree‑shaking(死代码消除),最终生成结构清晰、体积更小的 bundle。对于准备发布的库或应用来说,Rollup 输出的代码几乎没有“模块加载器”的运行时开销,产物更接近于手写的原生模块组织。
与 Webpack 相比,两者在定位上有明显差异:
- Webpack 是“大而全”的应用打包器:它对各种资源(JS、CSS、图片等)一视同仁,通过 loader 和 plugin 提供极强的扩展能力,特别适合复杂的企业级单页应用(SPA)。但它会注入自己的模块管理运行时,产物内会有较多的包裹代码。
- Rollup 是“小而精”的 ES 模块打包器:它更专注于 JavaScript 本身的打包优化,输出产物更扁平、可读性更高。这让 Rollup 成为 库开发的标配(如 Vue、React 本身就用 Rollup 构建),因为发布给他人使用的库必须保证最小体积和最清晰的模块导出。
- 代码分割:Webpack 的代码分割(Code Splitting)方案非常成熟且灵活,Rollup 也支持代码分割,但在细粒度控制和兼容场景的覆盖上略逊于 Webpack。
在 Vite 体系中,开发时用原生 ESM 按需加载,生产时用 Rollup 打包优化,各取所长。对于开发者来说,几乎无需直接配置 Rollup(Vite 已默认封装好了合理的生产构建规则),同时又能享受到 Rollup 带来的极致体积优化和 ESM 友好输出。如果你构建的是面向 npm 的 JavaScript 库,手动使用 Rollup 并配合 rollup.config.js 也是官方推荐的最佳实践。