当前位置: 首页 > news >正文

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

相关文章:

  • 工作学习记录
  • UE5数字孪生制作-数据篇(二) - 数据处理
  • WGCLOUD实践 - wgToken怎么使用
  • nacos做服务配置和服务器发现
  • [LeetCode]-225. 用队列实现栈
  • 前端缓存机制——强缓存、弱缓存、启发式缓存
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • 前端Vue 页面滑动监听 拿到滑动的坐标值
  • 移除元素(双指针)
  • 目标检测回归损失函数(看情况补...)
  • 接收表单数据
  • HTTP 协议详解-上(Fiddler 抓包演示)
  • 【Redis】Redis与SSM整合Redis注解式缓存Redis解决缓存问题
  • android手机平板拓展电脑屏幕
  • 删数问题 (贪心)
  • 2019年如何成为全栈工程师?
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Druid 在有赞的实践
  • IDEA 插件开发入门教程
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中的正则表达式入门
  • Python打包系统简单入门
  • SAP云平台里Global Account和Sub Account的关系
  • webpack+react项目初体验——记录我的webpack环境配置
  • 码农张的Bug人生 - 初来乍到
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端性能优化--懒加载和预加载
  • 强力优化Rancher k8s中国区的使用体验
  • 山寨一个 Promise
  • 网络应用优化——时延与带宽
  • 小程序01:wepy框架整合iview webapp UI
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 怎么将电脑中的声音录制成WAV格式
  • 《天龙八部3D》Unity技术方案揭秘
  • ionic异常记录
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​一些不规范的GTID使用场景
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT项目实战(天气预报)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (翻译)terry crowley: 写给程序员
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Sql Server 保留几位小数的两种做法
  • (转)visual stdio 书签功能介绍
  • **CI中自动类加载的用法总结
  • .Net转前端开发-启航篇,如何定制博客园主题
  • :中兴通讯为何成功
  • @Import注解详解
  • @vue/cli脚手架