前端发布项目自动更新

思路:无论vue还是react打包都会有dist文件夹,内部有index.html。我是想根据index.html中的script src地址是否改变,判断项目是否有新内容。

具体代码如下

首先先拿到生产环境中index.html文本,由于是单页面应用使用fetch('/?_stamp='+Date.now())来拿到html文本。并获取所有的src地址。

const scriptReg = /\<script.*src=["'](?<src>[^"']+)/gm;async function getScriptSrcs() {const html = await fetch('/?_timestamp=' + Date.now()).then((res) =>res.text(),);scriptReg.lastIndex = 0;let result = [];let match;while ((match = scriptReg.exec(html))) {result.push(match.groups.src);}return result;
}

全局定义lastSrcs表示旧的地址数组,然后和新的newScripts对比,如果长度不同或者某一项不同则表示项目有新内容更新。

async function needUpdate() {const newScripts = await getScriptSrcs();if (!lastSrcs) {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;
}

最终我们使用轮询的方式监听是否变化。

const autoRefresh=()=>{setTimeout(async()=>{const willUpdate = await needUpdate();if (willUpdate) {const result = confirm('页面有更新,请刷新页面');if (result) {location.reload();}}autoRefresh();},5000);
}

最后在main.ts中引入即可。有什么问题私信哦。

后续:我想加一个可以自动关闭的功能,但是使用window.confirm我无法实现,尝试使用alert也无法成功,然后就想到是不是可以重写这个alert,结果发现果然可以。代码如下:直接复制即可使用,需要在入口文件引入。

let lastSrcs;
let timeoutId: any = 0;
let strHtml,time = 5,timer = null,timer1 = null;
const scriptReg = /\<script.*src=["'](?<src>[^"']+)/gm;async function getScriptSrcs() {const html = await fetch('/?_timestamp=' + Date.now()).then((res) =>res.text(),);scriptReg.lastIndex = 0;let result = [];let match;while ((match = scriptReg.exec(html))) {result.push(match.groups.src);}return result;
}
async function needUpdate() {const newScripts = await getScriptSrcs();if (!lastSrcs) {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;
}function createMask() {var shield = document.createElement('DIV');shield.id = 'shield';shield.style.position = 'absolute';shield.style.left = '0px';shield.style.top = '0px';shield.style.width = '100%';shield.style.height = document.body.scrollHeight + 'px';shield.style.background = 'transparent';shield.style.textAlign = 'center';shield.style.zIndex = '10000';shield.style.filter = 'alpha(opacity=0)';document.body.appendChild(shield);return shield;
}function createAlert(txt) {var alertFram = document.createElement('DIV');alertFram.id = 'alertFram';alertFram.style.position = 'absolute';alertFram.style.left = '50%';alertFram.style.top = '0';alertFram.style.background = '#fff';alertFram.style.transform = 'translateX(-50%)';alertFram.style.width = '450px';alertFram.style.height = '150px';alertFram.style.textAlign = 'center';alertFram.style.lineHeight = '150px';alertFram.style.zIndex = '10001';strHtml ='<ul style="list-style:none;margin:0px;padding:0px;width:100%;border-radius:10px;overflow:hidden;box-shadow:0 0 5px 5px #ccc">\n';strHtml +=' <li style="background:#1677ff;text-align:left;padding-left:20px;font-size:14px;font-weight:bold;height:40px;line-height:40px;color:#fff">系统提示</li>\n';strHtml +='<li id="_content" style="background:#fff;text-align:center;font-size:14px;height:100px;line-height:100px;">' +txt +'</li>\n';strHtml += `<li style="background:#fff;text-align:right;font-weight:bold;height:50px;line-height:25px;padding-bottom:10px ;padding-right:20px;"><input type="button" id="_btn_click" style="outline:none;cursor:pointer;border:0;width:70px;height:40px;border-radius:20px;background:#1677ff;color:#fff" value="确 定"/></li>\n`;strHtml += '</ul>\n';alertFram.innerHTML = strHtml;document.body.appendChild(alertFram);return alertFram;
}function removerDom(alertFram, mask) {document.body.removeChild(alertFram);document.body.removeChild(mask);window.location.reload();
}function controlTime(alertFram, mask) {timer1 = setInterval(() => {time -= 1;document.getElementById('_content').textContent =`页面有更新,${time}秒后将强制刷新页面!`;if (time === 0) {clearTimeout(timer1);removerDom(alertFram, mask);}}, 1000);
}window.alert = function (txt) {const alertFram = createAlert(txt);const mask = createMask();controlTime(alertFram, mask);const dom = document.getElementById('_btn_click');dom.onclick = () => {removerDom(alertFram, mask);};
};const duration = 5000;function autoRefresh() {timer = setTimeout(async () => {const willUpdate = await needUpdate();let content = `页面有更新,${time}秒后将强制刷新页面!`;if (willUpdate) {clearTimeout(timer);alert(content);} else {autoRefresh();}}, duration);
}
const env = process.env.UMI_ENV;env == 'production' && autoRefresh();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS字符串API: slice、split、JSON.stringify、trim、concat 、indexOf...

substring() 字符串的截取可以使用substring()方法和slice()方法。其中substring()方法接受两个参数&#xff0c;第一个参数是起始位置&#xff0c;第二个参数是结束位置&#xff0c;截取的字符串不包括结束位置的字符。 let str "Hello, World!"; let str2 &quo…

性能测试之(五):JMeter 入门1

一、性能测试工具&#xff08;JMeter、LoadRunner&#xff09; 1、LoadRunner是一种工业级的测试工具 &#xff0c;可以模拟上万用户实施测试&#xff0c; 优点&#xff1a;多用户&#xff08;支持数量单位万&#xff09;、详细分析报表、支持IP欺骗 缺点&#xff1a;收费、体…

金融中IC和IR的定义

当谈到金融领域时&#xff0c;IC&#xff08;Information Coefficient&#xff09;和IR&#xff08;Information Ratio&#xff09;通常是用来评估投资组合管理绩效的指标。它们都涉及到投资者对信息的利用和管理的效果。 信息系数&#xff08;IC - Information Coefficient&a…

学习Go语言Web框架Gee总结--分组控制Group(四)

学习Go语言Web框架Gee总结--分组控制Group 学习网站来源&#xff1a;Gee 相当于上一篇&#xff0c;这节只改变了gee/gee.go文件&#xff0c;其他文件一样 路由分组是指将相似的路由规则分组到一起&#xff0c;以便更好地管理和维护路由 就比如在网络中&#xff0c;路由分组可以…

基于ssm毕业设计选题系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业设计选题系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

SPCA双模认证和CSMM认证的区别

SPCA&#xff08;Software Process and Capability Maturity Model&#xff09;和CSMM&#xff08;China Software Maturity Model&#xff09;都是软件过程成熟度模型&#xff0c;但它们在起源、目标和实施方式上有所不同。这些差异也影响了它们对企业的注重点。 1.起源和背景…

软文推广宣发遵循的基本流程

在软文发稿的旅程中&#xff0c;制定明确的策略思路是确保成功的关键。软文发稿有一定的流程需要我们遵循&#xff0c;才能达到理想的软文宣发效果。首先&#xff0c;我们要明确发稿的地区&#xff0c;然后精准选择目标受众&#xff0c;最后才能展开内容的创作。下面&#xff0…

实验笔记之——下载数据到服务器

开发过程中经常需要把数据传到服务器上&#xff0c;太麻烦了&#xff0c;为此本博文记录采用百度云来传输数据 百度云 使用bypy包。 安装&#xff1a;pip install bypy 配置bypy连接百度网盘&#xff1a; 终端输入bypy info将命令行提示的链接复制到浏览器&#xff0c;并复制…

MySQL如何从数据中截取所需要的字符串

有这样的一个场景,我想从我的表里面进行数据截取&#xff0c;我的数据内容大致如下&#xff1a; 张三-建外SOHO-2-16 POA 20210518.pdf 我想获取数据中的&#xff1a;20210518这一日期部分&#xff0c; 这种情况可以使用MySQL的SUBSTRING_INDEX函数来实现&#xff1a; SELECT …

uView CountDown 倒计时

该组件一般使用于某个活动的截止时间上&#xff0c;通过数字的变化&#xff0c;给用户明确的时间感受&#xff0c;提示用户进行某一个行为操作。 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 通过time参数设置…

一文读懂$mash 通证的 “Fair Launch” 规则,将公平发挥极致

Solmash 是Solana生态中由社区主导的铭文资产LaunchPad平台&#xff0c;该平台旨在为Solana原生铭文项目&#xff0c;以及通过其合作伙伴SoBit跨链桥桥接到Solana的Bitcoin生态铭文项目提供更广泛的启动机会。有了Solmash&#xff0c;将会有更多的Solana生态的铭文项目、资产通…

cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏

目标 30 在 android 12 中运行 报 D/cocos2d-x debug info: [LUA ERROR] bad light userdata pointer &#xff0c;导致黑屏 下载最新的Cocos2dx 4.0,将其中的luajit &#xff08;cocos2d-x\external\lua\luajit&#xff09;替换到自己的cocos对应的目录中。

工业物联网上篇——什么是IIOT?

工业物联网背后的理念是使用工业设施中“哑巴设备”多年来产生的数据。装配线上的智能机器不仅可以更快地捕获和分析数据&#xff0c;且在交流重要信息方面也更快&#xff0c;这有助于更快、更准确地做出业务决策。 信息技术&#xff08;IT&#xff09;和运营技术&#xff08;O…

MySQL取出N列里最大or最小的一个数据

如题&#xff0c;现在有3列&#xff0c;都是数字类型&#xff0c;要取出这3列里最大或最小的的一个数字 -- N列取最小 SELECT LEAST(temperature_a,temperature_b,temperature_c) min FROM infrared_heat-- N列取最大 SELECT GREATEST(temperature_a,temperature_b,temperat…

Hadoop之MapReduce 详细教程

MapReduce仅作了解&#xff0c;生产上很少使用该计算程序 1、MapReduce介绍 MapReduce 思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”&#xff0c;适用于大量复杂的任务处理场景&#xff08;大规模数据处理场景&#xff09;。即使是…

Centos 磁盘挂载和磁盘扩容(新加硬盘方式)

步骤总结如下 一、对磁盘进行分区 二、对磁盘进行格式化 三、将磁盘挂载到对应目录 四、做开机自动挂载磁盘 磁盘分区 1.使用命令&#xff1a;fdisk -l 查看磁盘&#xff08;注&#xff1a;正常在Centos7中第一块数据盘标识一般是/dev/sda,第二块数据盘标识一般是/dev/sdb&…

WebGIS开发的常见框架及优缺点

WebGIS开发引擎的发展历程&#xff1a; 内容来自公众号&#xff1a;Spatial Data 地图API分类 WebGIS系统通常都围绕地图进行内容表达&#xff0c;但并不是有地图就一定是WebGIS&#xff0c;所以下面要讨论下基于Web的地图API分类及应用场景。Web上的Map API主要分类&#xff…

网络基础面试题(一)

1.ICMP是什么协议&#xff1f;处于哪一层&#xff1f; ICMP&#xff08;Internet Control Message Protocol&#xff09;是一种网络协议&#xff0c;用于在IP网络中传递控制消息和错误报告。它是在IP协议之上运行的协议。 ICMP主要用于在网络中的不同主机和路由器之间传…

基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现

基于JavaSpringBootvueelementUI私人健身教练预约管理系统设计实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementUI私人健身教练预约管理系统设计实现一、前言介绍&#xff1a;二、系统设计&#xff1a;2.1 性能需求分析2.2 B/S架构&…

typora的笔记丢失了怎么办?

突然打开电脑发现原本保存的typora的笔记全部不见了&#xff0c;头痛…… 解决方法&#xff1a;点击typora中的文件&#xff0c;选择偏好设置&#xff0c;点击[恢复未保存的草稿]&#xff0c;然后可以在文件夹中找到最后一次保存该文件的版本。 自己又将自动保存勾选上了&…