一、先给一句话结论(面试开场)
Vite 之所以快,本质是利用了浏览器原生 ES Module + 开发环境不打包,只按需加载。
二、传统打包工具(Webpack)为什么慢?
Webpack 开发流程(简化)
所有源码
↓
分析依赖
↓
打包成一个或多个 bundle
↓
启动 dev server
问题在于:
-
项目一大
-
依赖一多
-
启动前必须全量打包
👉 启动慢、热更新慢
三、Vite 为什么快?(核心 3 点)
① 利用浏览器原生 ES Module(最关键)
Webpack
import React from 'react'; // 需要打包后才能运行
Vite
浏览器直接支持 import
-
不需要打包
-
浏览器自己处理依赖关系
👉 省掉"打包"这一步
② 开发环境:不打包 + 按需加载
Vite Dev 模式
访问某个页面
↓
只加载这个页面用到的模块
↓
没用到的不加载
-
首次启动:几乎秒开
-
页面切换:即时加载
👉 Webpack:全量
👉 Vite:按需
③ 依赖预构建(用 esbuild)
Vite 会对 node_modules:
-
只做一次预构建
-
用 esbuild(Go 写的)
速度对比:
esbuild >>> webpack(babel)
👉 依赖处理极快
四、HMR 为什么也快?
Webpack HMR
-
改一个文件
-
可能影响整个依赖图
-
重新打包
Vite HMR
改哪个模块 → 只更新哪个模块
-
精确到文件级
-
无需重新打包
👉 更新几乎瞬间完成
五、生产环境呢?Vite 不是不打包
⚠️ 很多人会误解
Vite 只是"开发环境不打包",生产环境依然打包
生产环境:
-
使用 Rollup
-
Tree Shaking 更强
-
体积更小
六、对比总结表(非常适合面试)
| 维度 | Webpack | Vite |
|---|---|---|
| 启动 | 慢(全量打包) | 快(不打包) |
| HMR | 慢 | 快 |
| 构建工具 | Babel | esbuild |
| 开发模式 | Bundle | Native ESM |
| 生产打包 | Webpack | Rollup |
七、面试官追问你也不慌
Q1:Vite 有没有缺点?
-
老浏览器不友好(需降级)
-
生态不如 Webpack 成熟
-
某些 CommonJS 兼容成本高
Q2:为什么不用 esbuild 做生产?
-
Rollup 更适合 Tree Shaking
-
插件生态成熟
八、30 秒背诵版(建议记这个)
Vite 快的原因主要是利用浏览器原生 ES Module,开发环境不进行打包,按需加载模块;同时依赖预构建使用 esbuild,速度非常快;HMR 只更新变更模块,因此启动和热更新都明显快于 Webpack。
九、一句话终极总结
Webpack 是"先打包再运行",Vite 是"边运行边加载"。