一、核心概念:到底什么是"打包"?
"打包"这个词在前后端语境下含义不同。在前端领域,它至少包含两层意思,取决于你在哪个阶段执行:
1. 开发打包(pnpm run dev)
-
本质 :启动一个即时编译服务,让你在浏览器中实时看到代码效果。
-
产物 :不生成
dist文件夹 ,所有编译结果存放在内存 和浏览器缓存中。 -
核心目标 :快(启动快、热更新快),方便调试。
-
处理范围 :按需处理------只编译你当前访问到的文件,未访问的文件暂不处理。
-
类比:记者写稿时,旁边有秘书实时誊抄并念给你听,但桌上只有散乱的草稿纸。
2. 生产打包(pnpm run build)
-
本质 :遍历项目所有文件,经过优化处理后,输出一套可直接部署的静态文件。
-
产物 :生成
dist文件夹,包含index.html、压缩后的 JS/CSS、处理后的图片等。 -
核心目标 :小 (体积最小化)、快(加载速度最快)。
-
处理范围 :全量处理------扫描整个项目的依赖关系图。
-
额外操作:压缩代码(Minify)、摇树优化(Tree Shaking)、文件哈希(Hash)、代码分割(Code Splitting)。
-
类比:小说完稿后,经过编辑、排版、压缩,最后印刷成一本精装书。
关键认知 :
dist里的代码和你src里的代码可能长得完全不一样------变量名被缩短、多个文件合并成少数几个、未使用的函数被删除。这一切都是为了线上性能。
二、构建工具的两层架构
所有前端构建工具都可以分为两个层次:
| 层次 | 角色 | 职责 | 代表工具 |
|---|---|---|---|
| 底层引擎 | "发动机" | 负责核心的编译、转换、打包工作,不提供开箱即用的开发体验 | esbuild、Rollup、Webpack |
| 上层工具 | "整车" | 集成引擎、插件、开发服务器、配置体系,给开发者提供完整体验 | Vite、Vue CLI、tsup |
关键理解:上层工具选择底层引擎,就像汽车厂商选择发动机。同一款发动机可以被多个上层工具使用。
三、各工具精确定位
1. esbuild------极速底层引擎
-
语言:Go 编写
-
角色 :底层引擎
-
核心能力:将 TypeScript、JSX、ES Module 快速转换为目标代码
-
使用方式 :通常被其他工具内部集成,开发者极少直接使用
-
谁在用:Vite(开发环境依赖预构建)、tsup(全量底层)
2. Rollup------成熟的底层引擎
-
语言:JavaScript 编写
-
角色 :底层引擎
-
核心能力:以 Tree Shaking(摇树优化)著称,打包产物干净、体积小
-
使用方式:通常被其他工具集成,也可独立用于打包组件库
-
谁在用:Vite(生产环境打包引擎)
3. Vite------现代上层构建工具
-
角色 :上层工具(完整的应用构建方案)
-
开发时 :底层使用 esbuild 做依赖预构建,利用浏览器原生 ESM 提供极速启动
-
生产时 :底层切换为 Rollup,以获得更优的生产优化能力
-
适用场景 :Vue 3 / React 等现代前端应用开发(首选)
-
官方地位:Vue 官方推荐,Vue CLI 的正式继任者
4. tsup------专为 NPM 库设计的上层工具
-
角色 :上层工具(专注于打包组件库/工具库)
-
底层引擎 :esbuild
-
核心能力 :快速将 TypeScript 打包为 ESM/CJS 双格式,自动生成
.d.ts类型声明 -
适用场景 :开发 NPM 包(如 Vue 组件库、工具函数库),不适用于打包完整网站
-
对
.vue文件的处理 :tsup 本身不编译.vue,但可以通过loader: { '.vue': 'copy' }将其原样复制输出,留给最终使用者的构建工具去编译
5. Vue CLI------经典上层工具(Webpack 时代)
-
角色 :上层工具
-
底层引擎 :Webpack
-
状态:Vue 官方已不再推荐用于新项目,目前主要用于维护 Vue 2 遗留项目
-
与其他工具的关系:esbuild 可能作为压缩插件出现,但非主力;Rollup、Vite、tsup 与它无直接关系
四、工具关系全景图
text
前端构建工具生态
│
┌─────────────────┼─────────────────┐
│ │ │
打包网站 打包网站 打包 NPM 库
(Web App) (Web App) (Library)
│ │ │
Vue CLI Vite tsup
(Webpack) ┌──────┴──────┐ (esbuild)
│ │
开发时 生产时
(esbuild) (Rollup)
五、常见误区与澄清
误区 1:build 就是把 src 原样复制到 dist
❌ 错误。dist 里的代码经过了压缩、合并、摇树、哈希等大量转换,和源码差异巨大。
误区 2:Vite 和 Vue CLI 是同一套东西的不同版本
❌ 错误。两者是完全独立 的构建工具,底层引擎不同(Vite 用 esbuild+Rollup,Vue CLI 用 Webpack),没有继承关系。Vite 是 Vue CLI 的替代者,而非升级版。
误区 3:可以用 tsup 打包一个完整的 Vue 网站
❌ 错误。tsup 不支持 index.html、静态资源、.vue 文件编译。它只能打包纯 JS/TS 的逻辑代码,适合 NPM 包而非网站。
误区 4:开发时用 esbuild,生产时也应该用 esbuild
❌ 不完全是。Vite 开发时用 esbuild 因为追求速度,生产时换用 Rollup 因为追求优化质量。两者各司其职。
误区 5:tsup 完全不支持 .vue 文件
⚠️ 部分正确。tsup 不能编译 .vue,但可以复制 .vue 文件。组件库场景下,这是合理用法------编译工作交给最终使用者的构建工具。
六、实战决策指南
根据你的项目类型,选择合适的工具:
| 项目类型 | 推荐工具 | 底层引擎 | 理由 |
|---|---|---|---|
| Vue 3 新业务网站 | Vite | esbuild(开发)+ Rollup(生产) | 官方标配,速度快,生态好 |
| Vue 2 遗留项目 | Vue CLI(Webpack) | Webpack | 稳定,迁移成本低 |
| Vue 组件库(发布 npm) | tsup 或 Vite Library Mode | esbuild / Rollup | 轻快,自动生成类型声明 |
| 需要极致定制打包逻辑 | 手动配置 Webpack 或 Rollup | 自选 | 完全可控,但门槛高 |
七、一句话速记
-
esbuild:极速发动机(Go 写的)
-
Rollup:优雅发动机(JS 写的,Tree Shaking 强)
-
Vite :整车(开发用 esbuild,生产用 Rollup)------ 打包网站用这个
-
tsup :整车(基于 esbuild)------ 打包 NPM 库用这个
-
Vue CLI :老款整车(基于 Webpack)------ 维护老项目用这个
八、你的项目诊断自查清单
如果你不确定自己用对了工具,问自己这 3 个问题:
-
项目根目录有
index.html吗?-
有 → 你在开发网站 ,应使用 Vite (
pnpm run build) -
没有 → 你在开发 NPM 库 ,可以考虑 tsup
-
-
入口文件是什么?
-
main.ts引入了App.vue和路由 → 网站,用 Vite -
index.ts导出组件 → NPM 库,用 tsup
-
-
打包命令是什么?
-
vite build→ 你在用 Vite -
tsup→ 你在用 tsup
-
最终结论 :工具的选择取决于你要产出的东西是什么------是一个可供用户访问的网站,还是一个可供开发者安装的代码包。明确了目标,工具的选择自然清晰。