介绍
Vite 是一种新型前端构建工具,它主要由两个部分组成:
- 一个开发服务器: 它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新
- 一套构建指令: 它使用 Rollup 打包你的代码,提供指令来优化构建过程,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源
Vite 作为利用浏览器原生 ESM 的构建工具, 省略了开发环境的打包过程,利用浏览器去解析imports,服务端按需编译返回,同时速度快到提升了惊人的模块热更新,而且速度不会随着模块的增加而变慢。所以,使用 Vite 比 Webpack 开发项目快好几倍。
Vite 有以下几个主要特性:
1)极速的冷启动:Vite 采用原生 ESM 作为模块系统的实现,避免了传统打包工具在启动时的长时间编译过程,从而实现了极速的冷启动
2)热模块替换(HMR) :Vite 内置了热模块替换功能,可以在不刷新页面的情况下,实时更新模块代码,提高开发效率
3)原生 ESM 支持:Vite 直接利用浏览器对 ESM 的支持,无需额外转换,使得代码更加原生、高效
4)插件化扩展:Vite 支持通过插件进行扩展,开发者可以根据自己的需求,定制开发流程
实现原理
Vite 的实现原理主要基于原生 ESM、Rollup 以及 WebSocket 等技术
- 原生ESM:Vite 利用浏览器对 ESM 的原生支持,将项目中的模块按照 ESM 的规范进行组织。在开发过程中,Vite 只会处理被引用的模块,而不会对整个项目进行打包,从而实现了极速的冷启动
- Rollup:虽然 Vite 没有直接采用 Webpack 作为打包工具,但它借鉴了 Rollup 的思想。Rollup 是一个轻量级的模块打包器,它采用基于 ESM 的 tree shaking 技术,可以去除未使用的代码,减少打包体积。Vite 在构建生产环境代码时,会利用 Rollup 进行打包,因此 Vite 还附带了一套 构建优化 的 构建命令,开箱即用
- WebSocket:为了实现热模块替换功能,Vite 使用 WebSocket 在服务器和客户端之间建立了一个长连接。当文件发生变化时,服务器会通过 WebSocket 将更新后的模块发送给客户端,客户端收到更新后,会替换掉原有的模块,实现热更新
基于 ESM 的 Dev Server
在 Vite 出现之前,传统的打包工具如 Webpack 通常会在启动开发服务器之前解析所有依赖并进行打包构建,这意味着 Dev Server 必须等待所有模块构建完成,即使在开发过程中只修改了一个子模块,整个 bundle 文件也会重新打包,导致启动时间随着项目规模增大而变长。

相比之下,Vite 充分利用了浏览器对 ESM 的原生支持。当代码执行到模块加载时,浏览器会动态地下载导入的模块,而不需要等待整个项目的构建完成。这种动态加载的方式实现了即时编译,使得灰色部分(即暂时未用到的路由)不会参与构建过程。因此,随着项目规模的增大和路由的增加,Vite 的构建速度不会受到影响。

基于 ESM 的 HRM 热更新
ESM(ECMAScript 模块)是 JavaScript 的官方模块系统,由浏览器原生支持。Vite 利用了浏览器对 ES 模块的支持,实现了基于 ESM 的热模块替换(HMR)功能。下面是具体实现原理:
1)模块标识符的处理:Vite 在处理模块时,通过识别 import 语句中的模块标识符,可以动态地构建出模块之间的依赖关系图
2)WebSocket 通信:Vite 启动一个 WebSocket 服务器,用于与客户端建立持久连接,实现双向通信。通过 WebSocket,Vite 可以向客户端发送消息,告知其发生了模块变化,并触发热更新操作
3)模块替换:当开发者修改了某个模块的代码后,Vite 检测到变化后,会重新编译并构建该模块。然后,Vite 通过 WebSocket 向客户端发送更新消息,告知客户端有模块发生了变化
4)客户端处理:客户端接收到更新消息后,会根据更新消息中的信息,以及之前构建好的模块依赖关系图,进行相应的模块替换操作。具体来说,它会以非阻塞的方式请求被更新的模块,然后将新的模块代码插入到当前页面中,完成热更新操作
5)局部更新:Vite 可以实现局部更新,即仅更新发生变化的模块,而不需要重新加载整个应用程序
Vite 实现的核心流程
1)启动服务器
- Vite 首先启动一个开发服务器,该服务器使用原生 ESM 规范
- 服务器同时创建一个 WebSocket 连接,用于实现与浏览器的实时通信
2)解析请求
- 当浏览器请求一个模块时,Vite 服务器接收请求
- 服务器解析请求,确定要加载的模块
3)模块转换
- 如果请求的模块需要转换(例如,使用 Vue 或 React 等框架编写的组件),Vite 会调用相应的插件或转换器进行处理
- 转换后的模块被缓存起来,以便后续请求可以更快地提供服务
4)发送模块到浏览器
- Vite 服务器将处理后的模块作为 HTTP 响应发送给浏览器
- 浏览器接收到模块后,按照 ESM 规范进行加载和执行
5)文件监听与热更新
- Vite 服务器使用文件系统监听器来监控项目文件的变化,当文件发生变化时,Vite 会重新处理受影响的模块
- 通过 WebSocket 连接,Vite 将更新后的模块发送给浏览器,浏览器接收到更新后,使用 HMR 机制替换旧模块,无需重新加载整个页面
6)构建生产环境代码
- 当需要构建生产环境的代码时,Vite 会使用 Rollup 或其他打包工具进行打包
- 打包过程会进行代码优化、压缩和分割等操作,以减小最终代码的体积并提高加载性能
3163

被折叠的 条评论
为什么被折叠?



