纯前端实现发版版本变化后页面重新加载

2023-02-10  本文已影响0人  storyWrite

0.原理

image.png

1. 优点

2.优化

3.代码

1).检测代码

// 检测版本是否有变化 有变化则刷新页面
import version from '../public/assets/version.json';

export default const versionCheck = () => {
  const checkTime = 5000; // 检测版本请求时间间隔
  const clickTime = 5000; // 检测操作时间间隔 每5s检测是否用户超时未操作
  const stopDifferTime = 600000; // 停止检测的时间条件 10min 1000 * 60 * 10 10min不操作,则不再检测
  window._version = version.version;
  window.stopVersionCheck = () => {};
  window.stopClickCheck = () => {};
  async function getVersion() {
    let res = await fetch(`/assets/config/version.json?random=${Math.random()}`);
    let { version } = await res.json();
    console.log(version, window._version);

    if (version !== window._version) {
      window._version = version;
      return true;
    }
    return false;
  }
  async function checkNeedReloadPage() {
    window.stopVersionCheck();
    let timer = setInterval(async () => {
      // 影响查看控制台接口(如果localStorage存在key为timer的值) 直接清楚掉定时器 不检测
      if (localStorage.getItem('timer') !== null) {
        window.stopVersionCheck();
        window.stopClickCheck();
      }

      let changeVersion = await getVersion();
      if (changeVersion) {
        console.log('版本发生变化 开始重新加载');
        window.location.reload();
      }
    }, checkTime);
    window._timer = true;
    // 停止版本检测请求 便于调试
    window.stopVersionCheck = () => {
      window._timer = false;
      clearInterval(timer);
    };
  }
  function getSetCurrentTime() {
    localStorage.setItem('_time', new Date().getTime().toString());
    // 操作页面后 如果之前停止了检测 重新启动
    !window._timer && checkNeedReloadPage();
  }

  function visibilityChange() {
    if (document.visibilityState === 'hidden') {
      window.stopVersionCheck();
      window.stopClickCheck();
    } else {
      checkVersion();
    }
  }
  //   检查是否操作页面
  function checkVersion() {
    // 初始化时间
    getSetCurrentTime();

    if (localStorage.getItem('_time')) {
      // 每分钟检测一次 距离上次操作滚动页面时间 超过10分钟未滚动 则停止检测请求
      let timer = setInterval(() => {
        let _differTime = new Date().getTime() - Number(localStorage.getItem('_time'));
        console.log('_differTime', _differTime);

        if (_differTime > stopDifferTime) {
          window.stopVersionCheck();
        }
      }, clickTime);
      window.stopClickCheck = () => {
        clearInterval(timer);
      };
    }
  }

  function addEventListner() {
    // 检测用户是否点击界面  绑定在document 标签切换也会触发click事件
    document.addEventListener('click', getSetCurrentTime);
    // 如果窗口最小化或者不在当前页签 则不检测 减少请求次数
    document.addEventListener('visibilitychange', visibilityChange);
  }

  // 初始化
  addEventListner();
  checkVersion();
};

2).changeVersion.js 发版修改版本脚本

// 用于发版后刷新页面  
const fs = require('fs');
const path = require('path');
// 由于pub目录不在rootDir ts报错 pub下供轮训查询使用
const filePathPub = path.resolve(__dirname, '../public/assets/config/version.json');
// 读取 设置新版本
const oldVersion = JSON.parse(fs.readFileSync(filePathPub).toString());
console.log(oldVersion, 'change version before');
const newVersion = JSON.stringify({ version: Math.random() });
console.log(newVersion);
fs.writeFileSync(filePathPub, newVersion);
console.log(fs.readFileSync(filePathPub).toString(), 'pub 修改后');

3).packge.json script脚本

    "publish:version":"node scripts/changeVersion.js && git add . && git commit -m \" 版本发布\" && git push ",

4).version.json

{
  "version": 1
}

4. 使用方式

上一篇下一篇

猜你喜欢

热点阅读