🏗️ 项目构建工具¶
构建工具 = 把源码(模块、TS、Vue/React、CSS)转成浏览器可运行的产物。本篇对比 Webpack / Vite / Rspack / Turbopack / esbuild / Rollup 的原理、配置与选型。
权威来源:Vite 文档、Webpack 概念、Rspack、esbuild、Rollup。
1. 术语表¶
- Entry / Output:入口文件与产物输出。
- Loader / Plugin:Loader 处理非 JS 资源(转译),Plugin 扩展构建流程(压缩/分包)。
- Dev Server(HMR):开发服务器 + 热模块替换,改代码即时生效。
- Bundle / Chunk:打包产物整体 / 拆分出的代码块。
- Dependency Graph:从入口顺着 import 构建的依赖图,决定打什么。
2. 主流工具对比¶
| 工具 | 定位 | 开发服务器 | 生产打包 | 底层 |
|---|---|---|---|---|
| Vite | 现代主流 | 原生 ESM,极快 | Rollup | esbuild(预构建) |
| Webpack | 老牌全功能 | 较慢 | 自身 | JS |
| Rspack | Webpack 兼容·快 | 快 | 自身(Rust) | Rust |
| Turbopack | Next.js 下一代 | 快(增量) | 实验 | Rust |
| esbuild | 转译/压缩 | — | 仅转译 | Go |
| Rollup | 库打包标杆 | — | 自身 | JS |
选型建议
- 新项目:Vite(开发体验最好、生态全)。
- 老 Webpack 项目想提速:Rspack(配置高度兼容,迁移成本最低)。
- 打 npm 库:Rollup(输出干净、支持多种格式)。
- 极致转译速度:esbuild / SWC 作为底层加速。
3. Vite 配置实战¶
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
server: { port: 5173, proxy: { '/api': 'http://localhost:3000' } },
build: { sourcemap: true, rollupOptions: { output: { manualChunks: { vue: ['vue'] } } } },
})
Vite 的两个关键点
- 开发不打包:浏览器原生 ESM 直接加载,依赖预构建用 esbuild 转 CJS→ESM。所以 dev 快,但首屏大量请求(HTTP/2 下无碍)。
- 生产用 Rollup:和 dev 不是同一套机制,偶尔出现"dev 正常 build 报错" → 通常是 Rollup 更严格(如 ESM 默认 stricter、循环依赖)。
4. Webpack 核心配置¶
// webpack.config.js
const path = require('path')
module.exports = {
entry: './src/main.js',
output: { path: path.resolve(__dirname, 'dist'), filename: '[contenthash].js' },
module: { rules: [
{ test: /\.vue$/, use: 'vue-loader' },
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
]},
plugins: [/* HtmlWebpackPlugin, etc. */],
}
Webpack 反面
- 不配
contenthash文件名 → 缓存失效策略错乱。 rules顺序敏感(从右到左/从下到上),loader 写错顺序不生效。- 大项目全量构建慢,用
cache/thread-loader或干脆迁 Rspack。
5. 分包策略¶
// 手动拆 vendor
manualChunks: { react: ['react', 'react-dom'], vendor: ['lodash-es'] }
// 或按 node_modules 自动拆
manualChunks: { vendor: /[\\/]node_modules[\\/]/ }
分包与缓存联动
带 [contenthash] 的文件名 + 长缓存(见 性能优化)。vendor 独立成块,业务改动不会让用户重新下载 React。
6. 自检清单¶
- 我理解 dev(ESM) 与生产(Rollup) 机制差异
- 产物文件名带 contenthash 以利缓存
- 我做了合理的 vendor 分包
- 知道何时选 Vite / Rspack / Rollup
- dev 代理(proxy)正确转发后端 API