项目更新后提示刷新

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
作者
龟龟
发布于
2022年12月28日
更新于
2024年09月07日
许可协议