02-webpack的热更新是如何做的,以及原理

news2024/9/22 23:34:45

一、是什么

HMR 可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用.

如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致整个应用的整体刷新,那页面中的状态信息都会丢失

如果使用的是 HMR,就可以实现只将修改的模块实时替换至应用中,不必完全刷新整个应用

在webpack中配置开启热模块

const webpack = require('webpack')
module.exports = {
	devServer:{
		hot:true
		//hotOnly:true	
	}
}

通过上述这种配置,如果我们修改并保存css文件,确实能够以不刷新的形式更新到页面中

但是,当我们修改并保存js文件之后,页面依旧自动刷新了,这里并没有触发热模块

所以,HMR并不像 Webpack 的其他特性一样可以开箱即用,需要有一些额外的操作

我们需要去指定哪些模块发生更新时进行HMR

if(module.hot){
	module.hot.accept('./util.js',()=>{
		console.log("util.js更新啦啦啦。。")
	})
}

二、实现原理

在这里插入图片描述

  • Webpack Compile:将 JS 源代码编译成 bundle.js
  • HMR Server:用来将热更新的文件输出给 HMR Runtime
  • Bundle Server:静态资源文件服务器,提供文件访问路径
  • HMR Runtime:socket服务器,会被注入到浏览器,更新文件的变化
  • bundle.js:构建输出的文件
  • 在HMR Runtime 和 HMR Server之间建立 websocket,即图上4号线,用于实时更新文件变化

可以分成两个阶段

  • 启动阶段 1-2-A-B

在编写未经过webpack打包的源代码后,Webpack Compile 将源代码和 HMR Runtime 一起编译成 bundle文件,传输给Bundle Server 静态资源服务器

  • 更新阶段 1-2-3-4

当某一个文件或者模块发生变化时,webpack监听到文件变化对文件重新编译打包,编译生成唯一的hash值,这个hash值用来作为下一次热更新的标识

根据变化的内容生成两个补丁文件:manifest(包含了 hash 和 chundId,用来说明变化的内容)和chunk.js 模块

由于socket服务器在HMR Runtime 和 HMR Server之间建立 websocket链接,当文件发生改动的时候,服务端会向浏览器推送一条消息,消息包含文件改动后生成的hash值

如下图的h属性,作为下一次热更细的标识
在这里插入图片描述
在浏览器接受到这条消息之前,浏览器已经在上一次socket 消息中已经记住了此时的hash 标识,这时候我们会创建一个 ajax 去服务端请求获取到变化内容的 manifest 文件

mainfest文件包含重新build生成的hash值,以及变化的模块,对应上图的c属性

浏览器根据 manifest 文件获取模块变化的内容,从而触发render流程,实现局部模块更新

在这里插入图片描述

总结

  • 通过 webpack-dev-server 创建两个服务器:提供静态资源的服务(express)和Socket服务
  • express server 负责直接提供静态资源的服务(打包后的资源直接被浏览器请求和解析)
  • socket server 是一个 websocket的长连接,双方可以通信
  • 当 socket server监听到对应的模块发生变化时,会生成两个文件.json(manifest文件)和.js文件(update chunk)
  • 通过长连接,socket server可以直接将这两个文件主动发送给客户端(浏览器)
  • 浏览器拿到两个新的文件后,通过HMR runtime机制,加载这两个文件,并且针对修改的模块进行更新。

提示:以下是本篇文章正文内容,下面案例可供参考

一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

pygame伪3d 实现地面效果

教程来自What is Mode 7? Let’s code it! 油管镜像 import cv2 import pygame import sys from pygame import gfxdraw import numpy as np(width, height) (800, 600) pygame.init() screen pygame.display.set_mode((width, height)) image pygame.image.load("11…

ElasticSearch基础学习(SpringBoot集成ES)

一、概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎。 它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 ES也…

什么是API接口?主要作用是什么?

API英文全称为:Application Programming Interface,中文意思是应用程序编程接口,它是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力。 主要作用: API之主要目的是提供应用程…

【笔记】Pycharm配置Node.js运行js代码

最近在学习关于Js逆向的知识,需要在PyCharm中运行Js程序,记录一下配置过程。 安装Node.js Node.js中文网 选择自己电脑对应的安装包下载暗转即可 安装好软件后,配置node.js环境变量。 完成安装和环境配置后,打开cmd测试是否安…

解决 idea 中使用 git 提交显示多余空行

解决 idea 中使用 git 提交显示多余空行 1、问题描述2、解决方法 欢迎访问我的个人博客:https://wk-blog.vip 1、问题描述 在 idea 中使用Git提交代码时,发现不管是对于代码文件还是其他纯文本文件,在保存时总会在文件末尾加上一个空行&…

网络应用基础 TCPIP协议(NETBASE第四课)

网络应用基础 TCPIP协议(NETBASE第四课) TCP/IP 百度百科 CP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是T…

【Excel经验】日期时间处理方法

概览-公式汇总 公式功能公式公式说明提取时间中的日期TEXT(A2,“yyyy-mm-dd”)A2列数据格式样例:2023/7/5 6:20:10计算耗时得到单位:秒数VALUE(TEXT(B2-A2,“[ss]”))A2、B2列数据格式样例:2023/7/5 6:20:10计算耗时得到格式化显示年月日B2-…

基础算法-子矩阵的和

1 课堂笔记 2 代码 3.代码解析 #include<iostream> using namespace std; const int maxn1010; int a[maxn][maxn],s[maxn][maxn]; int n,m,q,x1,y1,x2,y2;int main(){scanf("%d%d%d",&n,&m,&q);//为数组赋值for(int i1;i<n;i){for(int j1;j&…

Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)

