热更新

开启

  devServer: {
    // 开启 HMR 特性,如果资源不支持 HMR 会 fallback 到 live reloading
    hot: true
    // 只使用 HMR,不会 fallback 到 live reloading
    // hotOnly: true
  },
  plugins: [
    // …
    // HMR 特性所需要的插件
    new webpack.HotModuleReplacementPlugin()
  ]

原理

启动一个 websocket 监听文件 id 变化,执行除以 js,并重新执行

if (module.hot) {
  module.hot.accept("./number", function() {
    document.body.removeChild(document.getElementById("number"));
    number();
  });
}

热更新插件也就是通过对每个文件进行监听

常见问题

运行时错误

如果处理热替换的代码(处理函数)中有错误,结果也会导致自动刷新。导致无法看到错误日志,

解决办法:开启 hotonly

未开启 HMR
if (module.hot) {
  // 确保有 HMR API 对象
  module.hot.accept("./editor", () => {
    // …
  });
}