HMR使用
Hot Module Replacement(简称 HMR)
webpack hmr 原理参考:https://www.jianshu.com/p/95f5f51e6fc7
hmr api :https://cloud.tencent.com/developer/section/1477225
前言
hmr 热更新(就是项目发生变化页面更新)
hmr能够使项目在运行时,无需开发者重新npm run dev 刷新页面,便能更新更改模块,目前有许多脚手架——比如vue-cli ,create-react-app 这些脚手架自动为我们配置好了热更新功能,但某些情况还是需要我们自己配置
webpack 项目中开启hmr
hmr是集合在 webpack-dev-server中
第一步:开启hmr
webpack.config.js 加入一下这三步就可以使用hmr
const webpack = require('webpack') //1module.exports = {devServer:{ //2// hot:true,//错误情况如果在运行中出现错误hmr浏览器会自动刷新了打印页面找不到错误信息这时候就需要修改hot改为hotOnlyhotOnly:true //好处是,打印信息面板不会自动刷新},module: { ... },plugins: [new webpack.HotModuleReplacementPlugin()//3 webpack中包含的HotModuleReplacrmentPlugin 插件]}
执行项目时,这些样式或者js都不会热更新。为什么呢?因为hmr并不像webpack其他插件开箱即用,它需要额外配置 。而样式文件可以是经过loader处理过的所以不需要我们去做额外操作。(条件是,使用css-loader打包css)。js文件则需要自己配置因为每个文件的需求不同,没办法统一。
第二步处理js的热更新
main.js
import createEditor from './editor'import background from './better.png'const editor = createEditor()document.body.appendChild(editor)const img = new Image()img.src = backgrounddocument.body.appendChild(img)-------------- 以上与配置无关 ----------------------// module 提供的hot 是hmr api的核心对象// accept('更改的路径','依赖模块更新后的处理函数') 注册某一模块更新后的处理函数 接受两个参数module.hot.accept('./editor',()=>{console.log("editor 模块更新了")})
js页面需要手动加入 accept接收两个参数
accept的两个参数
第1个参数.'./editor' 如果editor模块修改需要更新的模块路径 如 editor修改后把修改的内容放置editor.js模块中第2个参数.function(){} 更新后的模块处理函数
开始更新模块处理
console.log(createEditor)module.hot.accept('./editor',()=>{console.log(createEditor) // 查看className})

由此得知 。我们已经拿到旧的内容和新内容。我的需求是:把新修改的数据替换掉旧数据。(简而言之:新的替换旧的内容)
let oldCreateEditor = editor; //需要在这里记录下旧的内容module.hot.accept('./editor',()=>{console.log("editor 模块更新了")document.body.removeChild(oldCreateEditor)const newCreateEditor = createEditor()document.body.appendChild(newCreateEditor)oldCreateEditor = newCreateEditor})
配置完成之后启动 webpack-dev-server
这里是 webpack4 的命令:yarn webpack-dev-server —open(启动hmr需要启动webpack-dev-server)
webpack5 命令: yarn webpack server —open
图片的热更新图片热更新是比较简单的。我们都知道 module里面的是最新内容 当然也是background的最新链接,直接重新复制src就可以完成热更新。(可以有多个 module.hot.accetp)
module.hot.accept('./better.png',() => {img.src = background})
也可以将hot替换为 hotOnly
devServer:{// hot:true,//错误情况如果在运行中出现错误,浏览器会自动刷新了打印页面找不到错误信息,这时候就需要修改hot改为hotOnlyhotOnly:true //好处是,打印信息面板不会自动刷新},
