Vite基本概念及实现原理

介绍

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 或其他打包工具进行打包
  • 打包过程会进行代码优化、压缩和分割等操作,以减小最终代码的体积并提高加载性能
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值