Vite热更新原理主要包括以下几个方面:
Dev Server的作用:
- 在开发环境中,Vite通过启动一个Dev Server来监听代码的变动。
- 当代码更新时,Dev Server会进行相应的处理,避免了整个页面的重新加载。
HMR机制:
- HMR允许在不刷新页面的情况下更新代码,无论是编辑组件标记还是调整样式,都能立即反映在浏览器中。
- 当编辑文件并保存后,文件系统监视器会检测到更改,并将文件路径传递给Vite开发服务器。
- 开发服务器使用这个路径找到相关的模块,并将其传递给插件的handleHotUpdate钩子进行进一步处理,最终确定需要更新的模块及其导入者。
模块失效与更新:
- Vite会将最终更新的模块数组及其导入者递归失效,即移除这些模块的转换代码,并附加一个失效时间戳。
- 更新的模块数组将通过HMR传播,形成一个“HMR边界”。如果所有更新的模块都在这个边界内,将通知客户端接受的模块执行HMR更新;否则,会导致完整的页面重新加载。
客户端的角色:
- HMR客户端在Vite应用中负责与Vite开发服务器建立WebSocket连接。
- 客户端监听来自服务器的HMR载荷,提供并触发HMR API,以及将任何事件发送回Vite开发服务器。
- 当HMR更新实际发生时,客户端会找到相应的模块,并调用其import.meta.hot.accept回调进行更新处理。
代码修剪与事件监听:
- Vite在导入分析阶段内部处理HMR修剪,当一个模块不再被其他模块导入时,会向客户端发送裁剪模块的指令。
- 客户端还可以监听并处理HMR事件,以及通过import.meta.hot.data共享数据。
总结:Vite通过高效的开发服务器配置和HMR机制,在不刷新页面的情况下实现了代码更新,显著提升了开发效率。这一过程包括模块替换、HMR更新、客户端处理、修剪代码和事件监听等多个关键步骤。