前端開發-熱更新原理解讀

-? 一、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.pswp.cn/news/247772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247772.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java楊輝三角

package com.atguigu.exer; /** 使用二維數組打印一個 10 行楊輝三角。【提示】1. 第一行有 1 個元素, 第 n 行有 n 個元素2. 每一行的第一個元素和最后一個元素都是 13. 從第三行開始, 對于非第一個元素和最后一個元素的元素。即: yanghui[i][j] yanghui[i-1][j-1…

這65條工作和成長建議,你將受用終生!

這65條工作和成長建議,每一條都值得我們認真思考。希望對你有啟發。 從1990年進入格力,董明珠已經工作了近30年。 她花了近30年的時間,一手把格力從一家虧損的中小企業變成全球500強,年銷售額超過1400億。 2004年,她被…

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…

java自定義異常報錯

public class TeamException extends Exception{static final long serialVersionUID -3387516993124229948L;public TeamException() {super();}public TeamException(String message) {super(message);} }

P多行溢出省略號的處理

因為-webkit-line-clamp: 2不兼容火狐或IE&#xff0c;采用判斷瀏覽器的方式來啟用哪個方式先判斷是什么瀏覽器 //判斷是否是谷歌瀏覽器 if (!stripos($_SERVER["HTTP_USER_AGENT"], chrome)) {$this->registerCssFile(web/css/view.css); } 行內樣式&#xff08;…

縮小窗口時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 使…

QPixmap QImage 相互轉化

QPainter p(this); QPixmap pixmap; pixmap.load("E:\\參考文件\\image\\1.jpg"); //QPixmap->QImage QImage tempImage pixmap.toImage(); p.drawImage(0,0,tempImage); QImage image; image.load("E:\\參考文件\\image\\1.jpg"); //QImage->QPixm…

java語言介紹 —(1)

1.基礎常識 軟件&#xff1a;即一系列按照特定順序組織的計算機數據和指令的集合。分為&#xff1a;系統軟件 和 應用軟件 系統軟件&#xff1a;windows , mac os , linux ,unix,android,ios,… 應用軟件&#xff1a;word ,ppt,畫圖板,… 人機交互方式&#xff1a; 圖形化界面…

微信小程序入門資源整理(熱更新)

從零開始&#xff1a;微信小程序新手入門寶典《一》 傳送門地址&#xff1a; https://segmentfault.com/a/1190000008035180 微信小程序部分資源整理 傳送門地址&#xff1a;http://blog.csdn.net/u012995964/article/details/53116477

第一個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…

高并發大流量專題---6、獨立圖片服務器的部署

高并發大流量專題---6、獨立圖片服務器的部署 一、總結 一句話總結&#xff1a; 獨立圖片服務器還是非常有必要的&#xff0c;可以很大程度的降低主服務器的io以及提升用戶訪問速度 1、獨立圖片服務器 獨立的必要性&#xff1f; 分擔Web服務器的I/O負載&#xff1a;將耗費資源的…

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;但以后版本可能會作…

parentNode,parentElement,childNodes,children的區別

轉自鏈接&#xff0c;https://blog.csdn.net/CODING_1/article/details/78202693轉載于:https://www.cnblogs.com/RioPlus/p/11051630.html