FE-07-前端工程化:Webpack、Vite、Rollup 与 esbuild
本节目标:理解前端构建工具的原理,掌握主流工具(Vite、Webpack)的使用和选型,能调试构建问题。
1. 为什么要构建
原始 JS/TS 不能直接在浏览器跑:
- ES2024+ 语法需要转译(Babel/SWC)
- TypeScript 需要编译
- JSX/Vue SFC 需要转换
- CSS 预处理器(Less/Sass/PostCSS)需要编译
- 代码压缩、Tree-shaking、代码分割
- 资源处理(图片压缩、字体子集化)
- 注入环境变量、定义全局常量
构建工具的核心职责:把源码变成可部署的产物。
2. 构建工具演进
1 | 2009 r.js (RequireJS) |
3. Webpack
最成熟、插件生态最丰富。
3.1 核心概念
1 | Entry:入口文件 |
3.2 基本配置
1 | // webpack.config.js |
3.3 常用 Loader 和 Plugin
Loader:
babel-loader/swc-loader/esbuild-loader:转译 JS/TSts-loader:TypeScriptstyle-loader/css-loader/sass-loader:CSSfile-loader/asset modules:图片/字体vue-loader:Vue SFC
Plugin:
HtmlWebpackPlugin:生成 HTMLMiniCssExtractPlugin:CSS 单独提取DefinePlugin:注入全局变量CompressionPlugin:gzip/brotli 压缩BundleAnalyzerPlugin:可视化 bundle 大小CopyWebpackPlugin:复制静态资源
4. Vite(推荐)
Vite = 开发用 esbuild(快),生产用 Rollup(稳)。
4.1 为什么 Vite 快
- ESM 原生:开发时不打包,浏览器直接加载 ESM
- esbuild 预构建依赖:比 JS 写的打包器快 10-100 倍
- HMR 按需:只更新改动的模块,不重载整页
4.2 创建项目
1 | npm create vite@latest my-app -- --template react-ts |
4.3 配置
1 | // vite.config.ts |
4.4 环境变量
1 | // .env |
5. Rollup(库打包首选)
1 | // rollup.config.js |
特点:
- Tree-shaking 极强(基于 ES Module 静态分析)
- 输出代码可读
- 适合库打包(不打包依赖,减小体积)
6. esbuild(超快转译)
1 | // esbuild.config.js |
特点:
- Go 写的,10-100x faster than JS-based bundlers
- 支持 bundling、minify、TS、JSX
- 通常作为 Vite 内部使用
- API 简单,适合脚本/CI 场景
7. SWC(Rust 转译器)
1 | // .swcrc |
Next.js 13+ 默认用 SWC。
8. 选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 大型业务项目 | Vite | 快、生态好、配置简单 |
| 老项目迁移 | Webpack | 文档多、解决方案成熟 |
| 库/SDK | Rollup | tree-shake 好,输出可读 |
| 脚本/CI | esbuild | API 简单,毫秒级 |
| 大型 React/Next.js | Next.js (内置) | 不用选 |
| 微前端 | Module Federation | 跨构建工具共享 |
9. 关键优化技巧
9.1 代码分割
1 | // 路由懒加载 |
9.2 Tree-shaking
确保导入是 ESM 风格:
1 | // ✓ 静态导入,可被 tree-shake |
9.3 Bundle 分析
1 | # Vite |
9.4 缓存
1 | // vite.config.ts |
10. 调试技巧
Source Map:
devtool: 'eval-cheap-module-source-map'(开发)devtool: 'source-map'(生产,要上传 .map 到 Sentry)
分析模块大小:
1 | # Vite |
常见问题:
- 循环依赖:A import B,B import A → 解包不完整。检查 import 路径
- CSS 顺序:CSS 模块的 import 顺序决定样式优先级
- 环境变量 undefined:
VITE_前缀忘了(Vite)/REACT_APP_(CRA) - Tree-shake 失效:用了副作用 import(
import 'lib/dist/style.css')
小结
| 工具 | 速度 | 配置 | 生态 | 场景 |
|---|---|---|---|---|
| Webpack | 慢 | 复杂 | 极丰富 | 老项目 |
| Vite | 极快 | 简单 | 较丰富 | 新项目首选 |
| Rollup | 中 | 简单 | 库 | 库打包 |
| esbuild | 最快 | API | 一般 | 脚本/CI |
| SWC | 很快 | 配置文件 | Next 内置 | Next.js |
| Turbopack | 很快 | Next 内置 | 新 | Next.js 14+ |
2026 年建议:
- 新项目:Vite(React/Vue/Svelte)
- 库:Rollup 或 tsup(基于 esbuild)
- 大型企业应用:Vite + 适当自定义
- SSR/全栈:Next.js、Nuxt、SvelteKit
- 不用 Webpack 写新项目了
下一节讲包管理与 monorepo:pnpm、yarn、workspaces。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/09/25/FE-07-前端工程化与构建工具/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!