🧠 你一定遇到过这个问题
你有没有这种体验:
👉 用 Webpack
- 项目一启动:等 10 秒起步
- 改一行代码:再等 1~3 秒刷新
👉 换成 Vite
- 项目:秒开
- 改代码:几乎“瞬间刷新”
很多人会说:
“因为 Vite 用了 ES Modules,所以更快”
但这个答案,只说对了一半。
👉 真正的原因是:Vite 把“开发阶段最耗时的事情,直接删掉了”。
⚔️ 一句话讲清本质差异
👉 Webpack:先全部打包,再运行
👉 Vite:运行时按需编译
如果你记不住技术细节,记住这个类比就够了👇
🍳 类比一下(非常重要)
- Webpack:
👉 客人没来,先把整桌菜全做完 - Vite:
👉 客人点一道,我做一道
👉 差距就出来了。
🐢 为什么 Webpack 一启动就慢?
本质就一句话:
👉 它必须“先做完所有事情”,你才能开始用
它到底在干嘛?
扫描所有文件 → 构建依赖图 → 全量编译 → 打包 → 输出 bundle.js
👉 哪怕你只打开一个页面:
- 项目里 1000 个文件
- 它也得处理 1000 个
更致命的是👇
👉 你改一行代码:
可能要重新打包一大部分代码
👉 所以你看到的就是:
- 启动慢
- 修改慢
- 项目越大越慢
⚡ Vite 做了一件“反常识”的事
👉 它在开发阶段,直接“不打包了”
启动时它在干嘛?
启动一个本地服务器 → 完事
👉 没有打包
👉 没有编译全部代码
真正的编译发生在什么时候?
👉 浏览器请求的时候
浏览器要哪个文件 → Vite 才编译哪个文件
👉 举个例子:
你项目有 1000 个文件
- Webpack:编译 1000 个
- Vite:可能只编译 50 个
👉 这就是本质差距
🧠 那浏览器为什么现在可以这样玩?
因为浏览器变强了👇
✅ 1. 原生支持 ES Modules
import { foo } from './foo.js'
浏览器现在可以:
- 自动请求依赖
- 自动执行模块
👉 不需要打包
✅ 2. HTTP/2 多路复用
以前:
👉 多请求 = 慢 ❌
现在:
👉 多请求 = 可以并行 ✅
👉 所以:
“不打包 + 多文件加载”反而变成可行方案
🔥 Vite 到底做了哪些“骚操作”?
核心就三件事👇
① 改写 import(很关键)
你写:
import React from 'react'
浏览器看不懂 ❌
👉 Vite 帮你改成:
import React from '/node_modules/.vite/react.js'
👉 浏览器:OK ✅
② 用 esbuild 快速编译
浏览器看不懂:
- TS
- JSX
- Vue
👉 Vite 用 esbuild:
- 实时转成 JS
- 速度比 Babel 快 10~100 倍
③ 依赖预构建(只做一次)
node_modules 很重?
👉 Vite:
提前处理一次 → 缓存下来
路径:
node_modules/.vite
👉 后面直接复用
⚡ 为什么 Vite 热更新快到离谱?
Webpack:
改代码 → 重新打包 → 更新页面
Vite:
改代码 → 只更新这个模块 → 页面瞬间变化
👉 本质:
👉 更新粒度更小
🧩 最关键的认知升级(这段决定你有没有理解)
很多人以为:
👉 Vite 是“更快的 Webpack”
其实不是。
Vite 做的事情,本质上是:
👉 把“打包”这件事,从开发阶段移除了。
换句话说:
- Webpack 是:构建驱动(Build-driven)
- Vite 是:请求驱动(Request-driven)
这不是优化,而是思路的改变。
📊 用一句话总结
👉 Webpack 慢,是因为它“什么都要提前做”
👉 Vite 快,是因为它“只做你现在需要的”
🚀 写在最后
👉 Webpack 像:
出门前把所有行李都打包好(哪怕你只用一件衣服)
👉 Vite 像:
到酒店再按需要东西