vite 为什么选择rollup 作为生产打包工具

0 阅读4分钟

Vite 生产环境选择 Rollup 的原因与优化

核心结论

Rollup 虽然以打包库闻名,但其 Tree Shaking 能力和输出优化深度,恰恰是现代前端生产环境最需要的。


一、为什么选择 Rollup?

1. Tree Shaking 的原生优势

  • Rollup 的 ES Module 优先策略:Rollup 从设计之初就是为 ESM 生成的,因此它的 Tree Shaking 更彻底——能在静态分析阶段精确标记未使用的代码并剔除。
  • 对比 Webpack:Webpack 虽然也支持 Tree Shaking,但由于历史包袱(CommonJS 兼容、复杂插件体系),其纯净度不如 Rollup。Rollup 的输出更"干净",体积更小。

2. 输出格式的灵活性

  • 支持多种格式:虽然库打包常用 ESM/CJS,但 Rollup 也支持 IIFE(立即执行函数)、UMD 等格式,完全满足生产环境的需求。
  • 代码可读性:Rollup 生成的代码结构清晰,便于调试和二次处理。

3. Vite 的架构定位

  • 开发用 esbuild,生产用 Rollup:esbuild 负责极速开发(依赖预构建、单文件编译),而生产环境需要更精细的优化和生态支持,Rollup 正好填补这个空缺。
  • 避免重复造轮子:Vite 团队评估后认为,与其基于 esbuild 重新实现一套生产构建体系,不如站在 Rollup 的成熟肩膀上,专注优化上层体验。

二、Vite 对 Rollup 的优化处理

1. 插件生态桥接

  • Vite 插件系统兼容 Rollup:Vite 的插件设计完全兼容 Rollup 插件接口,开发者可以直接复用 Rollup 生态。同时,Vite 在开发阶段通过钩子适配器,让同一套插件能在 esbuild 环境下运行(如 vite:preloadvite:css 等)。
  • 增强型插件:Vite 内置了 Rollup 没有的插件,例如:
    • @vitejs/plugin-vue:Vue 3 单文件组件编译。
    • @vitejs/plugin-react:React Fast Refresh 支持。

2. 代码分割优化

  • 自动分包策略:Rollup 原生的 Code Splitting 对复杂应用不够友好,Vite 做了以下增强:
    • 动态导入语义化:自动将 import() 转换为懒加载 chunk,并按路由或业务模块分割。
    • 依赖去重:对 node_modules 中的重复依赖进行提取和合并,避免冗余。
    • chunk 命名与哈希:支持 [name]-[hash].js 命名模式,配合长期缓存策略。

3. 构建性能提升

  • 并行处理:虽然 Rollup 本身是单线程的,但 Vite 通过以下方式加速:
    • esbuild 预压缩:在生产构建前,先用 esbuild 进行 minify(压缩),然后交给 Rollup 处理。这样 Rollup 只负责组合和优化,大幅减少耗时。
    • 缓存机制:Vite 缓存了中间文件(如预构建的依赖),避免重复计算。

4. CSS 处理增强

  • Rollup 对 CSS 支持较弱,Vite 内置了完整的 CSS 处理管线:
    • 模块化:支持 CSS Modules、PostCSS、Sass/Less 等预处理器。
    • 代码分割:自动提取 CSS 到独立文件,避免样式闪烁。
    • 按需加载:动态导入的组件对应的 CSS 也会拆分为独立文件。

5. 开发与生产的一致性

  • 配置统一:Vite 的 vite.config.js 既控制开发环境(基于 esbuild),也控制生产环境(基于 Rollup),开发者无需维护两套配置。
  • 路径别名与模块解析:Vite 统一了开发和生产的模块解析逻辑,避免因工具差异导致路径问题。

三、为什么不用 Webpack?

1. 性能天花板

  • Webpack 的构建速度再优化,也难以突破其架构(基于 JS、多阶段 AST 传递)的限制。Vite 追求的是极致速度,esbuild + Rollup 的组合在性能上更有优势。

2. 简化配置

  • Webpack 配置复杂,Vite 希望提供开箱即用的体验。Rollup 的配置模型更直观,配合 Vite 的默认值,开发者几乎零配置即可运行。

3. 未来趋势

  • ESM 已经成为标准,Rollup 的 ESM 优先策略更符合浏览器和 Node.js 的发展方向。

四、总结

Vite 选 Rollup 不是"误用",而是"借力打力"——用 esbuild 解决开发速度,用 Rollup 解决生产优化,通过插件桥接和增强填补生态缺口。

这种组合让 Vite 在保持极速开发的同时,又能输出生产级的高质量代码,是目前前端构建工具的黄金组合之一。