当我们以watch方式启动webpack 时,每次保存修改的文件后,webpack会重新编译,浏览器重新刷新加载资源,这意味着页面上我们已经操作的流程会被刷新,开发起来及其不方便。更好的方式是浏览器不刷新就将重新编译的代码加载进来重新渲染。
HMR(Hot Module Replacement)就是解决这个问题的。
HMR是怎么工作的?
当整个应用还在运行的时候,HMR允许我们修改、增加、删除js模块,不用刷新浏览器。
在Webpack Development Server内部创建HMR server ,它会和浏览器中的HMR runtime通过websocket通信。

流程如下:
1、第一次启动应用时,webpack会生成manifest文件,该文件包含了构建的hash,以及所有模块的清单,并且将HMR runtime内置到构建生成的内容中
2、保存修改的文件后,会被webpack检测到
3、webpack将会重新编译一次整个应用,创建一个新的manifest文件并和旧的最对比,这个过程也称作热更新
4、热更新将会被发送到HMR server ,HMR server 将更新发送给HMR runtime
5、HMR runtime使用合适的loader处理变更
如果HMR server向HMR runtime发送update失败了,HMR server会通知webpack-dev-server,webpack-dev-server会重新刷新整个浏览器,该行为可以通过hotOnly: true禁用
怎么开启HMR
// webpack.config.jsmodule.exports = {entry: {app: './src/index.js',},devtool: 'inline-source-map',devServer: {hot: true,// ... other config omitted},plugins: [// Enable the pluginnew webpack.HotModuleReplacementPlugin(),],}
// index.jsimport component from "./component";document.body.appendChild(component);// Check if HMR interface is enabledif (module.hot) {// Accept hot updatemodule.hot.accept();}
