Vue实现自动检测以及版本的更新

一、思路

1,每隔一小段时间fetch请求一次服务器首页数据,解析为纯文本。

2,识别纯文本里对应script标签路径文件指纹是否发生变动

3,有变动则弹框提示引导用户进行刷新操作

二、实现步骤

1.调用fetch拿到首页的html并且转为纯文本格式

核心代码:

fetch('/').then(res=>res.text()).then(res=>console.log(res))

返回结果

由于vue是单页面,所以返回数据一般都不多,一目了然如下:

<!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>

仔细观察返回数据不难发现script标签里的 <script type=module crossorigin src=./assets/index.b3865953.js> </script> 所对应的文件路径是./assets/index.b3865953.js 这是由于前端工程化会自动给文件带上文件指纹,只要这些文件有变动,那么这些文件指纹也就是hash值也会跟着变化,每隔一小段时间去分析页面中script元素的js,只要发现js路径有变化,说明这个系统是有所改动。

具体代码如下:

//请求首页,timestep是为了避免缓存数据

//请求首页
 async function newScripts(){
 const html = await fetch('/?timestep='+ Date.now()).then((res)=>res.text());
 scriptReg.lastIndex = 0;//正则分析页面所有url地址
 let result = [];//保存分析数据到一个数组里
 let match;
 while((match=scriptReg.exec(html))){
 result.push(match.groups.src)
 }
 return result;//返回数组
 }

//数组里就记录了这一次请求首页在首页当中所有的js的获取地址

2.检查是否需要更新

首先调用newScripts拿到当前页所有js路径

代码如下:

async function needUpdate(){
 const newScripts = await newScripts();//调用newScripts
 if(!lastSrcs){//如果之前没有保存页面js地址的话,进行一次保存,初始化并存下当前数据
 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.有则弹出

每隔两秒调用 needUpdate检查更新函数,判断是否有变化,有更新则提示用户刷新页面,然后在调用自身,不断的进行检查,从而达到提示更新的目的。

代码如下:

const timeData=2000;//检查间隔时间
function autRef(){
 setTimeout(async()=>{
 const willUp = await needUpdate();//调用检查更新函数
 if(willUp){
 const result = confirm('数据更新点击确认刷新当前页')
 };
 if(result){
 location.reload();//刷新当前页
 }
 autRef();
 },timeData)
}

这里只做了个简单的弹窗,当然大家可以继续优化,可以写成任意自己想要的样子。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了实现线上更新的一种思路,相比在生产环境下实现热更新,或者是使用websocket相对来说都是比较麻烦的,而且还需要改动服务器,这种做法只需要一小段js函数即可解决,并且效率也是非常高的,对整个系统的运行,基本上是没有任何负面影响,因为单页面模式下,每次请求的页面实际上传输的数据非常少,所以两秒一次,完全不会给站点增加负荷。

作者:迪迦原文地址:https://blog.csdn.net/2303_76218115/article/details/129383875

%s 个评论

要回复文章请先登录注册