Vue實(shí)現(xiàn)自動(dòng)檢測(cè)以及版本的更新
一、思路
1,每隔一小段時(shí)間fetch請(qǐng)求一次服務(wù)器首頁數(shù)據(jù),解析為純文本。
2,識(shí)別純文本里對(duì)應(yīng)script標(biāo)簽路徑文件指紋是否發(fā)生變動(dòng)
3,有變動(dòng)則彈框提示引導(dǎo)用戶進(jìn)行刷新操作
二、實(shí)現(xiàn)步驟
1.調(diào)用fetch拿到首頁的html并且轉(zhuǎn)為純文本格式
核心代碼:
fetch('/').then(res=>res.text()).then(res=>console.log(res))
返回結(jié)果
由于vue是單頁面,所以返回?cái)?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>
仔細(xì)觀察返回?cái)?shù)據(jù)不難發(fā)現(xiàn)script標(biāo)簽里的 <script type=module crossorigin src=./assets/index.b3865953.js> </script> 所對(duì)應(yīng)的文件路徑是./assets/index.b3865953.js 這是由于前端工程化會(huì)自動(dòng)給文件帶上文件指紋,只要這些文件有變動(dòng),那么這些文件指紋也就是hash值也會(huì)跟著變化,每隔一小段時(shí)間去分析頁面中script元素的js,只要發(fā)現(xiàn)js路徑有變化,說明這個(gè)系統(tǒng)是有所改動(dòng)。
具體代碼如下:
//請(qǐng)求首頁,timestep是為了避免緩存數(shù)據(jù)
//請(qǐng)求首頁 async function newScripts(){ const html = await fetch('/?timestep='+ Date.now()).then((res)=>res.text()); scriptReg.lastIndex = 0;//正則分析頁面所有url地址 let result = [];//保存分析數(shù)據(jù)到一個(gè)數(shù)組里 let match; while((match=scriptReg.exec(html))){ result.push(match.groups.src) } return result;//返回?cái)?shù)組 }
//數(shù)組里就記錄了這一次請(qǐng)求首頁在首頁當(dāng)中所有的js的獲取地址
2.檢查是否需要更新
首先調(diào)用newScripts拿到當(dāng)前頁所有js路徑
代碼如下:
async function needUpdate(){ const newScripts = await newScripts();//調(diào)用newScripts if(!lastSrcs){//如果之前沒有保存頁面js地址的話,進(jìn)行一次保存,初始化并存下當(dāng)前數(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)用自身,不斷的進(jìn)行檢查,從而達(dá)到提示更新的目的。
代碼如下:
const timeData=2000;//檢查間隔時(shí)間 function autRef(){ setTimeout(async()=>{ const willUp = await needUpdate();//調(diào)用檢查更新函數(shù) if(willUp){ const result = confirm('數(shù)據(jù)更新點(diǎn)擊確認(rèn)刷新當(dāng)前頁') }; if(result){ location.reload();//刷新當(dāng)前頁 } autRef(); },timeData) }
這里只做了個(gè)簡(jiǎn)單的彈窗,當(dāng)然大家可以繼續(xù)優(yōu)化,可以寫成任意自己想要的樣子。
總結(jié)
以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了實(shí)現(xiàn)線上更新的一種思路,相比在生產(chǎn)環(huán)境下實(shí)現(xiàn)熱更新,或者是使用websocket相對(duì)來說都是比較麻煩的,而且還需要改動(dòng)服務(wù)器,這種做法只需要一小段js函數(shù)即可解決,并且效率也是非常高的,對(duì)整個(gè)系統(tǒng)的運(yùn)行,基本上是沒有任何負(fù)面影響,因?yàn)閱雾撁婺J较?,每次?qǐng)求的頁面實(shí)際上傳輸?shù)臄?shù)據(jù)非常少,所以兩秒一次,完全不會(huì)給站點(diǎn)增加負(fù)荷。
到此這篇關(guān)于Vue實(shí)現(xiàn)自動(dòng)檢測(cè)以及版本的更新的文章就介紹到這了,更多相關(guān)Vue檢測(cè)版本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue router嵌套路由在history模式下刷新無法渲染頁面問題的解決方法
這篇文章主要介紹了vue router嵌套路由在history模式下刷新無法渲染頁面問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01vue 實(shí)現(xiàn)把路由單獨(dú)分離出來
這篇文章主要介紹了vue 實(shí)現(xiàn)把路由單獨(dú)分離出來,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08關(guān)于vue項(xiàng)目一直出現(xiàn) sockjs-node/info?t=XX的解決辦法
sockjs-node 是一個(gè)JavaScript庫,提供跨瀏覽器JavaScript的API,創(chuàng)建了一個(gè)低延遲、全雙工的瀏覽器和web服務(wù)器之間通信通道,這篇文章主要介紹了vue項(xiàng)目一直出現(xiàn) sockjs-node/info?t=XX的解決辦法,需要的朋友可以參考下2023-12-12Vue實(shí)現(xiàn)下拉滾動(dòng)加載數(shù)據(jù)的示例
這篇文章主要介紹了Vue實(shí)現(xiàn)下拉滾動(dòng)加載數(shù)據(jù)的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-04-04element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼
這篇文章主要介紹了element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08vue中的v-model原理,與組件自定義v-model詳解
這篇文章主要介紹了vue中的v-model原理,與組件自定義v-model詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08