前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >webpack 热更新(HMR)实现原理

webpack 热更新(HMR)实现原理

原创
作者头像
伯爵
修改于 2020-04-28 02:26:09
修改于 2020-04-28 02:26:09
3.3K00
代码可运行
举报
文章被收录于专栏:前端小菜鸟前端小菜鸟
运行总次数:0
代码可运行

HMR(Hot Module Replacement)是webpack一个重要的特性,当代码文件修改并保存之后,webapck通过watch监听到文件发生变化,会对代码文件重新打包生成两个模块补丁文件manifest(js)和一个(或多个)updated chunk(js),将结果存储在内存文件系统中,通过websocket通信机制将重新打包的模块发送到浏览器端,浏览器动态的获取新的模块补丁替换旧的模块,浏览器不需要刷新页面就可以实现应用的更新。

优点:

  • 代码文件修改到页面内容更新,自动完成
  • 兼容目前市面上主流的开发框架 :react,vue,angular2,如使用angular-cli创建ng项目通过@ngtools/webpack已经内置了webpack
  • 相比location.reload() 更新方式,不需要刷新页面,可以保存应用的当前状态

HMR相关的中间件

  • webpack-dev-middleware

本质上是一个容器,将webpack处理后的文件传递个服务器

webpack-dev-middleware 是一个 express 中间件,核心实现两个功能:第一通过file-loader内部集成了node的 monery-fs/memfs 内部文件系统,,直接将资源存储在内存;第二是通过watch监听文件的变化,动态编译。

  • webpack-hot-middleware

核心是给webpack提高服务端和客户端之间的通信机制,内部使用windoe.EventSocurce实现。

在webpack第一次打包的时候,除了代码本身之外,还包含一部分HMRruntime订阅服务代码,HMRruntime 订阅服务端的更新变化,触发HMR runtime API拉取最新的资源模块。

webpack-hot-middleware实现页面的热重载。

  • webpack-dev-server

内置了webpack-dev-middleware和express服务器,利用webpack-dev-middleware提供文件的监听和编译,利用express提供http服务,底层利用websocket代替EventSource实现了webpack-hot-middleware提供的客户端和服务器之间的通信机制。

HMR的工作原理

图片
图片
  1. webpack --watch启动监听模式之后,webpack第一次编译项目,并将结果存储在内存文件系统,相比较磁盘文件读写方式内存文件管理速度更快,内存webpack服务器通知浏览器加载资源,浏览器获取的静态资源除了JS code内容之外,还有一部分通过webpack-dev-server注入的的 HMR runtime代码,作为浏览器和webpack服务器通信的客户端(webpack-hot-middleware 提供类似的功能)。截图如下:
image
image

2. 文件系统中一个文件(或者模块)发生变化,webpack监听到文件变化对文件重新编译打包,每次编译生成唯一的hash值,根据变化的内容生成两个补丁文件:说明变化内容的manifest(文件格式是hash.hot-update.json,包含了hash和chundId用来说明变化的内容)和chunk js(hash.hot-update.js)模块。

image
image

3. hrm-server通过websocket将manifest推送给浏览器

浏览器接受到最新的hotCurrentHash,触发 hotDownloadManifest函数,获取manifest json 文件。

代码语言:txt
AI代码解释
复制
function hotDownloadManifest() {
    var request = new XMLHttpRequest();
    var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
    request.open("GET", requestPath, true);		
    request.send(null);
}
image
image

4. 浏览器端hmr runtime根据manifest的hash和chunkId使用ajax拉取最新的更新模块chunk

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function hotDownloadUpdateChunk(chunkId) {     
    var script = document.createElement("script");     
    script.src = __webpack_require__.p + ""                       
               + chunkId + "." + hotCurrentHash + ".hot-update.js";	     
    document.head.appendChild(script); 
}
image
image

