一、HMR热更新

image.pngimage.png

1.1 问题:

更改源代码样式时,保存,devServer会自动进行打包,页面会自动进行刷新,会造成页面填写的原先的数据消失;如下图:
QQ录屏20220630215649_.gif

2.2 热更新解决:

2.2.1 配置热更新:

a. 开启热更新之后,更改样式页面不会刷新、页面上数据不会丢失;
b. 不会重新发起http请求本地服务器返回的页面,也就是webpack没有进行第二次重新打包,提高效率
QQ录屏20220630220726_.gif
页面未刷新,未重新进行http请求
QQ录屏20220630221048_.gif

  1. const webpack = require('webpack');
  2. module.exports = {
  3. devServer: {
  4. hot: true, // 热模块更新
  5. },
  6. plugins: [
  7. new webpack.HotModuleReplacementPlugin()
  8. ]
  9. }

image.pngimage.png
image.png

二、js里的热更新

2.1 问题:

  1. a. 改变`js`里面的数据,保存之后,页面也会进行**重新刷新**,重新像本地服务器**发起http**请求;造成之前写的数据丢失<br />b. 一个模块中的源码发生变化,页面会刷新<br />![QQ录屏20220630224001_.gif](https://cdn.nlark.com/yuque/0/2022/gif/26269327/1656600383372-0ad6ffe2-e320-4727-82d1-49c1c1ce1093.gif#clientId=u36e0965c-5c7d-4&crop=0&crop=0&crop=0.8663&crop=1&from=paste&height=517&id=u8ce5390a&margin=%5Bobject%20Object%5D&name=QQ%E5%BD%95%E5%B1%8F20220630224001_.gif&originHeight=746&originWidth=1360&originalType=binary&ratio=1&rotation=0&showTitle=false&size=798434&status=done&style=none&taskId=ua93b5383-e155-40e7-a4a7-e6fb665dd31&title=&width=943)

2.2 在dev-server开启热模块更新配置:

开启js的热模块更新:
webpack配置 + 如下图的配置
image.png

const webpack = require('webpack');
module.exports = {
    devServer: {
        hot: true,  // 热模块更新
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ]
}

image.png

2.2.1 css里有style-loader自动开启模块监听,js需要手动开启,模块监听

  1. 监听单个js模块热更新的变化.accept('xxxx', ()=> {})
  2. 监听多个js模块变化: .accept(['test1.js', 'test2.js', 'test3.js'], () => {})
  3. accept 监听的模块才会开启热更新,没监听的**js**模块 代码变化,会更新
import counter from './counter';
import number from './number';

counter(); number();

// 监听模块的变化执行回调
if (module.hot/* 开启了热跟新模块 */) {
    module.hot.accept('./number'/*监听的模块*/, () => {
        // 模块发生变化 触发的回调

    })
}

image.png

 数据改变未 88  开启`js`热模块跟新后:页面数字未跟新<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26269327/1656600881444-849e1460-dd40-4425-b479-69c20b3e8e35.png#clientId=u36e0965c-5c7d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=203&id=uba24ddd0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=254&originWidth=975&originalType=binary&ratio=1&rotation=0&showTitle=false&size=98132&status=done&style=none&taskId=u009dd77c-890f-43ef-a897-9661f65d18c&title=&width=780)

通过回调的方式,重新执行变化的模块中的业务逻辑函数
image.png

三、问:

为什么css更改样式,不需要添加这样的代码?
image.png

  1. **style-loader ** 中内置了一段这样的代码….
  2. vue-loader 中也内置了这一段代码
  3. react -> babel-preset 也内置了这样一段代码