【webpack】HMR热更新原理

news2024/11/20 6:29:14

本文:参考文章

一、HMR是什么,为什么出现

1、出现的原因

之前,应用的加载、更新都是一个页面级别的操作,即使单个代码文件更新,整个页面都要刷新,才能拿到最新的代码同步到浏览器,导致会丢失之前在页面执行过程中的所有交互状态

2、HMR作用

可以将大多数小改动通过热模替换方式更新到页面上,保存一定的交互效果,从而确保连续的、顺畅的开发调试

二、HMR应用

1、Vue启动HMR

(1)搭建vue项目环境

  • npm install vue
  • 在src文件夹下创建main.js文件
import {createApp} from 'vue'
import App from './App.vue'

createApp(App).mount('#app')
  • 在src文件夹下创建component文件夹里创建Helloworld.vue文件
<template>1</template>
  • 在src文件夹下创建App.vue文件
<template>
  <div>
    <h1>Hello Vue 3 with HMR!!</h1>
    <p>{{ count }}</p>
    <input>
    <Helloworld></Helloworld>
  </div>
</template>

<script>
import Helloworld from './component/Helloworld.vue';
export default {
  data() {
    return {
      count:0
    };
  },
  components:{
    Helloworld
  },
  created(){
    this.handle = setInterval(() => {
        this.count++
    }, 1000);
  }
};
</script>
  • 根目录创建index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app"></div>
	// 引入main.js文件
    <script src="./dist/main.js" type="module"></script>
</body>
</html>

(2)下载vue-loader、@vue/compiler-sfc、html-webpack-plugin配置webpack.config.js文件
npm i vue-loader,配置loader,并引入VueLoaderPlugin插件
版本号:

  • vue-loader:17.2.2
  • html-webpack-plugin:5.5.3
  • @vue/compiler-sfc:3.3.4
  • webpack:5.88.2
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const {VueLoaderPlugin} = require('vue-loader')// HMR

// import { Configuration } from 'webpack'
/**
 * @type {Configuration}
 */
