前端项目重新打包部署后如何通知用户更新

news2024/11/14 1:32:04

前端项目重新打包部署后如何通知用户更新

  • 前端项目重新打包部署后如何通知用户更新
  • 常用的webSocket解决方案
  • 纯前端方案
    • 路由拦截
    • 多线程
      • main.ts中 创建多线程
      • 多线程逻辑处理

前端项目重新打包部署后如何通知用户更新

前端项目重新打包部署后,由于用户没及时更新页面,导致配置存的还是旧逻辑值,引发了线上问题;所以进行版本更新的通知功能就很有必要上马了。

常用的webSocket解决方案

实现思路

  • webSocket; 大致逻辑思考应该是前端在部署好后向服务器发送一个状态变更通知;服务器接收后主动向前端push;前端通过心跳检测,接收到相关更新时弹出提示,让用户确认更新;

缺点:

  • 需要服务器配合开发;
  • 部署好后主动向服务器发送变更通知,但是CI/CD部署是在远端,对于前端来说完全是黑盒子;当然可以尝试去研究docker相关文档应该是有解决方案; 当然也可以选择手段变更状态,在系统哪加个入口点击后向服务器发送通知;
  • 整个看下来,成本不小;

纯前端方案

效果
具体提示什么可以自定义,这里是简单的demo
在这里插入图片描述

实现思路
每次打包时,都生成一个时间戳,作为系统的伪版本,放到JSON文件中,通过对比文件的响应头Etag判断是否有更新。具体步骤如下:

  • 在public文件夹下加入version.json文件,里面存放两个字段:更新内容、更新时间戳
    前端打包的时候向version.json写入当前时间戳信息
  • 在入口文件main.js中引入检查版本更新的逻辑,有更新则提示更新。

在这里插入图片描述

具体实现起来有两种方案:路由拦截、多线程+定时器
在 vite.config.ts 文件中写入时间戳(或者格式化后的时间);

const { readFile, writeFile } = require('fs');
import moment from 'moment';

function pathResolve(dir: string) {
  return resolve(__dirname, '.', dir);
}

// 获取版本是否更新文件,这里的路径要配合nginx写  Date.new()避免浏览器缓存,强制获取最新的资源
readFile(resolve(__dirname, 'public/version.json'), (err: any, data: any) => {
  if (err) {
    console.log('读取失败');
    return;
  }
  const version = JSON.parse(data);

  version.lastTime = moment(new Date().getTime()).format('YYYY-MM-DD HH:mm:ss');
  writeFile(resolve(__dirname, 'public/version.json'), JSON.stringify(version), (err: any) => {
    if (err) {
      console.log('写入失败');
      return;
    }
  });
});

路由拦截

// !路由拦截
import router from '/@/router';
let lastEtag: string | null = '';
let hasUpdate = false;
const checkUpdate = async () => {
  try {
  	// 获取版本是否更新文件,这里的路径要配合nginx写  Date.new()避免浏览器缓存,强制获取最新的资源
    let response = await fetch(`/baiju/version.json?v=${Date.now()}`, { method: 'head' });
    let etag = response.headers.get('etag');
    if (!lastEtag) lastEtag = etag;
    if (lastEtag && lastEtag !== etag) {
      lastEtag = etag;
      hasUpdate = true;
    }
  } catch (error) {
    console.error('Error checking for updates:', error);
  }
};
// 其实利用浏览器的多线程更好一些,用路由拦截还必须触发路由才可以 worker+setInterval
// 路由拦截
router.beforeEach(async (to, from, next) => {
  // 路由跳转前
  next();
  try {
    await checkUpdate();
    if (hasUpdate) {
      // 提示页面也可以采用worker多线程去处理提示,这里只是演示
      alert('发现新版本,请刷新页面');
      window.location.reload();
    }
  } catch (err) {
    console.log(err);
  }
});

多线程

main.ts中 创建多线程

