模块热替换(HMR - Hot Module Replacement)作用:是指在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度:

  • 保留在完全重新加载页面时丢失的应用程序状态。
  • 只更新变更内容,以节省宝贵的开发时间。
  • 调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式。

热更新配置:(在devServer对象里配置)

webpack.config.js

// 在这里做打包配置
const path = require('path'); // 引入node的path模块(loader模块)
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
// 引入热更新插件,为webpack中自带的插件
const webpack = require('webpack');// Common.js语法
module.exports = {mode: 'development', // 默认模式为production,可不写,不写时打包运行命令行会有警告devtool: 'cheap-module-eval-source-map',entry: {main: './src/index.js'},devServer: {contentBase: './dist',open: true,port: 8080,hot: true, // 让webpack-dev-server开启热更新的功能hotOnly: true // 即便是hot配置(HMR)没有生效,也不让浏览器进行刷新,失效时不做其他处理}, module: {rules: [{test: /\.css$/,use: ['style-loader','css-loader']}]},plugins: [new HtmlWebpackPlugin({template: './src/index.html'}), new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin() // 实例化热更新插件],output: {filename: 'dist.js', // 打包之后的输出文件path: path.resolve(__dirname, 'dist') }
}// 配置完之后,一定要重新执行打包,不然配置项不会生效
// 样式文件变化,页面只修改展示样式,不会进行页面的刷新操作,也不会更改之前js操作的内容。

配置项的作用:

  • hot: true ===> 让webpack-dev-server开启热更新的功能
  • hotOnly: true ===> 即便是hot配置(HMR)没有生效,也不让浏览器进行刷新 (失效时不做其他处理)
  • HotModuleReplacementPlugin为webpack自带的热更新插件,所以要直接引入webpack,在plugins配置项中进行实例化。

热更新的应用:

在css方面应用:

目录结构:

|--demo|--node_modules|--src|--index.js|--style.css|--index.html|--package.json|--package-lock.json|--webpack.config.js

src/style.css

div:nth-of-type(odd) {background: #2086d7;
}

src/index.js

import './style.css';
var btn = document.createElement('button');
btn.innerHTML = '新增';
document.body.appendChild(btn);
btn.onclick = function() {var div = document.createElement('div');div.innerHTML = 'item'; document.body.appendChild(div);
}

执行打包:

npm  run  start

页面展示效果如图:(点击新增按钮,新增item项之后的效果)

此时,再去修改style.css里的样式:(把偶数行的背景色改为粉色)

div:nth-of-type(odd) {background: pink;
}

页面展示效果为:(没有刷新浏览器,只更改了样式)

如果不开启热更新,修改样式之后,由于浏览器刷新,页面会恢复到初始状态,页面上只保留一个"新增"按钮,再去点击的时候,才会有不同颜色的item显示在页面中。

在js方面的应用:

目录结构:

|--demo|--node_modules|--src|--counter.js|--number.js|--index.js|--index.html|--package-lock.json|--package.json|--webpack.config.js

counter.js

function counter() {var div = document.createElement('div');div.setAttribute('id', 'counter');div.innerHTML = 1;div.onclick = function() {div.innerHTML = parseInt(div.innerHTML, 10) + 1}document.body.appendChild(div);
}export default counter;

number.js

function number() {var div = document.createElement('div');div.setAttribute('id', 'number');div.innerHTML = 1000; document.body.appendChild(div);
}
export default number;

index.js

import counter from './counter';
import number from './number';
counter();
number();// 这里需要判断下是否开启了热更新,如果开启了,就只让number函数再执行一次,否则不会热更新
if(module.hot) {module.hot.accept('./number', () => {document.body.removeChild(document.getElementById('number'));number();})
}

本质上要实现HMR,都要写类似以上(判断是否开启热更新,单独执行某代码块)的代码,否则不会热更新。但在很多时候,我们开发过程中,并没有去写这样的代码,是因为在相应的loader中,已经帮我们实现了热更新的代码。如:

  • css-loader中同样也配置了热更新,也不需要自己额外添加代码
  • 我们使用的vue框架里,vue-loader里也已经配置了热更新,所以不需要额外添加代码

index.js中引入两个模块,如果不开启热更新,那么当一个模块里的数据变化了,就会导致页面刷新,使另一个模块内的数据也恢复到初始值,如果我们想一个模块里的js代码的变化,不影响另一个模块代码变更过的数据,每改一个js模块里的代码,只会更新当前模块的数据,不会影响其他js模块的数据。以上需求可借助HMR来实现,

执行打包:

npm  run  start

页面展示效果:(第一行数字带有点击事件,初始值为1,每点击一次数值会加1)

