热替换不能降低构建时间,可能还会稍微增加,但是可以降低代码改动到效果呈现的时间

当使用webpack-dev-server时,考虑代码改动到效果呈现的过程

2020-02-21-14-20-49.png
而使用了热替换以后,流程发生了变化

2020-02-21-14-22-32.png

使用和原理

  1. 更改配置
  1. module.exports={
  2. devServer:{
  3. hot:true //开启HRM
  4. },
  5. plugins:[
  6. //可选
  7. new webpack.HotModule.ReplacementPlugin(); // webpack4 以后可以不写
  8. ]
  9. }
  1. 更改代码
  1. // index.js
  2. if(module.hot){ //是够开启了热更新
  3. module.hot.accept() //接受热更新
  4. }

首先,这段代码是会参与最终运行的

当开启了热更新后,webpack-dev-sever 会向到打包结果中注入 module.hot 的属性

默认情况下,webpack-dev-server 不管是否开启了热更新,当打包的的时候,都会调用location.reload 刷新页面

但是如果运行了module.hot.accept(),将改变这一行为

module.hot.accept() 的作用是让webpack-dev-server 通过socket管道,把服务器更新的内容发送到浏览器

2020-02-21-14-34-05.png
然后,将结果交给插件,HotModuleReplacementPlugin注入代码执行

插件HotModuleReplacementPlugin会根据覆盖原始代码,让后让代码重新执行

所以,热替换发生在代码运行期

样式热替换

对于样式也是可以使用热替换的,但是需要使用style-loader

因为热替换发生时,HotModuleReplacementPlugin只会简单的重新运行模块代码

因此style-loader的代码已运行,就会重新设置style元素中的样式

min-css-extract-plugin,由于它生成文件是在 ,运行期间并不会也无法改动文件,因此对于热替换是无效的