前端发版如何告知用户

在具体项目场景中,前端发版后,用户不手动刷新,则感知不到更新;经常会出现:前端更新了某个功能,导致旧功能使用出现问题,而被用户提单;

关于这个问题有多种解决方式:

  • WebSocket ,需要后端配合
  • 接口交互,需要后端配合
  • nginx 配置
  • 前端轮询是否更新(纯前端解决)

因为后端忙,所以暂时写了个纯前端的解决方案

import { ElMessage, ElMessageBox } from 'element-plus';

let lastSrcs = [] as any;

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

async function needUpdate() {
	const newScripts = await getscript()
	if(!lastSrcs.length) {
		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 DURATION = 5000
function autoRefresh() {
	setTimeout(async()=> {
		const willUpdate = await needUpdate();
		if(willUpdate) {
			ElMessageBox.confirm(
			    '检测到系统有更新,是否立即更新?',
			    '系统提示',
			    {
			      confirmButtonText: '更新',
			      cancelButtonText: '稍后再说',
			      type: 'warning',
			    }
			).then(() => {
				window.location.reload()
			}).catch(() => {
			  ElMessage.info('已取消,请稍后自己手动刷新页面',)
			})
		}
		autoRefresh()
	},DURATION)
}

autoRefresh()

再到 main.ts中引入这个文件即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值