问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

解析Vite实现的核心原理

创作时间:
作者:
@小白创作中心

解析Vite实现的核心原理

引用
1
来源
1.
https://juejin.cn/post/7352552928391184384

Vite 介绍

Vite 是一种新型前端构建工具,能够显著提升前端开发体验。

Vite主要由两个部分组成

  • 一个开发服务器: 它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。

  • 一套构建指令: 生成环境它使用 Rollup 打包你的代码,提供指令来优化构建过程,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

Vite作为利用浏览器原生ESM的构建工具, 省略了开发环境的打包过程,利用浏览器去解析

imports

,服务端按需编译返回,同时速度快到提升了惊人的模块热更新,而且速度不会随着模块的增加而变慢。所以,使用Vite比Webpack开发项目快好几倍。

Vite有哪些主要特性:

  • 极速的冷启动:Vite采用原生ESM作为模块系统的实现,避免了传统打包工具在启动时的长时间编译过程,从而实现了极速的冷启动。

  • 热模块替换(HMR):Vite内置了热模块替换功能,可以在不刷新页面的情况下,实时更新模块代码,提高开发效率。

  • 原生ESM支持:Vite直接利用浏览器对ESM的支持,无需额外转换,使得代码更加原生、高效。

  • 插件化扩展:Vite支持通过插件进行扩展,开发者可以根据自己的需求,定制开发流程。

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将更新后的模块发送给客户端,客户端收到更新后,会替换掉原有的模块,实现热更新。

1. 基于ESM的 Dev Server

在Vite出现之前,传统的打包工具如Webpack通常会在启动开发服务器之前解析所有依赖并进行打包构建。这意味着Dev Server必须等待所有模块构建完成,即使在开发过程中只修改了一个子模块,整个bundle文件也会重新打包,导致启动时间随着项目规模增大而变长。

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

2. 基于ESM的 HRM 热更新

ESM(ECMAScript 模块)是 JavaScript 的官方模块系统,由浏览器原生支持。Vite 利用了浏览器对 ES 模块的支持,实现了基于 ESM 的热模块替换(HMR)功能。下面是具体实现原理:

模块标识符的处理:Vite 在处理模块时,通过识别 import 语句中的模块标识符,可以动态地构建出模块之间的依赖关系图。

WebSocket 通信:Vite 启动一个 WebSocket 服务器,用于与客户端建立持久连接,实现双向通信。通过 WebSocket,Vite 可以向客户端发送消息,告知其发生了模块变化,并触发热更新操作。

模块替换:当开发者修改了某个模块的代码后,Vite 检测到变化后,会重新编译并构建该模块。然后,Vite 通过 WebSocket 向客户端发送更新消息,告知客户端有模块发生了变化。

客户端处理:客户端接收到更新消息后,会根据更新消息中的信息,以及之前构建好的模块依赖关系图,进行相应的模块替换操作。具体来说,它会以非阻塞的方式请求被更新的模块,然后将新的模块代码插入到当前页面中,完成热更新操作。

局部更新:Vite 可以实现局部更新,即仅更新发生变化的模块,而不需要重新加载整个应用程序。这样可以显著减少开发过程中的刷新时间,提高开发效率。

总的来说,Vite 利用了浏览器原生对 ES 模块的支持,通过 WebSocket 实现了与客户端的实时通信,从而实现了基于 ESM 的热模块替换功能。这种实现方式使得开发者可以更快地看到代码修改后的效果,加快了开发迭代速度。

3. Vite实现的核心流程

启动服务器

  • Vite首先启动一个开发服务器,该服务器使用原生ESM(ECMAScript模块)规范。
  • 服务器同时创建一个WebSocket连接,用于实现与浏览器的实时通信。

解析请求

  • 当浏览器请求一个模块(例如,通过
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号