目录 Mycat分片规则_按日期&#xff08;天&#xff09;分片 Mycat分片规则_全局序列 Mycat高可用_Mycat高可用概述 Mycat分片规则_按日期&#xff08;天&#xff09;分片 实现原理 此规则为按天分片&#xff0c;设定时间格式、范围。 实现过程 创建示例表 #用户信息表 …

Linux时间子系统

转自&#xff1a;深入理解Linux时间子系统(0.7)_城中之城的博客-CSDN博客 一、时间概念解析 我们住在空间里&#xff0c;活在时间中。时间对我们来说是既熟悉又陌生。熟悉是因为我们每天都在时间的驱动下忙碌着&#xff0c;陌生是因为我们从来没有停下来认真思考过时间是什么…

C++内存泄露排查的一个案例

背景: 这熟悉的线条. 请求量没啥波动, 不用怀疑, 就是内存泄露了. 方案一 Valgrind Valgrind可以用来检测是否有非法使用内存的问题, 如: 访问未初始化的内存,访问数组越界, 忘记释放动态内存的问题; 首先需要定位是哪个进程的内存泄露. 使用top命令, 然后shiftm按照内存排序…

python 常用数据结构-字典

python 常用数据结构-字典 Dict 字典字典定义字典使用&#xff1a;创建字典使用&#xff1a;访问元素字典使用&#xff1a;操作元素字典使用&#xff1a;嵌套字典字典方法字典方法 keys()字典方法 values()字典方法 items()字典方法 get()字典方法 update()字典方法 pop() 字典…

十二、Docker Compose 介绍与安装

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、docker compose介绍二、docker compose能干嘛三、docker compose安装与卸载3.1 docker-compose安装3.2 docker-compose卸载 总结 前言 在使用k8s之前&#xff0c;随…

overleaf 常用命令

ctrlb 加粗 ctrli 斜体 \emph 斜体&#xff0c;强调 行内公式 $ a b c $ 行间公式 \begin{equation} ab_cd \end{equation} 交叉引用 1.引入宏包 \usepackage[colorlinks]{hyperref} 2.\label \subsection{related wok}\label{sec:related work} this is related …

【开源分享】在线客服系统源码,支持发送文本表情,上传图片附件附详细搭建教程...

源码介绍 golang开发的单用户在线客服系统&#xff0c;功能非常的简洁实用&#xff0c;没有多余的功能。golang语言可编译为二进制程序&#xff0c;自带守护进程功能&#xff0c;相比于流传最广的PHP客服系统要稳定 环境配置 服务器&#xff1a;linux 或者 windows都可以 golan…

剑指offer36.二叉搜索树与双向链表

将二叉树转换成排序的双向循环链表&#xff0c;其中包含三个条件&#xff1a;1&#xff0c;排序&#xff1b;2&#xff0c;双向链表&#xff1b;3&#xff0c;循环链表&#xff1b; 条件1&#xff1a;将一个树排序很简单&#xff0c;采用“左-->根-->右”的中序遍历方式…

本地部署 ChatGLM2-6B

本地部署 ChatGLM2-6B 1. 什么是 ChatGLM2-6B2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatGLM2-6B6. 启动 ChatGLM2-6B7. 访问 ChatGLM2-6B8. API部署9. OpenAI 格式的流式 API 部署10. 命令行部署11. ChatGLM2-6B 的推理参数含义 1. 什么是 ChatGLM2-6B Cha…

JS Node 模块化解释:AMD、UMD、CommonJS、 ESM

一、前言 传统方式下&#xff0c;JS 若想引入其它 JS 文件时&#xff0c;通常使用 <script> 语法来完成&#xff0c;然而引入的 JS 往往易于造成命名污染&#xff0c;为了解决这问题&#xff0c;模块化 开发的概念逐渐浮现。 本文将以完整的 Demo 将各大模块模块的概念…

树莓派(香橙派)交叉编译

目录 1、交叉编译是什么 2、为什么要交叉编译&#xff1f; 3、交叉编译需要用到什么工具&#xff1f; 4、&#xff08;香橙派&#xff09;交叉编译工具链的安装 5、 交叉编译服务端客户端 6、 带wiringPi库的交叉编译如何进行 1、交叉编译是什么 交叉编译是在一个平台上生…

叠加态和超级定位:量子世界的奇特现象

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前几篇文章中&#xff0c;我们介绍了量子力学的起源、基本概念以及波函数作为描述量子世界的数学工具。今天&#xff0c;我们将深入探索量子力学中的奇特现象&#xff0c;包括叠加态和超级定位。 在量子力学中&…