webpack的热更新原理

news2024/9/20 20:56:47

Webpack热更新( Hot Module Replacement,简称 HMR),无需完全刷新整个页面的同时,更新所有类型的模块,是 Webpack 提供的最有用的功能之一。

  • 保留在完全重新加载页面期间丢失的应用程序状态。
  • 只更新变更内容,以节省宝贵的开发时间。
  • 在源代码中对 CSS / JS 进行修改,会立刻在浏览器中进行更新,这几乎相当于在浏览器 devtools 直接更改样式。

HMR作为一个Webpack内置的功能,可以通过HotModuleReplacementPlugin--hot开启。

刷新我们一般分为两种:

  • 一种是页面刷新,不保留页面状态,就是简单粗暴,直接window.location.reload()
  • 另一种是基于WDS (Webpack-dev-server)的模块热替换,只需要局部刷新页面上发生变化的模块,同时可以保留当前的页面状态,比如复选框的选中状态、输入框的输入等。

webpack 构建

项目启动之后,会进行首次构建打包,控制台中会输出整个的构建过程,可以观察到一个 Hash 值 3606e1ab1ddcf6626797。
在这里插入图片描述
在每次代码的修改后,保存时都会在控制台上出现 compiling…字样,可以在控制台中观察到:

  • Hash 值更新:4f8c0eff7ac051c13277;
  • 新生成文件:3606e1ab1ddcf6626797.hot-update.json
  • main1.3606e1ab1ddcf6626797.hot-update.js。
    在这里插入图片描述
    如果没有任何改动,直接保存,控制台输出编译打包信息,Hash 值没有发生变化,仍旧是 4f8c0eff7ac051c13277。
    在这里插入图片描述
    再次修改代码保存,控制台输出编译打包信息。根据文件名可以发现,上次输出的 Hash 值被作为本次编译新生成的 Hmr 文件标识。同样,本次输出的 Hash 值会被作为下次热更新的标识。
    在这里插入图片描述

webpack watch

为什么代码的改动保存会自动编译,重新打包?这一系列的重新检测编译依赖于 Webpack 的文件监听:在项目启动之后,Webpack 会通过 Compiler 类的 Run 方法开启编译构建过程,编译完成后,调用 Watch 方法监听文件变更,当文件发生变化,重新编译,编译完成之后继续监听。

在这里插入图片描述

页面的访问需要依赖 Web 服务器,那要如何将 Webpack 编译打包之后的文件传递给 Web 服务器呢?这就要看 Webpack-dev-middleware了。 Webpack-dev-middleware 是一个封装器( wrapper ),它可以把 Webpack 处理过的文件发送到一个Server(其中 Webpack-Dev-Server 就是内置了 Webpack-dev-middlewareExpress 服务器)。上面有说到编译之后的文件会被写入到内存,而 Webpack-dev-middleware 插件通过 memory-fs 实现静态资源请求直接访问内存文件。

	const webpack = require('webpack');
	const webpackConfig = require('./webpack.dev.conf');
	const compiler = webpack(webpackConfig);
	debug('webpack编译完成');
	debug('将编译流通过webpack-dev-middleware');
	const devMiddleware = require('webpack-dev-middleware')(compiler, {
	// self-define options
	});

上面代码可以看到,Webpack 编译打包之后得到一个 Compilation ,并将 Compilation 传递到 Webpack-dev-middleware 插件中,Webpack-dev-middleware 可以通过 Compilation 调用 Webpack中 的 Watch 方法实时监控文件变化,并重新编译打包写入内存。

留意一下浏览器端,在 Network 中可以看到几个请求:
/__Webpack_hmr 请求返回的消息包含了首次 Hash 值,每次代码变动重新编译后,浏览器会发出 hash.hot-update.json、fileChunk.hash.hot-update.js 资源请求。
在这里插入图片描述

点开查看 hash.hot-update.json 请求,返回的结果中,h 是一个 hash 值,用于下次文件热更新请求的前缀,c 表示当前要热更新的文件是 main1 。
在这里插入图片描述
继续查看 fileChunk.hash.hot-update.js,返回的内容是使用 webpackHotUpdate 标识的 fileChunk 内容。

在这里插入图片描述

热更新源码

我们根据webpack-dev-serverpackage.json中的bin命令,可以找到命令的入口文件bin/webpack-dev-server.js

	// node_modules/webpack-dev-server/bin/webpack-dev-server.js
	
	// 生成webpack编译主引擎 compiler
	let compiler = webpack(config);
	
	// 启动本地服务
	let server = new Server(compiler, options, log);
	server.listen(options.port, options.host, (err) => {
	    if (err) {throw err};
	});

