webpack HMR学习笔记

371 阅读2分钟

简介

模块热替换(hot module replacement 或 HMR)为webpack提供了允许在运行时更新所有类型的模块,而无需完全刷新的功能

服务端

热模块替换流程

hmr.jpg

启动:
1.npm run dev 运行webpack指令
2.执行webpack(config)即生成compiler,通过webpack-dev-server创建(express )Server
   a. 注册webpack编译完成done编译结束事件,向客户端发送ok,hash消息的回调_sendStats
   b.设置内存文件系统memeory-fs
   c.setupDevMiddlerware添加 【webpack-dev-middleware 中间件】,负责返回生成的文件
3.createSocketServer 创建websocket连接双工通信

【注】webpack-dev-server只负责启动服务和前置准备工作,webpack-dev-middleware进行文件相关操作

运行:
1.调用compiler.watch监听本地文件变化(文件的生成时间)
2.编译结束生成新的hash并触发done事件的回调函数,通过socket向客户端发送【下一次更新的】hash值和ok
3.根据客户端的请求发送,xxx/hash.hot-update.json、xxx/hash.hot-update.js 文件,
4.根据客户端的请求发送相关的模块文件

客户端

1.客户端接收到hash值和ok,调用reloadApp函数;如果支持热更新,触发webpackHotUpdate事件,否则直接刷新浏览器
2.webpack/hot/dev-server.js监听到webpackHotUpdate事件后,调用check方法,即HotModuleReplacementPlugin的module.hot.check方法
3.HotModuleReplacement.runtime 开始热更新
   a.通过hotDownloadManifest 方法,应用原hash值,发送xxx/hash.hot-update.json的ajax请求(即此处的manifest 为 hot-update.json文件)
   b.请求结果见“示例”,获取热更新的模块、(下次热更新的hash标识:现已在前面实现,即h没有值),并进入热更新准备阶段
   c.通过调用hotDownloadUpdateChunk发送xxx/hash.hot-update.js的 JSONP请求,获取新模块内容
   d.通过hotAddUpdateChunk方法将更新的模块moreModules赋值给全局全量hotUpdate
   e.hotUpdateDownloaded方法会调用hotApply进行代码的替换
4.hotApply新模块替换
   a.根据id找到旧模块
   b.将新模块添加到modules中
   c.通过__webpack_require__执行新模块代码

【注】hash事件,更新最新一次打包后的hash值; ok事件,进行热更新检查。

xxx.hash.hot-update.json示例
// index.02e99571483ec89bed56.hot-update.json 
{ c: ["index"], r: [ ], m: [ ] }

参考:

模块热替换
轻松理解webpack热更新原理:引用图片
彻底搞懂并实现webpack热更新原理