项目更新后提示刷新
import Vue from "vue";
// 上一次获取到的src数组
let lastSrcs;
// const scriptReg = /\<script.*src=["'](?<src>[^"']+)/gm;
const scriptReg = /<script[^>]* src\s*=\s*(['"]?)(.*?)\1/gm;
/*
*获取最新页面中的script链接
*/
async function extractNewScripts() {
const utf8Decoder = new TextDecoder("utf-8");
const response = await fetch("/?_timestamp=" + Date.now());
const reader = response.body.getReader();
let { value: chunk, done: readerDone } = await reader.read();
chunk = chunk ? utf8Decoder.decode(chunk) : "";
const scriptArr = chunk.match(scriptReg);
return patternSrc(scriptArr);
// scriptReg.lastIndex = 0;
// let result = [];
// let match;
// while ((match = scriptReg.exec(chunk))) {
// result.push(match.groups.src);
// }
// return result;
}
/*
*返回所有script标签中src的内容
*/
function patternSrc(arr) {
let reg = /src="(.+)"/;
let result = [];
for (let i = 0; i < arr.length; i++) {
let matches = reg.exec(arr[i]);
if (matches && matches[1]) {
result.push(matches[1]);
}
}
return result;
}
/*
*判断上次获取到的src和当前获取到的src是否相等
*/
async function needUpdate() {
const newScripts = await extractNewScripts();
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;
}
// 调用次数,初始加载调用一次
let frequency = 0;
let DURATION = 0;
function autoRefresh() {
DURATION = frequency === 0 ? 0 : 600000;
frequency += 1;
setTimeout(async () => {
const willUpdate = await needUpdate();
if (willUpdate) {
Vue.prototype
.$confirm("项目有更新,点击确认刷新获取最新数据!", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
location.reload(true);
})
.catch(() => {
Vue.prototype.$message({
type: "info",
message: "已取消"
});
});
}
autoRefresh();
}, DURATION);
}
export default autoRefresh;
项目更新后提示刷新
http://localhost:8090//archives/xiang-mu-geng-xin-hou-ti-shi-shua-xin