Vue實現(xiàn)自動檢測以及版本的更新
一、思路
1,每隔一小段時間fetch請求一次服務(wù)器首頁數(shù)據(jù),解析為純文本。
2,識別純文本里對應(yīng)script標簽路徑文件指紋是否發(fā)生變動
3,有變動則彈框提示引導用戶進行刷新操作
二、實現(xiàn)步驟
1.調(diào)用fetch拿到首頁的html并且轉(zhuǎn)為純文本格式
核心代碼:
fetch('/').then(res=>res.text()).then(res=>console.log(res))返回結(jié)果
由于vue是單頁面,所以返回數(shù)據(jù)一般都不多,一目了然如下:
<!DOCTYPE html>
<html lang=en>
<head>
<meta charset=UTF-8>
<link rel=icon href=./favicon.ico> <meta name=viewport content="width=device-width,initial-scale=1">
<script type=module crossorigin src=./assets/index.b3865953.js> </script>
<body>
<div id=app></div><script src=./js/WsUtil.js type=text/javascript charset=utf-8></script>
</body>
</html>
仔細觀察返回數(shù)據(jù)不難發(fā)現(xiàn)script標簽里的 <script type=module crossorigin src=./assets/index.b3865953.js> </script> 所對應(yīng)的文件路徑是./assets/index.b3865953.js 這是由于前端工程化會自動給文件帶上文件指紋,只要這些文件有變動,那么這些文件指紋也就是hash值也會跟著變化,每隔一小段時間去分析頁面中script元素的js,只要發(fā)現(xiàn)js路徑有變化,說明這個系統(tǒng)是有所改動。
具體代碼如下:
//請求首頁,timestep是為了避免緩存數(shù)據(jù)
//請求首頁
async function newScripts(){
const html = await fetch('/?timestep='+ Date.now()).then((res)=>res.text());
scriptReg.lastIndex = 0;//正則分析頁面所有url地址
let result = [];//保存分析數(shù)據(jù)到一個數(shù)組里
let match;
while((match=scriptReg.exec(html))){
result.push(match.groups.src)
}
return result;//返回數(shù)組
}
//數(shù)組里就記錄了這一次請求首頁在首頁當中所有的js的獲取地址
2.檢查是否需要更新
首先調(diào)用newScripts拿到當前頁所有js路徑
代碼如下:
async function needUpdate(){
const newScripts = await newScripts();//調(diào)用newScripts
if(!lastSrcs){//如果之前沒有保存頁面js地址的話,進行一次保存,初始化并存下當前數(shù)據(jù)
lastSrcs = newScripts;
return false;
}
let result = false ;
if(lastSrcs.length !== newScripts.length){
result = true;
}
for(let i = 0;i<lastSrcs.length;i++){
if(lastSrcs[i] !== newScripts[i]){
result = true;
break ;
}
}
}
lastSrcs = newScripts;
return result;
}
3.有則彈出
每隔兩秒調(diào)用 needUpdate檢查更新函數(shù),判斷是否有變化,有更新則提示用戶刷新頁面,然后在調(diào)用自身,不斷的進行檢查,從而達到提示更新的目的。
代碼如下:
const timeData=2000;//檢查間隔時間
function autRef(){
setTimeout(async()=>{
const willUp = await needUpdate();//調(diào)用檢查更新函數(shù)
if(willUp){
const result = confirm('數(shù)據(jù)更新點擊確認刷新當前頁')
};
if(result){
location.reload();//刷新當前頁
}
autRef();
},timeData)
}
這里只做了個簡單的彈窗,當然大家可以繼續(xù)優(yōu)化,可以寫成任意自己想要的樣子。
總結(jié)
以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了實現(xiàn)線上更新的一種思路,相比在生產(chǎn)環(huán)境下實現(xiàn)熱更新,或者是使用websocket相對來說都是比較麻煩的,而且還需要改動服務(wù)器,這種做法只需要一小段js函數(shù)即可解決,并且效率也是非常高的,對整個系統(tǒng)的運行,基本上是沒有任何負面影響,因為單頁面模式下,每次請求的頁面實際上傳輸?shù)臄?shù)據(jù)非常少,所以兩秒一次,完全不會給站點增加負荷。
到此這篇關(guān)于Vue實現(xiàn)自動檢測以及版本的更新的文章就介紹到這了,更多相關(guān)Vue檢測版本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue過渡效果之CSS過渡詳解(結(jié)合transition,animation,animate.css)
Vue 在插入、更新或者移除 DOM 時,提供多種不同方式的應(yīng)用過渡效果。本文將從CSS過渡transition、CSS動畫animation及配合使用第三方CSS動畫庫(如animate.css)這三方面來詳細介紹Vue過渡效果之CSS過渡2020-02-02
前端請求超時截斷axios?timeout設(shè)置未生效情況解決記錄
在項目中遇到了后臺接口返回數(shù)據(jù)慢的時候往往需要設(shè)置請求失效時間,在項目中遇到設(shè)置timeout失效問題由此記錄下來,這篇文章主要給大家介紹了前端請求超時截斷axios?timeout設(shè)置未生效情況解決的相關(guān)資料,需要的朋友可以參考下2024-07-07
Vue項目使用localStorage+Vuex保存用戶登錄信息
這篇文章主要為大家詳細介紹了Vue項目使用localStorage+Vuex保存用戶登錄信息,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
vue實現(xiàn)一個獲取按鍵展示快捷鍵效果的Input組件
這篇文章主要介紹了vue如何實現(xiàn)一個獲取按鍵展示快捷鍵效果的Input組件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2021-01-01
VUE3中h()函數(shù)和createVNode()函數(shù)的使用解讀
這篇文章主要介紹了VUE3中h()函數(shù)和createVNode()函數(shù)的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

