一文大白话讲清楚webpack基本使用——6——热更新及其原理

文章目录

一文大白话讲清楚webpack基本使用------6------热更新及其原理

1. 建议按文章顺序从头看,一看到底,豁然开朗

2. 啥是热更新HMR

  • HMR,Hot Module Replacement,翻译为热重载。有人就问了,不是热更新么,怎么是热重载。你可这么理解,热重载是原理,它导致的效果就是热更新。你怎么更新,那不得重载。就这么简单
  • 热更新,简单点说,就是webpack提供的一项开发环境中的功能,在开发过程中,如果代码(理解为模块更准确,因为webpack万物皆模块)有改动,不需要刷新页面,可以实时更新修改的模块

3. 热更新怎么用

  • 用法很简单,只要我们在webpack.config.js中启用热模块替换就行
js 复制代码
devServer:{
    hot:true
}
  • 然后我们安装webpack serve
js 复制代码
npm install webpack-dev-server
  • 然后再package.json里面配置快速启动
js 复制代码
"dev": "webpack serve"
  • 然后启动server
js 复制代码
npm run dev

-可以看到顺利启动,我们复制http://localhost:8080/到浏览器运行,

  • 然后修改stylesheet/index.scss的p-border的border为15个像素,保存,返回到浏览器,别刷新,看到border已经是15px了,很好
  • 如果你是双屏幕开发,那就真的很带劲

4.热更新的原理

  • 既然我们改了代码,然后浏览器就同步了,说明什么

  • 说明他两肯定通信了,而且要一直保持通信,只要我这边改代码了,就要通知你

  • 那明了了,肯定是websocket通信没跑了

  • 我们修改了边框以后,浏览器建立一个ws

  • 但是通信的双方具体是谁呢,通信都发什么呢

  • 首先,我们运行npm run dev,发现只给了地址,但是dist下面没有打包出来东西,但是我们在浏览器访问地址的时候却能访问到东西,说明啥,首先webpack Dev Server得有能像build那样那js源代码打包成bundle.js的东西(webpack Compile)),而且还得有一个存储bundle.js的地方(Bundle Server)

  • 其次,我们在浏览器就运行了地址,也没创建websocket啊,怎么就能通信了,那只能说明你访问了这个地址后,webpack Dev Server给浏览器注入了一个websocket,注入到哪了呢,到bundle.js里面了,具体注入了个啥呢(HMR Runtime)

  • 再者,我们更新了代码以后,没有刷新,但是能局部更新,那说明webpack Devops Server肯定有一个将更新代码通过websocket发送给bundle.js的东西(HMR Server)

  • 最后,bundle.js既有我们的代码,又有注入进来的websocket,他是怎么工作的呢

  • 别着急,事情理清楚了,我们画一张图

  • 这就是webpack Dev Server 和Browser之间的关系图

  • 还不够明白是吧,别着急

  • 咱再上流程图

  • 这下看明白了吧

  • 再文字总结一下吧

  1. 通过webpack-dev-server创建两个服务器,提供静态资源的服务express和Socket服务
  2. express Server负责直接提供静态资源服务
  3. socket server建立长连接,保持双方通信
  4. 如果socket server监听到模块发生变化时,会生成manifest和update chunk
  5. 通过websocket发送给给客户端
  6. 客户端执行更新逻辑
相关推荐
iCOD3R14 分钟前
Skill - kill-ai-slop 解决“AI 味”样式
前端·css·ai编程
皮音30 分钟前
Skill 在项目中的实践 —— 从 Agent 困境到 Skill 工程化
前端
大龄秃头程序员43 分钟前
RN 0.86 新架构实战:TurboModule + Fabric 组件 + iOS 原生容器,完整代码开源
前端·react native
这是个栗子1 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
Hilaku1 小时前
Vue 和 React 真正的差距,不在语法,而在团队犯错成本
前端·javascript·程序员
研☆香1 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
Liora_Yvonne1 小时前
目录结构到底怎么设计?别再把 components 和 utils 当垃圾桶了
前端
柯克七七2 小时前
我把 bug 修得太干净了,测试组以为这个模块本来就没问题
前端·javascript·typescript
Null1552 小时前
浏览器唤起桌面端应用(终极篇)
前端·javascript
Quz2 小时前
QML Label 完整用法与 Text 组件选型
前端·qt