上周面试时,面试官问到Vite原理时的语塞,回想起来依然尴尬。但失败是最好的老师。今天带着总结出来的要点和大家来共同学习一下。
一、Vite是什么?
首先,讲下Vite
名字的由来,Vite
实际上是法语中快的意思,所以顾名思义,这个工具就是为了给我们带来更快的开发体验,它是一个面向现代浏览器,基于ECMA
标准的ES Module
实现的一个更轻更快的Web
应用开发工具
二、Vite为什么快
2.1 工作机制
为什么说只面向现代浏览器,而不顾之前的浏览器,是因为Vite
本身是一个Web
应用开发者工具,而对于开发者来说,一般都是使用比较先进的浏览器来进行开发,所以我们可以直接使用一些现代浏览器支持的特性,而不考虑去兼容一些老的浏览器。
而现代浏览器支持的特性中,在Vite
中最为重要的一个,就是ES module
。由于vite是面向现代浏览器的,所以它利用浏览器去解析imports
,在服务器端按需编译返回,跳过打包过程。同时支持Vue
文件和HMR
(热更新),针对生产环境可以使用Rollup
打包。
ES Module是编译时静态加载(
import/export
),支持Tree-shakingCommonJS是运行时动态加载(
require/module.exports
),无法静态优化。
2.2 和webpack启动流程对比
Vite启动流程 | Webpack启动流程 |
---|---|
1. 启动服务器 | 1. 扫描所有模块 |
2. 按需编译首个页面 | 2. 打包成bundle |
3. 其他模块等请求时再处理 | 3. 启动服务器 |
这就像现点现做的盖饭,而不是像自助餐一样,提前准备所有菜品。 Vite
像馆子里现点现做的厨师,而Webpack
像是凌晨4点就需要备菜的食堂阿姨
三、 热更新(HMR)
热更新(Hot Module Replacement
,HMR
)是一种在开发过程中实时更新模块的技术,无需重新加载整个页面,从而提升效率。
3.1 Vite的热更新
Vite
的热更新(HMR
)通过浏览器原生支持 ES
模块和 WebSocket
实现。当代码文件被修改时,Vite
服务端会精准定位到变化的模块,通过 WebSocket
通知浏览器,浏览器动态加载新模块并替换旧模块,无需刷新页面。例如修改 Vue
单文件组件时,仅该组件的实例会被更新,保留当前应用状态。
3.2 Webpack热更新有何不同
- 实现方式 :使用
HotModuleReplacementPlugin
插件,并配置webpack-dev-server
启用HMR。 - 工作原理 :开发服务器监控文件变化,检测到变化后重新编译并推送更新,浏览器通过
WebSocket
接收并替换模块。
Vite
的 HMR
利用浏览器原生 ESM
特性,直接按需加载模块,无需打包,因此更新速度更快。而 Webpack
的 HMR
依赖打包后的模块系统,每次修改需重新构建依赖图,并通过 hot.accept
手动声明更新边界。
修改一个 Vue
文件时,Vite
仅替换该文件,而 Webpack
可能需要重新构建整个 chunk
。
四、Tree shaking
Tree Shaking(摇树优化) 是一种在打包过程中静态分析并移除未被使用的代码(Dead Code) 的技术,通过消除未引用的模块或函数,减少最终构建产物的体积。
4.1 Vite的Tree sharking
Vite
的Tree shaking
核心是利用ES Module
的静态结构特性。在打包时(比如生产环境构建),Vite
会通过静态分析代码的导入导出关系,识别出哪些导出未被其他模块使用。这些未被使用的代码会被标记为dead code
,最终由Rollup
(Vite
的生产打包工具)移除。
比如,如果一个工具库导出了10个函数,但项目只用了其中3个,剩余7个会被自动删除。与Webpack
不同,Vite
在开发模式下借助浏览器原生ESM能力也能实现按需加载,而生产环境则通过Rollup
的优化算法实现更彻底的tree shaking。
4.2 和Webpack 的 Tree sharking 有什么区别?
Vite 与 Webpack 在开发与生产环境的构建机制存在差异,我们分开来讲。
4.2.1 开发环境
Vite
的Tree shaking
在开发阶段就利用浏览器原生ES Module的能力,实现实时按需加载,无需打包即可剔除未引用代码。
而Webpack
必须通过babel
转换代码为CommonJS
等格式,再通过uglify
或terser
插件做后期优化,过程更耗时。
4.2.2生产环境
在生产环境,Vite
使用Rollup
进行打包,其Tree shaking
算法能精准识别跨模块的无效代码(如未使用的导出变量);
而Webpack
默认配置可能残留部分未引用代码,需要手动配置optimization.usedExports
等选项。
tip:Rollup 是一个专注于 ES Modules 的 JavaScript 模块打包工具,其核心优势是高效的 Tree-shaking 和扁平化的输出结构。
优点:ESM 原生支持、Tree-shaking 精准、输出更简洁
五、与Webpack对比优劣势总结
维度 | Vite | Webpack |
---|---|---|
构建原理 | 开发环境ESM原生加载 + 生产Rollup | 全程打包(含开发环境) |
启动速度 | ✅ 毫秒级(无需打包) | ❌ 随项目增大指数级增长 |
HMR效率 | ✅ 精准更新(模块级替换) | ❌ 需重建依赖图(文件级) |
Tree-shaking | ✅ 基于ESM的静态分析(更彻底) | ❌ 依赖代码转换(需插件优化) |
配置复杂度 | ⚡ 开箱即用(预设优化) | 🔧 需手动配置loader/plugin |
浏览器兼容 | ❗ 需现代浏览器 | ✅ 支持旧浏览器(通过polyfill) |
适用场景 | SPA、现代框架项目 | 复杂工程、遗留系统改造 |
总结下来就是 Vite
启动又快、打包又快且开箱即用对新手友好,缺点就是需现代浏览器,
六、 总结
- 开发范式差异:
- Vite采用
Unbundled Development
模式,利用浏览器直接解析ESM - Webpack坚持
Bundled Development
模式,需构建完整依赖图谱
- 模块处理机制:
- Vite通过ESM的
import/export
实现实时按需编译 - Webpack需通过
AST解析
构建模块依赖关系图
- 生产构建策略:
- Vite使用Rollup打包(更擅长ESM处理)
- Webpack自带打包系统(支持更复杂的代码拆分)