前端开发-热更新原理解读

一、websocket简介
二、热跟新原理
三、实例剖析
四、总结

websocket简介

在h5推出之前,浏览器应用跟服务器端通信的机制只有http协议,http是一种无状态的网络协议,前端向服务器发起一个请求,服务器给出一次应答,服务器无法主动向客户端发起通信,这种设计主要是为了节省带宽资源,客户端和服务器端不需要维持长连接

早期要实现一个浏览器即使通信工具(如webqq),由于服务器端不能主动向客户端发起通信,只能客户端设置一个定时器,定时向服务器端发起请求拉取消息,很显然,这种轮询的方式对性能来说是一把杀猪刀

h5很应景的推出了websocket,这给了web开发者另一种选择去应付纷繁复杂的场景。WebSocket 是一个独立的基于TCP的协议,前端和服务器端可以建立起一个长连接,客户端可以向服务器端推送消息,服务器也可以主动向客户端推送消息

本文不对websocket做太深入的说明,有兴趣可留下你的评论

热跟新原理


热更新

浏览器的网页通过websocket协议与服务器建立起一个长连接,当服务器的css/js/html进行了修改的时候,服务器会向前端发送一个更新的消息,如果是css或者html发生了改变,网页执行js直接操作dom,局部刷新,如果是js发生了改变,只好刷新整个页面

js发生改变的时候,不太可能判断出对dom的局部影响,只能全局刷新
为何没有提到图片的更新,如果是在html或者css里修改了图片路径,那么更新html和css,只要图片路径没有错,那么就已经达到了更新图片的路径。如果是相同路径的图片进行了替换,这往往需要重启下服务

在简单的网页应用中,这一个过程可能仅仅是节省了手动刷新浏览器的繁琐,但是在负责的应用中,如果你在调试的部分需要从页面入口操作好几步才到达,例如:登录->列表->详情->弹出窗口,那么局部刷新将大大提高调试效率

实例剖析


如果你使用gulp构建的前端开发工作环境,想必对browserSync不会陌生,你明白它的工作方式么?