const config = {
    mode:'development',
    entry:'./src/main.js',
    output:{
        path:path.resolve(__dirname,'dist'),
        filename:'[name].js'
    },
    module:{
        rules:[
            {
                test:/\.vue?$/,
                loader:'vue-loader',
                options:{
					hotReload:true // 手动可以关闭热更新
				}
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({template:'./index.html'}),
        new CleanWebpackPlugin(),
        new VueLoaderPlugin()
    ],
    devtool:'source-map',
    devServer:{
        port:8080
        hot:true // 开启HMR
    }
}

module.exports = config

最后呈现的效果:

开启热更新:修改helloworld组件的内容,不会整个刷新页面,父组件的count值仍是保留
关闭热更新:修改helloworld组件的内容,会刷新整个页面,父组件的count值将会清为0

2、一些零碎的知识点

关于webpack当中的devServer:
devServer在webpack5的版本用hot:true,就可以开启热更新。
devServer启动会根据webpack.config.js配置文件去读取配置(主要是读取output.path配置),先去对文件进行打包编译,在编译之后不会将打包文件输出在dist目录下,而是存储在内存当中,保证了是挂在server的根路径一样的效果,随便去访问。
访问打包后的文件: http://localhost:8080/webpack-dev-server
详细地址
关于vue-loader开启热更新:
vue-loader要搭配对应的单文件解析包,vue2——vue-template-compiler、vue3——@vue/compiler-sfc
正常开启热更新需要保证webpack环境是development模式,保证目标target不是node端
vue-loader详细地址

三、HMR的工作原理

1、webpack-dev-server在热更新中做了什么?

当运行的时候,它会向客户端添加两个文件,这两个文件的目的:
1、websocket文件用于与服务端进行通信
2、客户端获取到需要更新的模块,进行重新执行并更新。

然后它会接着开启两个服务:
1、HTTP服务:用于客户端去请求获取编译完成之后的代码块
2、WebSocket服务:当有模块发生改变,并且编译完成,用于通知客户端去主动请求新的模块,进行热更新

2、更加细节的真实操作

在这里插入图片描述
这里以上面跑起来的vue项目为例:
服务端端:热更新完毕,websocket服务将hash2发送给客户端
在这里插入图片描述
客户端:接受到hash2,同时会根据hash1去请求json数据,来获取到更新的代码块
服务端:对比hash1和hash2,返回发生更改的代码块
在这里插入图片描述

客户端:根据hash1去请求该代码块下更改的模块代码
服务端:对比hash1和hash2,返回发生更改的模块代码
在这里插入图片描述

客户端:根据更新的模块代码,去更新并执行依赖该模块的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【附安装包】Proteus 8.13安装教程

软件下载 软件&#xff1a;Proteus版本&#xff1a;8.13语言&#xff1a;简体中文大小&#xff1a;447.33M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.co…

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据(含原始数据和计算过程)

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据&#xff08;含原始数据和计算过程&#xff09; 1、时间&#xff1a;1992-2022年 2、指标&#xff1a;地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二产业占GDP比重、第…

jQuery实现表格最后增加一行和删除最后一行

HTML代码 <div><table><thead><tr><th>成绩表</th></tr></thead><tbody><tr><td>科目</td><td>成绩</td></tr><tr><td>语文</td><td>80</td></…

unittest框架的使用

先简单介绍一下unittest的核心组成部分&#xff1a; 测试夹具&#xff1a;Test Fixture 一般用于执行测试用例的准备或者清理工作&#xff0c;比如测试开始前的数据准备或者测试结束的数据清理等。通过setUp()、tearDown()、setUpClass()、tearDownClass()这四个钩子函数实现了…

YOLOv5目标检测模型训练超参数总结记录

整个YOLO系列的模型除了v1和v2比较古老没有实际项目应用过以外&#xff0c;从v3-v8或多或少都有实践&#xff0c;其中以v5使用频度最高&#xff0c;最早期刚接触YOLO的时候也是一通原理详解学习各种结构可视化&#xff0c;后面实际项目开发越来越多&#xff0c;对于前面的记忆就…

一、Mycat2介绍与下载安装

第一章 入门概述 1.1 是什么 Mycat 是数据库中间件。 1、数据库中间件 中间件&#xff1a;是一类连接软件组件和应用的计算机软件&#xff0c;以便于软件各部件之间的沟 通。 例子&#xff1a;Tomcat&#xff0c;web中间件。 数据库中间件&#xff1a;连接java应用程序和数据库…

解压后的文件丢失怎么恢复?解压文件丢失4种恢复方法

您是否出现过解压文件丢失的情况呢&#xff1f;解压文件通俗易懂地讲就是把压缩好了的文件解开。而有些小伙伴在解压文件以后发现丢失了&#xff0c;这些丢失的文件或许是您重要的img解压文件/rar文件解压/zip解压文件&#xff0c;为了正确解决解压文件丢失问题&#xff0c;下面…

在Visual Studio 2017上配置并使用OpenGL

1 在Visual Studio 2017上配置并使用OpenGL 在GLUT - The OpenGL Utility Toolkit&#xff1a;GLUT - The OpenGL Utility Toolkit中点击“GLUT for Microsoft Windows 95 & NT users”&#xff0c;选择“If you want just the GLUT header file, the .LIB, and .DLL file…

Win7系统电脑开机总出现硬盘自检的简单解决方法

你是不是经常会遇到电脑开机进行硬盘自检&#xff0c;而且每次开机都检查很久不能跳过&#xff1b;怎么才能跳过这一步骤呢&#xff1f;下面教大家如何让Win7系统电脑在开机的时候跳过硬盘自检这一步骤&#xff0c;加快开机时间。 解决步骤&#xff1a; 1、按下“Win R”快捷键…

冠达管理:美联储或已达加息终点,但反弹面临诸多不确定性

本周以来&#xff0c;多项数据显现美国经济正在降温&#xff0c;联邦基金利率期货显现&#xff0c;美联储本轮加息周期或已结束。 于美股而言&#xff0c;正处于高位的货币基金是未来继续上涨的潜在动力。不过&#xff0c;与此前反弹行情的推进力比较&#xff0c;当时的不确定…

SAP:IDCNGRIR_GNB报表展示物料描述与采购订单不一致

1、问题描述&#xff1a; 目前在项目中发现执行SAP的IDCNGRIR_GNB报表的时候&#xff0c;出现了物料编码和订单的物料编码不一致的情况&#xff1a; 2、问题展示&#xff1a; 采购订单上物料及编码显示 IDCNGRIR_GNB报表执行结果显示 3、问题原因&#xff1a; 调试程序发现…

2023年信息安全管理与评估赛项参考答案-模块1任务一

根据网络拓扑图所示&#xff0c;按照IP 地址规划表&#xff0c;对防火墙的名称、各接口IP 地址进行配置。共8 分&#xff0c;每错1 处&#xff08;行&#xff09;扣1 分&#xff0c;扣完为止。地址、安全域、接口&#xff08;状态为UP&#xff09;、名称都正确。 2.根据网络拓扑…

一文读懂融资融券交易技巧!在上海开融资融券账户交易利率一般是多少?

融资融券交易技巧包括以下几点&#xff1a; 熟悉股票市场&#xff1a;了解市场走势、公司基本面等信息&#xff0c;根据趋势选择合适的股票进行交易。 做好风险管理&#xff1a;对买卖的风险进行合理评估&#xff0c;设定止损价位&#xff0c;防止损失过大。 控制杠杆比例&am…

java代码设计方案

一、代码重复问题处理 1、利用工厂模式 模板方法模式&#xff0c;消除 if…else 和重复代码 场景&#xff1a; 假设要开发一个购物车下单的功能&#xff0c;针对不同用户进行不同处理&#xff1a; 普通用户需要收取运费&#xff0c;运费是商品价格的 10%&#xff0c;无商品折…

three.js渲染带动画的glb文件

1. 准备工作 将下列文件在three.js的包中找到&#xff0c;注意的是我这里使用的是模块化版本的&#xff0c;这里不知道模块化的&#xff0c;可以先去看一下es6的模块化。 控制器&#xff1a; OrbitControls.js 加载器&#xff1a;GLTFLoader.js 材质&#xff1a; RoomEnvironm…

学习JAVA打卡第四十八天

Math类 在编写程序时可能需要计算一个数的平方根、绝对值或获取一个随机数等。 Math类的常用方法 BigInteger类 程序如果需要处理特别大的整数就可以用Java.math包中的BigInteger类的对象。 可以构造public BigInteger&#xff08;string val&#xff09;构造一个十进制的B…

Flink+Paimon多流拼接性能优化实战

目录 &#xff08;零&#xff09;本文简介 &#xff08;一&#xff09;背景 &#xff08;二&#xff09;探索梳理过程 &#xff08;三&#xff09;源码改造 &#xff08;四&#xff09;修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延迟 &#xff08;五&…

【zookeeper】zookeeper介绍

分布式协调技术 在学习ZooKeeper之前需要先了解一种技术——分布式协调技术。那么什么是分布式协调技术&#xff1f;其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制&#xff0c;让他们有序的去访问某种临界资源&#xff0c;防止造成"脏数据"的…

Joint contrast enhancement and exposure fusion for real-world image dehazing、近红外去雾、(近)红外和可见光数据集

今天给大家分享一篇发表在IEEE TMM上的去雾文章Joint Contrast Enhancement and Exposure Fusion for Real-World Image Dehazing 作者从对比度增强和曝光融合的视角来解决图像去雾问题&#xff0c;在真实场景上取得了较好的去雾效果。此外&#xff0c;作者将所提出的方法应用…

mqtt集群搭建并使用nginx做负载均衡_亲测得结论

mqtt集群搭建 RabbitMQ集群搭建和测试总结_亲测 搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了 nginx配置mqtt负载均衡 #修改rabbitmq1节点ip为1.19的nginx配置 vim /etc/nginx/nginx.confhttp { } #在http外添加如下配置 stream {upstream rabbitmqtt {ser…