前端JS自动检测版本更新
前言
当用户在当前站点停留时间比较长,中途站点进行升级更新之后,用户如果不刷新页面就任然停留在旧的页面里,如何让用户收到一个提示,引导用户进行更新操作呢?下面给大家介绍如何站点更新如何在生产环境提示用户更新,进行页面刷新操作,核心原理其实很简单。
一、思路
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是为了避免缓存数据
//请求首页 let lastSrcs // 存储路径 const scriptReg = /<script.*?src="(.*?)"/g; // 解析请求回来的html值 async function getScripts() { const html = await fetch('/?timestep=' + Date.now()).then((res) => res.text()); scriptReg.lastIndex = 0;// 正则分析页面所有url地址 const result = []; let match; while ((match = scriptReg.exec(html))) { result.push(match[1]); } return result; }
2.检查是否需要更新
首先调用newScripts拿到当前页所有js路径
async function needUpdate(){ const newScripts = await getScripts();//调用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) } autRef();
引入main.js文件里面就可以正常使用了
本文来自博客园,作者:樱桃树下的约定,转载请注明原文链接:https://www.cnblogs.com/tcyweb/p/17373332.html