browserSync易于使用:

    var bs = browserSync({port: 5000, //服务端口notify: false,logPrefix: 'PSK',server: {baseDir: '_dev', //服务路径,也就是页面资源存放的路径directory: true},open: false //需不需要自动打开浏览器}, function() {//启动后的回调});

很容易想到,这开启了一个http服务,在浏览器输入localhost:5000/path就可以访问到页面,不知道有没有细心的观众在查看页面源码的时候发现多了点什么不是你写的东西


browserSync

没错,browser-sync-client.2.9.6.js并不是你引入的,这个是browserSync在创建的时候,为你的html自动注入的(baseDir目录下),部分代码:

    .........___browserSync___.io = window.io;window.io = window.___browserSync___oldSocketIo;window.___browserSync___oldSocketIo=undefined;___browserSync___.socketConfig = {"reconnectionAttempts":50,"path":"/browser-sync/socket.io"};___browserSync___.socket = ___browserSync___.io('' + location.host + '/browser-sync', ___browserSync___.socketConfig);"use strict";(function (window, document, bs, undefined) {var socket = bs.socket;var uiOptions = {bs: {}};..........

原谅我并未仔细研读过次文件代码,因为实在太多太凌乱,但是从上面这几行代码,以及文件名,就基本可以确定这是websocket-client的代码

读过的同学求抱大腿

下面再来做一个实验来确认下,control+c 把服务器关闭,再来看看刚才那网页的控制台:


browserSync-error

控制台一直在报错,why? 因为服务器关闭了之后,连接断开,客户端一直在尝试对服务器发起重连

再来看看webpack是怎么做的,webpack可以使用webpack-dev-server来搭建热跟新的开发环境,webpack-dev-server是基于express的轻量级服务器,作用有点类似于上述的browserSync,你需要在webpack.config.js中的entry配置里增加的点东西

    var config = {entry: ['webpack/hot/dev-server', './app/main.js'], output: {path: path.resolve(__dirname, './build'),filename: 'bundle.js'},module: {loaders: [{test: /\.js$/,// Use the property "loaders" instead of "loader" and // add "react-hot" in front of your existing "jsx" loader// 使用 "loaders" 属性代替 "loader"// 然后在 "jsx" 加载器之前添加 "react-hot" loaders: ['react-hot', 'babel']}]}};

配置中增加了webpack/hot/dev-server实体,跟main.js一起打包成bundle.js,这个就可以类比到上面的browser-sync-client.2.9.6.js

如果自己搭建express,还可以使用webpack的热跟新中间件

总结


知其然并知其所以然是很重要的,不要求搞清楚每一个细节,但要懂得实现原理

打赏就不需要了,如果对你有帮助,给个赞吧~~

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

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

相关文章

HTML5事件—visibilitychange 页面可见性改变事件

又看到一个很有意思的HTML5事件 visibilitychange事件是浏览器新添加的一个事件,当浏览器的某个标签页切换到后台,或从后台切换到前台时就会触发该消息,现在主流的浏览器都支持该消息了,例如Chrome, Firefox, IE10等。虽然这只是一…

java回型数

import java.util.Arrays;public class hello {public static void main(String[] args) {//输出5*5的int n 5;int [][] huizixingnew int[n][n];int minX0;//x轴最小下标int minY0;//y轴最小下标int maxXn-1;//x轴最大下标int maxYn-1;//y轴最大下标int counter0;//计数int xf…

用CSS3 vh 简单实现DIV全屏居中

vh、vw、vmin、vmax介绍 vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)vh:视窗高度的百分比vmin:当前 vw 和 vh 中较小的一个值vmax:当前 vw 和 vh 中较大的一个值 浏览器兼容性 (1&#xff09…

解决360等等浏览器兼容模式解析不兼容代码

之前写的代码不是很规范 , 在今天测试下发现360浏览器等等的浏览器使用兼容模式会有很多不兼容 , 网上了解过一下 , 说是很多浏览器的兼容模式可能就是为了兼容IE7之前的网站代码 , 而非我们字面理解的兼容二字 ... OK!跑题了 ... 我的解决方案是在页面head加<meta http…

缩小窗口时CSS背景图出现右侧空白BUG的解决方法

页面容器&#xff08;#wrap&#xff09;与页面头部&#xff08;#header &#xff09;为100%宽度。而内容的容器&#xff08;#page&#xff09;为固定宽度960px。浏览窗口缩小而小于内容层宽度时会产生宽度理解上的差异。如下图所示窗口宽度大于内容层宽度&#xff1a; 改变浏览…

JAVA链接Mysql数据库(一)

第一步自定义 properties 文件 userroot password12345 urljdbc:mysql://localhost:3306/test?useUnicodetrue&characterEncodingutf8 driverClasscom.mysql.jdbc.Driver第二部 创建 java 文件运行 import java.io.InputStream; import java.sql.Connection; import java…

优化器,SGD+Momentum;Adagrad;RMSProp;Adam

Optimization 随机梯度下降&#xff08;SGD&#xff09;&#xff1a; 当损失函数在一个方向很敏感在另一个方向不敏感时&#xff0c;会产生上面的问题&#xff0c;红色的点以“Z”字形梯度下降&#xff0c;而不是以最短距离下降&#xff1b;这种情况在高维空间更加普遍。 SGD的…

iOS开发-平台使用TestFlight进行Beta测试

使用 TestFlight&#xff0c;你可以向测试人员发布你 App 的 prerelease 版本来收集反馈信息&#xff0c;为将来发布 App 的正式版做准备。现在 TestFlight 是一个可选功能&#xff0c;你也可以不使用它&#xff0c;而是像以往发布 App 那样直接提交到 appStore。 TestFlight 使…

java语言介绍 —(1)

1.基础常识 软件&#xff1a;即一系列按照特定顺序组织的计算机数据和指令的集合。分为&#xff1a;系统软件 和 应用软件 系统软件&#xff1a;windows , mac os , linux ,unix,android,ios,… 应用软件&#xff1a;word ,ppt,画图板,… 人机交互方式&#xff1a; 图形化界面…

第一个java程序helloworld —(2)

1.开发体验——HelloWorld 1.1 编写 创建一个java源文件&#xff1a;HelloWorld.java class HelloChina{public static void main(String[] args){System.out.println("Hello,World!");} }1.2 编译&#xff1a; javac HelloWorld.java 1.3 运行&#xff1a; java Hel…

2017年苹果公司开发者账号申请与支付流程

邓白氏编码下来之后&#xff0c;现在我们就可以走到付款流程&#xff0c;购置账号了&#xff01;觉得有用的顶一下 1.登陆苹果账号&#xff0c;加入苹果开发者 https://developer.apple.com/ 2.按照指示&#xff0c;一步步点击进入就行了&#xff0c;反正你也看不懂&#xff08…

java关键字与标识符 —(3)

1.java关键字的使用 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;单词&#xff09; 特点&#xff1a;关键字中所字母都为小写 具体哪些关键字&#xff1a; 2.保留字&#xff1a;现Java版本尚未使用&#xff0c;但以后版本可能会作…

2017年苹果公司开发者账号申请-公司邓白氏编码

申请公司的苹果开发者账号和企业级的苹果开发者账号时&#xff0c;都会用到邓白氏编码&#xff0c;也就是我们申请苹果开发者账号时需要填写的D-U-N-S Number。 申请这个邓白氏编码是免费的&#xff0c;但是从像华夏邓白氏公司提交申请到可以申请苹果开发者账号来用这个9位的D-…

java变量及进制问题 —(4)

1.变量的分类 1.1 按数据类型分类 详细说明&#xff1a; //1. 整型&#xff1a;byte(1字节8bit) \ short(2字节) \ int(4字节) \ long(8字节) //① byte范围&#xff1a;-128 ~ 127 // ② 声明long型变量&#xff0c;必须以"l"或"L"结尾 // ③ 通常&…

Struts2的两个蝴蝶飞,你好简单开发(一)

我把你的头像&#xff0c;设置成我的名字&#xff0c;此刻你便与我同在。我把你的名字&#xff0c;写进我的代码里面&#xff0c;以后&#xff0c;我的世界便存在着你。 “两个蝴蝶飞”特别喜欢"java1234知识分享网"小峰的实用主义&#xff0c;所以本文及其系列文章均…

用Canvas画圆环百分比进度条

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>canvas圆环进度</title><link rel"stylesheet" href"">…

利用SQL计算两个地理坐标(经纬度)之间的地表距离

两个地理坐标(经纬度)地表距离计算公式&#xff1a; 公式解释如下&#xff1a; Long1,Lat1表示A点经纬度&#xff0c;Long2,Lat2表示B点经纬度&#xff1b;aLat1–Lat2 为两点纬度之差&#xff0c;bLong1-Long2为两点经度之差&#xff1b;6378.137为地球半径&#xff0c;单位为…

java数组 —(7)

* 1.数组的理解&#xff1a;数组(Array)&#xff0c;是多个相同类型数据一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c; 并通过编号的方式对这些数据进行统一管理。 * 2.数组相关的概念&#xff1a; 数组名 元素 角标、下标、索引 数组的长度&#xff1a;元素…

java数组 —(8)

1.数组的创建与元素赋值&#xff1a; 杨辉三角&#xff08;二维数组&#xff09;、回形数&#xff08;二维数组&#xff09;、6个数&#xff0c;1-30之间随机生成且不重复。 2.针对于数值型的数组&#xff1a; 最大值、最小值、总和、平均数等 3.数组的赋值与复制 int[] a…

idea启动tomcat时报错:Error during artifact deployment. See server log for details.

Error during artifact deployment. See server log for details. 这个很多人都找不出来&#xff0c;原因无非2个&#xff1a; 一、jar 包有有些没能识别&#xff0c;tomcat没有配置好&#xff01; 二、这个一般代码错了&#xff1a; 除了看 server 的报错&#xff0c;别忘了看…