本地服务代码:

	// node_modules/webpack-dev-server/lib/Server.js
	class Server {
	    constructor() {
	        this.setupApp();
	        this.createServer();
	    }
	    
	    setupApp() {
	        // 依赖了express
	    	this.app = new express();
	    }
	    
	    createServer() {
	        this.listeningApp = http.createServer(this.app);
	    }
	    listen(port, hostname, fn) {
	        return this.listeningApp.listen(port, hostname, (err) => {
	            // 启动express服务后,启动websocket服务
	            this.createSocketServer();
	        }
	    }                                   
	}
总结:

这一小节代码主要做了三件事:

  • 启动webpack,生成compiler实例。compiler上有很多方法,比如可以启动 webpack 所有编译工作,以及监听本地文件的变化。
  • 使用express框架启动本地server`,让浏览器可以请求本地的静态资源。
  • 本地server启动之后,再去启动websocket服务,通过websocket,可以建立本地服务和浏览器的双向通信。这样就可以实现当本地文件发生变化,立马告知浏览器可以热更新代码啦!

如果不了解websocket,建议简单了解一下websocket速成.

参考文章

  • 轻松理解webpack热更新原理
  • 看完这篇,面试再也不怕被问 Webpack 热更新

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

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

相关文章

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

温湿度传感器SHT20的功能介绍和时序分析

目录 概述 1 认识SHT20 1.1 SHT20介绍 1.2 SHT20属性 1.3 接口介绍 1.4 SHT20的相关命令 1.5 转换时间 2 寄存器操作 2.1 复位操作 2.2 User Register 2.3 CRC Checksum 3 温湿度计算 3.1 相对湿度转换 3.2 温度换算 3.3 转换公式的C语言实现 概述 本文主要介绍…

ChatGLM-6B部署到本地电脑

引言 ChatGLM-6B是由清华大学开源的双语对话大模型,该模型有62亿参数,但在经过量化后模型体积大幅下降,因此不同于其他需要部署到服务器上的大模型,该模型可以部署到本地电脑,那么接下来我们来看看如何部署该模型。 …

OpenAI API key not working in my React App

题意:OpenAI API 密钥在我的 React 应用中不起作用 问题背景: I am trying to create a chatbot in my react app, and Im not able to generate an LLM powered response. Ive been studying documentation and checking out tutorials but am unable …

【CMake】使用CMake在Visual Studio中配置glad和glfw

下载glad和glfw g l a d glad glad下载:glad下载 这个是 g i t h u b github github上的资源,进不去的话就开开魔法。 g l f w glfw glfw下载:glfw下载 下载CMake C M a k e CMake CMake下载: CMake下载 根据自己的平台选择&…

【Java 优选算法】双指针(下)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 有效三角形的个数 题目链接 解法 解法1:暴力枚举--->O(n^3) 解法2:利用单调性,使用双指针来解决---->O(n^2) 优化:对整个数组进行排序先固定最大数在最大数的左…

文心智能体 城市印象之漫行北京 开发分享

城市印象之漫行北京 请点击文心智能体平台AgentBuilder | 想象即现实 (baidu.com) 一、开发灵感 这个智能体为笔者“城市印象”系列当中的作品之一,这个智能体侧重于为用户提供丈量北京的个性化城市之旅,或漫步历史文化街区细细品味,或领略…

动态内存管理之malloc,free,calloc和realloc函数

Hello,各位小伙伴们,小编在这里祝福各位中秋佳节快乐呀,今天让我们来学习一下动态内存管理吧! 引言 像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间,或者使用数组来申请一段连续的空间&#xff…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度(4位)2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

复选按钮QCheckBox

使用场景:多选多 文本 // 获取和设置显示的文本 QString text() const void setText(const QString &text) 三态 复选按钮有三种状态 Qt::Checked 选中Qt::Unchecked 非选中Qt::PartiallyChecked 半选中,比如一组复选按钮中,只选择了…

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet中代码实现部分进行更新 题目原理解析代码改进PointNet改进策略 :模块改进 | LFA | RandLA-Net,通过随机采样与局部特征聚合提升大规模3D点云处理效率✔️❌PointNet改进策略 :模块改进 | Residua…

Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

目录 概述 1 硬件接口介绍 2 SHT20模块 2.1 SHT20简介 2.2 SHT-20模块电路 3 I2C接口实现 3.1 FSP配置I2C 3.2 I2C驱动程序实现 4 SHT20驱动程序 4.1 SHT20驱动代码结构 4.2 源代码文件 5 测试 5.1 测试功能介绍 5.2 测试代码实现 5.3 运行代码 概述 本文主要介…

ubuntu虚拟机装载共享文件夹导致的诡异错误

最近使用vmware station 15 安装了 ubuntu22.04 的虚拟机。在装载共享文件夹不久后便会出现诡异的错误。目前在网络上好像没有人把这归结到装载共享文件夹的问题上,故以供参考。 第一次: 在装载之后大概第二次开机,出现报错界面。 提示蓝牙…

C++二叉搜索树学习

目录 一、二叉搜索树概念 二、二叉搜索树的性能分析 三、二叉搜索树的构建 一、二叉搜索树概念 二叉搜索树又叫做二叉排序树,它可以是一颗空树,或者是具有以下性质的二叉树: 若该树的左子树不为空,那么左子树上的任一节点都小…

硬件工程师笔试面试——存储器件

目录 16、存储器件 16.1 基础 存储器件实物图 16.1.1 概念 16.1.2 常见的存储器件及其特点 16.2 相关问题 16.2.1 不同类型的存储器件在成本和性能上有哪些具体的差异 16.2.2 如何根据应用需求选择合适的存储器件? 16.2.3 存储器件的耐用性和可靠性是如何影响其在不同…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期:2024年9月15日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

【算法思想·二叉搜索树】基操篇

本文参考labuladong算法笔记[二叉搜索树心法(基操篇) | labuladong 的算法笔记] 1、概述 我们前文 东哥带你刷二叉搜索树(特性篇) 介绍了 BST 的基本特性,还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目&am…

OpenAI的o1模型与Transformer的无限潜力:数学证明推理算力无上限

近期,斯隆奖得主马腾宇和Google Brain推理团队创始人Denny Zhou合作,提出了一项引人注目的数学证明:只要思维链(CoT)足够长,Transformer就有能力解决各种复杂问题。这一发现引发了广泛关注,因为…

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中,驱动器作为我们数字生活的基石,其稳定性直接关系到数据的安全与可用性。然而,当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时,许多用户往往感到手足无措&#xf…

把设计模式用起来!(3)用不好模式?之时机不对

上一篇:《把设计模式用起来(2)——用不好?之实践不足》 本篇继续讲设计模式用不好的常见原因,这是第二个:使用设计模式的时机不对。 二、时机不对 这里说的时机并不是单纯指软件研发周期中的时间阶段&…