当点击数字值增加为7时,去修改number.js模块里的代码,把1000修改为3000,此时页面不刷新,counter.js模块里的数字7也没有变化,只更改了当前模块修改的数据。如下图:

这就是热更新的巧妙之处。? (如果不开启热更新,修改number.js里的代码后,由于页面会刷新,counter.js里的数字也会变成初始值1)

Hot Module Replacement热更新(webpack学习篇9)相关推荐

  1. 修改html时webpack热更新,webpack学习之路(二)webpack-dev-server实现热更新

    上一章对webpack的配置有了简单的认识. 这一章,我需要学习的是webpack热更新,因为在开发过程中,不希望当文件更改时,人肉去编译文件,刷新浏览器. webpack热更新 webpack-de ...

  2. 什么是loader? (webpack学习篇4)

    什么是loader ? 官方把它定义为:用来将一段代码转换成另一段代码的webpack插件. 同时也给出了解释:虽然本质上说,loader也是插件,但因为webpack的体系中还有一个专门的名词就叫插 ...

  3. 修改html时webpack热更新,webpack热更新(HMR)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 一.HMR介绍 在我们开发react应用的时候,在配置了webpack-dev-server的前提下每一次的组件内容修改 ...

  4. java 替换 rn_RN热更新之Android篇

    前言 这篇来研究一下RN的热更新,之前看资料见到过两个现成的方案: 1.reactnative中文网的pushy 不过看了文档就觉得没劲,不如自己来实现,况且之前已经有点门路了. 原理 关于热更新的原 ...

  5. iOS代码质量要求_Unity移动端代码热更新技术学习总结

    为什么需要热更新 游戏总是伴随着不断的开发与维护,我们不能要求玩家每次都将游戏客户端卸载重装,所以需要热更新技术来在不需要重装客户端的情况下下载更新游戏里的代码(其实资源也需要热更新,但是因为操作系统 ...

  6. 简单实现Vite的HRM热更新 ———《第二篇热更新上》

    - 热更新过程 在server端发现了文件更新,推送一个事件到浏览器前端,浏览器知道文件更新了,重新请求这个新的模块,去替换老的模块. - 操作过程 首先npm init @vitejs/app 选择 ...

  7. Unity热更新技术学习——AssetsBundle详解

    文章目录 热更新 AssetsBundle Resources AssetsBundle 存储目录 目录实例 构建AssetsBundle 清单文件 AB包 AssetBundle依赖 AssetBu ...

  8. StarForce热更新资源学习记录

    学习过程,记录一下 文章目录 目录 文章目录 GF中的热更新步骤 具体操作 检查资源 1.打包设置 2.检查包是否可以运行 3.构建更新资源 4.打包新资源 5.上传资源到服务器 6.制作versio ...

  9. Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的

    前言 用c#开发的时候,新建的脚本都默认继承自Monobehaviour, 因此脚本才有了自己的生命周期函数,如Awake,Start, Update, OnDestroy等. 在相应的方法中实现游戏 ...

最新文章

  1. Spring-AOP @AspectJ进阶之访问连接点信息
  2. hud抬头显示器哪个好_汽车加装HUD抬头显示实用吗?不低头就能获取数据
  3. 定制操作(传递函数或lambda表达式)
  4. Skyline开发1-环境搭建
  5. Hive 执行计划之Reduce Output Operator
  6. oracle数据的启动
  7. 微信小程序 多标签选择和添加标签
  8. 酷安绿色版 免安装无需UWP版
  9. java设计模式(1)
  10. 性能优化,进无止境---内存篇(下)
  11. 彪悍开源的分析数据库-ClickHouse
  12. java lowpoly低多边形风格图片生成
  13. 看《延禧攻略》学配色与构图
  14. win10添加打印机--无法访问指定设备,路径或文件。。
  15. @GetMapping注解的理解
  16. vi 编辑器的使用 笔记
  17. OSI七层模型与TCP/IP四层模型详解
  18. TIA博图——基本操作
  19. 翻译: Github Copilot 可以创作艺术吗?
  20. SqlServer数据库置疑的解决办法

热门文章

  1. 通过矢量字库制作点阵字库
  2. js excel转日期 time.getDate()-1 会少一天
  3. 小米android7.0,华为还是小米?Android7.0国产手机推荐
  4. android 摇一摇+震动+声音效果
  5. [读书笔记]《深度探索C++对象模型》
  6. umount: /mnt/raid:目标忙。
  7. 偏相关系数 - sas 实现
  8. 【vueCms】vueCms_xg后台管理系统(开源)
  9. PPT转成html视频无法播放,绝对实用 将PPT文档转换成Flash/HTML
  10. Git客户端如何连接远程仓库