前端自动检查更新,适用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

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