跳到主要内容

Vite的HMR实现过程

· 阅读需 2 分钟
Jason Rong
前端糕手

Vite热更新流程

前言

ViteHMR(热更新)仅限于在开发环境下使用,故以下默认都处于开发环境下。

Vite的实现离不开现代浏览器原生支持ESM的特性。

当声明一个script 标签类型为module时,浏览器将对其内部的import引用发起HTTP请求获取模块内容。获取到内容后再进行执行

值得注意的是:浏览器只会对用到的模块发起 HTTP 请求,所以 Vite 开发期不必先打包全项目,而是按需编译浏览器请求到的模块。

开发模式下 Vite 的工作流程

  1. 启动开发服务器,并建立 WebSocket,用于与浏览器双向实时通信。
  2. 浏览器通过 HTTP 请求模块时,开发服务器拦截请求,对对应源码做转换(依赖预构建等多用 esbuild),把浏览器可执行的模块返回。

Vite 对某个模块进行更新

HMR 的工作流程

sequenceDiagram
participant FS as 文件系统
participant Vite as Vite Dev Server
participant WS as WebSocket
participant Browser as 浏览器

FS->>Vite: 文件变更
Vite->>Vite: 计算模块图 / 找 HMR boundary
Vite->>WS: 推送更新模块信息
WS->>Browser: 通知热更新
alt 边界 accept 成功
Browser->>Browser: 替换模块,保留状态
else 无法热替换
Browser->>Browser: 整页 reload
end
  • Vite 监听项目文件变化
  • 变更后沿依赖图分析影响范围;能热替换的模块走 import.meta.hot.accept 边界
  • 通过 WebSocket 通知浏览器重新请求/替换相关模块;边界失效则 full reload

HMR 只服务于开发环境,与生产 Rollup 打包是两条路径。

Vite 的流程图