我会从它的设计思想、工作流程、核心技术点三个方面详细讲解,让你理解它为什么比 Webpack 启动快、热更新快。
1. Vite 是什么?
Vite(法语:快速)是一个前端构建工具,主要用于 开发环境 的快速启动和热更新,以及 生产环境 的打包优化。
它的核心目标:
开发时:无需打包,按需编译
生产时:使用 Rollup 进行高效打包
2. Vite 的设计思想
2.1 为什么 Webpack 启动慢?
- Webpack 在启动时会递归解析并打包所有模块,生成依赖图。
- 即使只改了一个文件,也可能需要重新打包整个项目。
2.2 Vite 的优化思路
-
开发环境:
- 不做整体打包,而是按需加载。
- 利用浏览器原生支持的 ES Module(
<script type="module">)。 - 每个文件都作为一个单独的模块请求,由 Vite 服务器实时编译。
-
生产环境:
- 利用 Rollup 打包,生成高效的静态资源。
3. Vite 的工作原理
3.1 开发环境(Dev Server)
-
启动服务器
- Vite 启动一个 Node.js 开发服务器。
- 浏览器请求模块时,服务器实时编译并返回。
-
模块解析
-
遇到
import或export,Vite 会:- 解析路径(处理别名、省略后缀)。
- 编译文件(例如:TS → JS、JSX → JS、Sass → CSS)。
- 返回编译后的 ES Module。
-
-
依赖预构建
-
对
node_modules中的依赖进行预构建(使用 esbuild):- 将 CommonJS 转成 ES Module。
- 将多个小模块打包成一个大模块,减少 HTTP 请求。
-
这一步只在启动时执行一次,之后直接缓存。
-
-
热更新(HMR)
- 利用 WebSocket 监听文件变化。
- 只重新编译变化的模块,并且只替换该模块,而不是刷新整个页面。
- 样式文件(CSS)可以即时更新,无需刷新。
3.2 生产环境(Build)
-
使用 Rollup 打包:
- 静态分析依赖,生成更小的 bundle。
- 支持 Tree Shaking(删除未使用的代码)。
- 自动分割代码,按需加载。
-
不使用开发时的按需加载模式,因为生产环境需要最佳性能和兼容性。
4. Vite 的核心技术点
4.1 ES Module 原生支持
- 浏览器直接加载
import/export。 - Vite 只在请求时编译对应模块,无需提前打包。
4.2 esbuild 预构建依赖
-
esbuild 是用 Go 语言编写的打包工具,比 JS 编写的工具快 10~100 倍。
-
用于:
- 将 CommonJS 转成 ES Module。
- 将多个小依赖合并成一个大文件。
4.3 按需编译
- 开发时,只有被请求的模块才会被编译。
- 启动速度快,热更新快。
4.4 热更新(HMR)
- 基于 ES Module 的热替换。
- 样式文件可以即时更新。
- JS/TS 文件只替换修改的部分。
5. 工作流程示意图
《开发环境》:
浏览器 <--(ES Module)-- Vite Dev Server
↑ ↓
请求模块 实时编译(TS/JSX/Sass)
↑ ↓
缓存结果 依赖预构建(esbuild)
《生产环境》:
源代码 --> Rollup 打包 --> 静态资源(JS/CSS/图片)
6. Vite 与 Webpack 对比
| 特性 | Vite | Webpack |
|---|---|---|
| 启动速度 | 极快(按需编译) | 较慢(整体打包) |
| 热更新速度 | 极快(只更改变动模块) | 较慢(可能重新打包) |
| 开发模式 | 基于原生 ES Module | 基于打包后的 bundle |
| 生产打包 | 使用 Rollup | 内置打包 |
| 适用场景 | 现代前端项目(Vue/React) | 大型复杂项目 |
7. 总结
Vite 的原理可以概括为:
-
开发时:
- 不打包,按需编译。
- 利用浏览器原生 ES Module。
- 依赖预构建(esbuild)提升速度。
- 热更新只替换修改的模块。
-
生产时:
- 使用 Rollup 打包优化。
- 生成高效的静态资源。