4. 触发render流程实现局部热重载 HMR runtime 调用window"webpackHotUpdate" 方法,调用hotAddUpdateChunk

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var parentHotUpdateCallback = window["webpackHotUpdate"];
window["webpackHotUpdate"] = function webpackHotUpdateCallback(chunkId, moreModules) {
    hotAddUpdateChunk(chunkId, moreModules);
    if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
};

hotAddUpdateChunk动态的更新代码模块,并调用hotUpdateDownloaded函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function hotAddUpdateChunk(chunkId, moreModules) {
    hotRequestedFilesMap[chunkId] = false;
    for (var moduleId in moreModules) {
        if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
            hotUpdate[moduleId] = moreModules[moduleId]; 			}
    }
    if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
        hotUpdateDownloaded();
    }
}

hotUpdateDownloaded执行hotApply执行热重载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function hotUpdateDownloaded() {
    hotSetStatus("ready");
    Promise.resolve()
        .then(function() {
            return hotApply(hotApplyOnUpdate);
        })
}

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
webpack原理(1):Webpack热更新实现原理代码分析
服务单与客户端通信方式有:ajax 轮询,EventSource、websockt。
周陆军博客
2023/03/18
1.4K0
轻松理解webpack热更新原理
HMR作为一个Webpack内置的功能,可以通过HotModuleReplacementPlugin或--hot开启。那么,HMR到底是怎么实现热更新的呢?下面让我们来了解一下吧!
Nealyang
2019/12/10
2.8K0
轻松理解webpack热更新原理
彻底搞懂并实现 webpack 热更新原理
HMR即Hot Module Replacement是指当你对代码修改并保存后,webpack将会对代码进行重新打包,并将改动的模块发送到浏览器端,浏览器用新的模块替换掉旧的模块,去实现局部更新页面而非整体刷新页面。接下来将从使用到实现一版简易功能带领大家深入浅出HMR。
五月君
2021/11/10
2.9K0
彻底搞懂并实现 webpack 热更新原理
webpack中的HMR(热更新)原理剖析
Hot Module Replacement(以下简称 HMR)是 webpack 发展至今引入的最令人兴奋的特性之一 ,当你对代码进行修改并保存后,webpack 将对代码重新打包,并将新的模块发送到浏览器端,浏览器通过新的模块替换老的模块,这样在不刷新浏览器的前提下就能够对应用进行更新。
winty
2019/12/21
1.5K0
了不起的 Webpack HMR 学习指南(含源码分析)
学习时间:2020.06.14 学习章节:《Webpack HMR 原理解析》 [了不起的 Webpack HMR 学习指南.png]
pingan8787
2020/06/16
1.2K0
【webpack 进阶】聊聊 webpack 热更新以及原理
模块热替换 (hot module replacement 或 HMR) 是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新
GopalFeng
2022/08/01
1.1K0
【webpack 进阶】聊聊 webpack 热更新以及原理
webpack 学习笔记系列08-HMR热更新
HMR - Hot Module Replacement,当 webpack 开启 HMR 功能后,代码修改时 webpack 会重新打包,并将修改后的代码发送到浏览器,浏览器替换老的代码,保证了页面状态不会丢失,在不刷新整个页面的前提下进行局部更新。
CS逍遥剑仙
2021/06/27
1.1K0
webpack-dev-server 运行原理
现代 web 开发者们对于 webpack 想必已经很熟悉了,webpack-dev-server 几乎都是标配。但是 webpack-dev-server 背后的运行原理是怎样的呢?想了解 how 我们先看看 what。
WecTeam
2020/11/05
3.3K1
webpack-dev-server 运行原理
看完这篇,面试再也不怕被问 Webpack 热更新
Webpack热更新( Hot Module Replacement,简称 HMR,后续均以 HMR 替代),无需完全刷新整个页面的同时,更新所有类型的模块,是 Webpack 提供的最有用的功能之一。
政采云前端团队
2019/12/20
8910
看完这篇,面试再也不怕被问 Webpack 热更新
webpack热更新原理(面试大概率会问)
这里说明一下,webpack4和webpack5的配置信息或者显示信息可能有点区别
gogo2027
2022/10/10
1K0
热更新(HMR)相关原理介绍
在有些项目中,我们会遇到某些页面由特别多的模块组成,比如m1,m2,m3...mn
前端知知
2022/09/29
8750
热更新(HMR)相关原理介绍
一文搞懂 webpack HMR 原理
关注「前端向后」微信公众号,你将收获一系列「用心原创」的高质量技术文章,主题包括但不限于前端、Node.js以及服务端技术
ayqy贾杰
2020/06/02
2.3K2
一文搞懂 webpack HMR 原理
webpack的Hot Module Replacement运行机制
使用webpack打包,难免会使用Hot Module Replacement功能,该功能能够实现修改、添加或删除前端页面中的模块代码,而且是在页面不刷新的前提下。它究竟是怎么运作的呢?本文主要从调试工具、配置文件、官方文档三个方面进行解析。 调试工具 首先从chrome的调试工具network中看看,代码改变的时候,页面与后端之间发生了什么? 页面初始加载 我们看到除了加载页面所依赖的文件外,多了一个连接,这是一个Server-sent Events,相关的介绍可以参考这篇文章,而且每隔一段时间都会向发送
用户1217459
2018/01/31
1.3K0
webpack的Hot Module Replacement运行机制
[探索]Webpack DevServer和HMR原理
原创不易,未经作者允许禁止转载!! Webpack-Dev-Server 为什么要搭建本地服务器 目前开发的代码,为了运行需要有两个操作 npm run build编译 通过live-server或者直接通过浏览器打开html文件,查看效果 为了完成自动编译,webpack提供了几种可选的方式 Webpack watch mode Webpack-dev-server Webpack-dev-middleware Webpack Watch Mode webpack提供了watch模式 在该模式下,web
前端LeBron
2021/12/08
2K0
[探索]Webpack DevServer和HMR原理
Webpack原理-输出文件分析
虽然在前面的章节中你学会了如何使用 Webpack ,也大致知道其工作原理,可是你想过 Webpack 输出的 bundle.js 是什么样子的吗? 为什么原来一个个的模块文件被合并成了一个单独的文件?为什么 bundle.js 能直接运行在浏览器中? 本节将解释清楚以上问题。
IMWeb前端团队
2019/12/03
6630
Webpack原理-输出文件分析
使用webpack实现react的热更新
app 中自然就是源代码,app/index.js是最外层的js文件。因为涉及到是热更新,所以当然是在我们的 webpack.dev.js 文件下操作。
Nealyang
2019/09/29
3K0
使用webpack实现react的热更新
由浅至深了解webpack异步加载背后的原理
1、module:我们源码目录中的每一个文件,在 webpack 中当作module来处理(webpack 原生不支持的文件类型,则通过 loader 来实现)。module组成了chunk。
ACK
2020/02/08
1.7K0
由浅至深了解webpack异步加载背后的原理
webpack热更新配置小结
本文作者:IMWeb moonye 原文出处:IMWeb社区 未经同意,禁止转载 webpack热更新配置 热更新,可以使开发的人在修改代码后,不用刷新浏览器即可以看到修改后的效果。而它的另
IMWeb前端团队
2018/01/08
1.6K0
简单了解webpack热更新原理
webpack热更新Hot Module Replacement应该所有人都知道,现象就是你修改代码保存之后,浏览器不会刷新,只会修改你更改过的依赖代码。我们平时用webpack-dev-server如果没有配置,是直接刷新浏览器,并不是热更新。
wade
2020/08/28
6950
webpack模块化原理-Code Splitting
webpack的模块化不仅支持commonjs和es module,还能通过code splitting实现模块的动态加载。根据wepack官方文档,实现动态加载的方式有两种:import和require.ensure。
Keller
2021/12/14
9430
相关推荐
webpack原理(1):Webpack热更新实现原理代码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验