纯前端umi项目部署页面自动刷新

背景

在用户正在访问单页面网站的情况下,突然发布了新的版本。而由于单页面中路由特性,或浏览器缓存的原因,并不会随着路由变化而重新加载前端资源,此时用户浏览器所运行的脚本,并非是最新的代码,从而可能引发一些问题。因此所引发了思考。如何在后端部署之后,提醒用户系统的版本更新,并且引导用户刷新页面,获取最新资源。

纯前端实现思路

可通过前端接收最新的版本信息,并且与本地的登陆时所保存的版本信息来进行比较,可使用轮训、websocket等技术来完成。

唯一hash值

  1. hash文件的生成
    创建hash.js文件,生成一个唯一值用于标识当前版本
js 复制代码
const crypto = require('crypto');
const fs = require('fs');
const data = crypto.randomBytes(16).toString('hex');
const hash = crypto.createHash('sha256').update(data).digest('hex');
fs.writeFile('./build/hash.txt', hash, (err) => {
  if (err) throw err;
});

修改package.json下的build命令

json 复制代码
 "build": "umi run build && node ./hash.js",

运行build命令之后就会生成hash.txt文件

  1. 判断时机

如果发版是在用户不常用的时间段,可以在浏览器visibility切换的回调 + 路由切换拦截时,这2个时机判断版本号,基本上完全够用了

jsx 复制代码
//app.jsx
import request from 'umi-request';

const getHash = () => {
  return request(`/hash.txt`);
};
//umi里getInitialState函数用于项目初始化时获取用户信息,这个时机可以添加逻辑进行判断
export async function getInitialState() {
  const data = await getHash();
    document.addEventListener('visibilitychange', async () => {
      console.log(document.visibilityState);
      if (document.visibilityState === 'visible') {
        const newdata = await getHash();
        if (data !== newdata) {
          window.location.reload();
        }
      } 
    });

    return {
      collapsed: false,
      hash: data,
      userInfo: currentUserResult?.body || {},
    };
}
export const layout = ({ location, initialState, setInitialState }) => {
  return {
    onPageChange: async (location) => {
      const data = await getHash();
      if (data !== initialState.hash) {
        window.location.reload();
      }

    },
    onCollapse: (arg) => {
      setInitialState({
        ...initialState,
        collapsed: arg,
      });
    },
    ...initialState?.settings,
  };
};

有不同方案的大佬请在评论区多多指教!

相关推荐
子兮曰17 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰17 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万17 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝17 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋17 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁18 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王952720 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大20 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师20 小时前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学21 小时前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端