skip to content
天真笔录

webpack热更新原理浅谈

/ 2 min read

什么是浏览器热更新

指的是本地开发的同时打开浏览器进行预览,当代码文件发生变化时,浏览器自动更新页面内容的技术。这里的自动更新,表现上又分为自动刷新整个页面,及页面整体无刷新而只更新页面的部分内容

热更新配置

devServer: {
	host: true;
}

热更新原理

开发环境下,浏览器是客户端,webpack-dev-server(WDS)是服务端。HMR的核心就是客户端从服务端拉取更新后的资源(准确的说拉取的不是整个资源文件,而是chunk diff,即chunk需要更新的部分)

拉取更新的时机

websocket WDS与浏览器之间维护了一个websocket,当本地资源发生变化时,WDS向浏览器推送更新事件,并带上这次构建的hash(客户端与上一次资源进行对比,通过对比hash可以防止冗余更新),

拉取什么

hot-update
  1. 浏览器向WDS发起一个请求来获取更改文件的列表,即哪些模块有了改动([hash].hot-update.json)
  2. 返回结果 {“c”:[“main”],“r”:[],“m”:[]}
  3. 根据返回结果得知需要更新的chunkmain
  4. 客户端继续向WDS发起请求来获取该chunk的增量更新(man.abaa884bd296988c4fe3.hot-update.js)
  5. 得到chunk的更新

处理更新

通过module.hot.accept来处理更新,如vue-loaderreact-hot-loader

源码分析

module-hot

可以看到webpack在运行时为css添加了一些代码,借助module.host.accept完成更新