let worker = new Worker('./worker/checkUpdate.js');
worker.postMessage('checkUpdate');
worker.onmessage = function (event) {
  let data = event.data;
  console.log(data);
  if (data) {
    alert('发现新版本,请刷新页面');
    window.location.reload();
  }
};

多线程逻辑处理

self.onmessage = function (event) {
    let data = event.data;
    // console.log('Worker:', checkUpdate());

    // 30s更新一次
    let timer = setInterval(() => {
        checkUpdate().then((res) => {
            self.postMessage(res)
            if (res) {
                clearInterval(timer);
                self.close();
            }
        })
    }, 30 * 1000);
    // 先执行一次
    checkUpdate().then((res) => {
        self.postMessage(res)
        if (res) {
            clearInterval(timer);
            self.close();
        }
    })
};



let lastEtag = '';
let hasUpdate = false;
const checkUpdate = async () => {

    return new Promise(async (resolve, reject) => {
        // 获取版本是否更新文件,这里的路径要配合nginx写
        let response = await fetch(`/version.json?v=${Date.now()}`, { method: 'head' });
        let etag = response.headers.get('etag');
        if (!lastEtag) lastEtag = etag;
        if (lastEtag && lastEtag !== etag) {
            lastEtag = etag;
            hasUpdate = true;
        }
        resolve(hasUpdate);
    });

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 自定义文字提示框

目录 前言代码演示相关代码文字提示框组件定义组件调用前言 今天开发遇上了一个新的问题,要求写一个带着滑动动画的文字提示框。但是我经常使用的Element-UI组件库只有淡入淡出效果,并且想要修改样式只能全局修改,非常不利于后期的开发。因此,我最终选择直接自定义一个符合…

VAuditDemo文件漏洞

目录 VAuditDemo文件漏洞 一、首页文件包含漏洞 包含图片马 利用伪协议phar:// 构造shell.inc被压缩为shell.zip,然后更改shell.zip 为 shell.jpg上传 二、任意文件读取漏洞 avatar.php updateAvatar.php logCheck.php 任意文件读取漏洞利用 VAuditDemo文件…

Python中使用SQLite数据库的方法4-3

对于数据库的操作,主要包括“增”、“删”、“改”、“查”四种。在Python中使用SQLite数据库的方法4-1_python的sqlite怎么打开-CSDN博客和Python中使用SQLite数据库的方法4-2_python2 sqlite2-CSDN博客中实现增”、“删”和“查”三种操作。 1 带过滤条件的“查”…

C语言基础(七)

1、二维数组: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。 数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。数组的大小在声明时确定,并且之后不能…

在Linux下搭建go环境

下载go go官网:All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上,也可以直接web下载: wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压: tar -x…

Leetcode JAVA刷刷站(57)插入区间

一、题目概述 二、思路方向 为了解决这个问题,我们可以遍历给定的区间列表 intervals,并同时构建一个新的列表来存储最终的合并结果。遍历过程中,我们检查当前区间是否与 newInterval 重叠或相邻,并根据需要进行合并。如果不重叠…

虚拟化平台kvm架构 部署kvm虚拟化平台

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

在HarmonyOS中使用RelativeContainer实现相对布局

在应用开发中,布局设计至关重要,尤其是当我们需要处理复杂的界面时,合理的布局设计不仅能够提升界面的美观性,还能够提高应用的性能。在HarmonyOS中,RelativeContainer是一个强大的布局容器,它允许开发者通…

【Qt】 对象树 与 乱码问题

文章目录 1. 对象树在堆上开辟空间 并管理栈上开辟 与 堆上开辟 的区别 2. 乱码问题的解释编码方式的区分出现乱码的原因查看当前文件的编码方式如何处理 文件与 终端 编码方式 不统一 1. 对象树 在堆上开辟空间 并管理 该代码只进行new(在堆上开辟空间) 而没有delete 正常来说…

ES系列二之CentOS7安装ES head插件

CentOS7安装ES head插件 附:Centos7中安装Node出现Cannot find module ‘…/lib/utils/unsupported.js‘问题 删除原本的的npm连接,重新建一个即可。 1、先cd到该node版本中的bin文件夹下,这里装的是12.16.2版本: cd /usr/local/soft/nod…

C语言 之 字符串函数strncpy、ctrncat、strncmp函数的使用

文章目录 strncpy函数的使用strncat函数的使用strncmp函数的使用 strncpy函数的使用 函数原型: char * strncpy ( char * destination, const char * source, size_t num); strncpy与strcpy的区别是,strncpy可以控制需要拷贝的字符数量 1.能够拷贝num个…

为什么使用HTTPS?

HTTPS现在是所有Web活动的首选协议,因为它是用户保护敏感信息的最安全方式。 HTTPS不仅对请求用户信息的网站至关重要。除了用户直接发送的信息外,攻击者还可以从不安全的连接中跟踪行为和身份数据。 HTTP为网站所有者带来的好处除了数据安全之外&…

【Linux网络编程入门】Day5_socket编程基础

socket 编程基础 Linux 下的网络编程:socket 编程; socket是内核向应用层提供的一套网络编程接口,用户基于 socket 接口可开发自己的网络相关应用程序。 ⚫ socket 简介 ⚫ socket 编程 API 介绍 ⚫ socket 编程实战 socket 简介 ​ 套…

微信小程序引入全局环境变量

有时候一套代码要在多个小程序appId下使用,其中又有一些数据(文字)需要做区分.可以使用下面的方法 把要配置的数据以export default 形式导出 在app.js中,引入project.config.0.js文件,将导出的数据放在globalData中 在页面目录中,即可利用getApp()方法使用全局变量 也可以放数…

LM4863 带立体声耳机功能的双 2.2W音频功率放大器芯片IC

一般概述 LM4863是双桥接的音频功率放大器。当电源电压为5V时,在保证总谐波失真、噪声失真之和小于1.0%的情况下,4Ω负载提供2.2W的输出功率或者可向3Ω负载提供2.5W的输出功率。另外,当驱动立体声耳机时,耳机输入端允许放…

微服务:分布式事务

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接 目录 一、引言 二、Seata 三、部署TC服务 1. 准备数据库表 2. 准备配置文件 3. Docker部署 四、微服务集成Seata 1. 引入依赖 2. 改造配…

json 库的下载与使用

Json 简介Json下载Json::Value 数据对象类Json 序列化/反序列化的介绍Json 的序列化类低版本高版本 Json 的反序列化类低版本高版本 Json序列化操作Json反序列化操作 简介 json 是一种数据交换格式,采用独立于编程语言的文本格式来存储和表示的数据。 Json下载 使…

波导阵列天线单元 学习笔记3 基于空气填充双模馈网的双圆极化膜片天线阵列

摘要: 此通信提出了一种使用空气填充双模馈网的基于膜片极化器的双圆极化天线阵列。一种1分4的圆腔单层覆盖在膜片极化器上来抑制栅瓣。全公司馈网被一个双模传输线所实现,以此在一组馈网内联合了TEM模式(由HW悬架线激励)和TE10模…

Stable Diffusion赋能“黑神话”——助力悟空走进AI奇幻世界

《黑神话:悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏,将于2024年8月20日发售。玩家将扮演一位“天命人”,为了探寻昔日传说的真相,踏上一条充满危险与惊奇的西游之路。 同时,我们还可以借助AI绘…

智能电子班牌源码之终端管理-SAAS本地化及未来之窗行业应用跨平台架构

一智能电子班牌 智能电子班牌为教育行业量身打造,高清显示屏体、可安装各类软件,满足门禁、考勤、信息显示等多种功能。节能防水防误触设计,更适用于校园环境。 二、设备管理 1. 提高效率:管理员无需亲临设备现场,…