webpack-模块热替换剖析

2024-09-05 11:48
文章标签 模块 剖析 替换 webpack

本文主要是介绍webpack-模块热替换剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

webpack-模块热替换剖析 目录

文章目录

  • 前言
  • 推荐阅读
  • 前提
  • `HMR`
  • 应用
  • 开启`HMR`
    • 开启`webpack-dev-server`的`HMR`
    • 手动添加代码
  • `HMR`原理
  • 步骤


前言

  • 主要讲解热更新的原理

推荐阅读

  • 《webpack实战 入门、进阶与调优》

前提

  • 早期调试代码基本都是 改代码 - 刷新网页 - 查看 - 修改代码
  • 第一次提升效率:工具检测到代码改动,自动重新构建,然后触发网页刷新,称为:live reload
  • 第二次提升:webpack不刷新的前提下得到改动,甚至不需要重新发起请求就能看到更新后的效果,成为:模块热替换功能(Hot Module Replacement),简称HMR

HMR

  • 保留页面当前状态的前提下呈现出最新的改动,节省时间成本

应用

  • 复杂系统每改动一次,要经历资源重构建、网络请求、浏览器渲染等过程,需要几十秒
  • 调式页面很深的层级,有时候需要人配合验证

开启HMR

  • 基于webpack-dev-server或者webpack-dev-middlewebpack本身不支持HMR

开启webpack-dev-serverHMR

  • npm i webpack-dev-server -D
const webpack = require('webpack');
module.exports = {plugins: [new webpack.HotModuleReplacementPlugin()],devServer: {hot: true,},
};
  • 注意: webpack-cli的版本需要为3.3.10,才能和web-pack-server一起使用

调用HMR API有两种方式:

  • 手动地添加代码
  • 利用现成的工具:react-hot-loader, vue-loader

手动添加代码

// index.js
import { add } from 'util.js';
add(2, 3);if(module.hot) {module.hot.accept();
}
  • 当发现有模块发生变动时,HMR会再当前浏览器环境下重新执行一遍index.js,但是页面本身不会刷新

HMR原理

  • 在开启HMR的状态下进行开发,会出现资源的体积比原本的大,因为webpack会注入很多相关的代码
  • 在本地开发环境下,浏览器是客户端,webpack-dev-seerver(WDS)相当于服务端
  • HMR的核心:客户端从服务端拉取更新后的资源(不是拉取整个资源文件,而是chunk diff,即chunk需要更新的部分)

步骤

  1. 浏览器拉取更新的时间。
  • WDS对本地源文件进行监听,与浏览器之间构建了一个websocket
  • 当本地资源发生变化时,WDS会向浏览器推送更新事件,并带上本次构建的hash,让客户端与上一次资源进行比对
  • 通过hash比对可以防止冗余更新的出现
  • live reload也是依赖websocket实现的
  1. 拉取资源内容。
  • 客户端如果知道了新的构建结果和当前的有了差别,就会向WDS发起一个请求来获取更改文件的列表,即哪些模块有了改动
  • 通常这个请求的名字为:[hash].hot-update.json
  • 客户端返回:main.[hash].hot-update.js

这篇关于webpack-模块热替换剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138877

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st