前端自动检查更新,适用Vue任何版本项目,包服务端更后客户端更新

本文主要是介绍前端自动检查更新,适用Vue任何版本项目,包服务端更后客户端更新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现思路

  1. 请求当前项目根路径
  2. 提前文件中的标签路径
  3. 对比路径和刷新页面

按上思路不做优化项自动更新效率不足50%

  • 优化项
  • 剔除浏览器插件引入的JS包到项目里面,增加对比标签数量,和防止有浏览器插件用户无限刷新
  • 剔除 http 网路地址协议的JS标签路径,减少对比干扰,和其它BUG
  • 对比当前打开页面路径和请求回来的根页面的 JS 标签和路径,大大提高更新后的刷新率(100%更新刷新)
  • 页面切换后台时停止检查更新 (阻止无效的JS逻辑)

完整代码 复制即用

const _window = window as any;/* 是否在弹框状态 */
let timeoutID: any = 0, isMessageBox = false;const WithdrawLinks = async (html: string): Promise<string[]> => {/* 这段正则全局匹配可以放到外面去,注意lastIndex即可 */const scriptReg = /<script.*src=["'](?<src>[^"']+)/gm;const linkReg = /<link.*href=["'](?<href>[^"']+)/gm;let result: Array<string> = [], link: Array<string> = [], match: any;while ((match = scriptReg.exec(html))) {result.push(match.groups.src);}while ((match = linkReg.exec(html))) {link.push(match.groups.href);}const eliminate = <T>(result: string[]): string[] => {let filterList: string[] = [];filterList = result.filter((element) => !element.startsWith('chrome-extension://'));filterList = result.filter((element) => !element.match(/^http(s?):\/\/[^ ]+/g));return filterList}return [...eliminate(link), ...eliminate(result)];}// 检查更新
async function CheckForUpdates() {const HaulAwayHTML = await WithdrawLinks(await fetch('/').then(resp => resp.text()));const renderHTML = await WithdrawLinks(document.documentElement.innerHTML)let result = false;console.log(HaulAwayHTML, renderHTML);if (renderHTML.length !== HaulAwayHTML.length) {result = true;} else {for (let i = 0; i < HaulAwayHTML.length; i++) {if (renderHTML[i] !== HaulAwayHTML[i]) {result = true;break;}}}return result;
}document.addEventListener("visibilitychange", function () {const status = document.visibilityStateif (status === 'hidden') {timeoutID && clearTimeout(timeoutID);timeoutID = null;} else if (status === 'visible') {!isMessageBox && autoRefresh();}
});// 调用即可
export const autoRefresh = async () => {timeoutID = setTimeout(async () => {const willUpdate = await CheckForUpdates();if (willUpdate) {clearTimeout(timeoutID);isMessageBox = true;const confirm: boolean = window.confirm('页面有更新,点击确定刷新页面?')if (confirm) { _window.location.reload(true); } else {isMessageBox = false;autoRefresh();}} else {autoRefresh();}}, 10000);
}

这篇关于前端自动检查更新,适用Vue任何版本项目,包服务端更后客户端更新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378813

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里