前端版本更新提示

2023-09-20 18:37:18

前端版本更新提示

前言:最近项目发布比较频繁、导致每次都要主动告知用户/测试 去刷新清除页面缓存、从而防止发了新功能之后、用户因为没有刷新页面/清除缓存,一直使用的还是旧版本。所以就着手写一个检测到发布了新版本就自动提醒用户去刷新页面的功能。

一、思路:
我们可以通过每次打包构建(npm run build)之后给包打一个唯一标识并且挂在到页面中的某个标签上或者存在本地缓存(localStorage/sessionStroage)、从而来确定唯一性,然后通过判断本地的存储的唯一标识是否与当前服务器上的资源记录的唯一标识是否一致。相等那就证明是最新版本不需要做操作、不相等则证明发布了新版本需要提醒用户刷新。

二、实现:
(1). 首先在项目根目(与package.json同一层级)录写一个js脚本:用于每次构建时、创建一个版本文件。(提供给后续通过请求获取、进行版本对比使用)。

我这里使用到时间戳做为唯一标识

// version.js
const fs = require('fs');
const timestamp = new Date().getTime();
fs.writeFile('./public/version.json', `{"version": ${timestamp}}`, err => {
    if (err) {
        console.error(err);
    }
});

(2). 修改vue.config 配置

// 首先需要判断一下当前是否是生产环境(开发环境不需要此功能)
const AppVersion = process.env.NODE_ENV === 'production'
        ? require('./public/version.json')
        : {
              version: 'dev'
          };

// 接着需要在 chainWebpack 函数内加入下面这段代码
// 加入下面代码 是为了可以在 index.html 文件内访问到版本号(AppVersion.version)
module.export = {
	....
	chainWebpack: config => {
		...
		config.plugin('html').tap(args => {
		     args[0].version = AppVersion.version;
		     return args;
		});
		...
   }
}

(3). 修改 public 文件夹内 index.html 入口文件
加入下面这段代码
此处的content 属性值访问到的就是我们的版本号(时间戳)。

<meta id="appVersion" name="version" content="<%= htmlWebpackPlugin.options.version%>" />

(4). 在全局路由 afterEach 钩子函数内进行判断

// store 文件内
actions: {
        checkVersion() {
            return new Promise(resolve => {
                fetch(`${window.location.origin}/version.json?v=${new Date().getTime()}`, {
                    headers: {
                        'Cache-Control': 'no-cache'
                    }
                })
                    .then(res => res.text())
                    .then(res => {
                        resolve(JSON.parse(res).version === Number(document.querySelector('#appVersion').content));
                    });
            });
        }
}

// 路由文件 
router.afterEach(async () => {
    if (process.env.NODE_ENV === 'production') {
        const flag = await store.dispatch('checkVersion');
        if (!flag) {
            MessageBox.confirm('检测到当前版本不是最新版本,刷新后立即使用', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning',
                showCancelButton: false
            }).then(() => {
                window.location.reload();
            });
        }
    }
});

(5). 修改 package.json 文件

// 生产打包配置
"build:prod": "node version.js && vue-cli-service build --mode prod",

三、结尾
到这里就已经实现了这个功能、这个版本也只是最初是版本,还有很大的优化空间、有兴趣可以继续自行优化一下。例如判断版本的地方不一定非得是全局路由钩子、可以进行轮询判断等等、反正具体可以结合自己业务去做调整优化,这里只是提供一个思路。

更多推荐

服务器端应用的安装

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。文章使用到的的工具Python:一种编程语言,只能进行后端数据的处理和管理前端HTML文件,不能用来处理HTTP请求Nginx:web服务

linux下链接

linux下链接用法ln链接格式与介绍linux下链接用法一、链接的使用格式二、链接的介绍一、链接的使用格式链接:格式:ln源文件链接文件硬链接ln-s源文件链接文件软连接硬链接文件占磁盘空间但是删除源文件不会影响硬链接文件软链接文件不占磁盘空间但是删除源文件会影响软链接文件(可以硬链接占用151字节,软链接只占用5字

docker 和k8s 入门

docker和k8s入门本文是云原生的学习记录,可以参考以下文档k8shttps://www.yuque.com/leifengyang/oncloud相关视频教程可参考如下https://www.bilibili.com/video/BV13Q4y1C7hS?p=2&vd_source=0882f549dac5404

DETR:End-to-End Object Detection with Transformers

代码:https://github.com/HuKai97/detr-annotations论文:https://arxiv.org/pdf/2005.12872.pdf参考视频:DETR论文精读【论文精读】_哔哩哔哩_bilibili团队:MetaAI摘要DETR做目标检测任务既不需要proposal,也不需要anc

《动手学深度学习 Pytorch版》 6.2 图像卷积

importtorchfromtorchimportnnfromd2limporttorchasd2l6.2.1互相关计算X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])K=torch.tensor([[0.0,1.0],[2.0,3.0]])此处应

kubeadm部署k8sv1.24使用cri-docker做为CRI

目的测试使用cri-docker做为containerd和docker的中间层垫片。规划IP系统主机名10.0.6.5ubuntu22.04.3jammymaster01.kktb.org10.0.6.6ubuntu22.04.3jammymaster02.kktb.org10.0.6.7ubuntu22.04.3ja

校园闲置物品交易平台的Android设计与实现

目录1引言11.1研究背景及意义11.2研究现状12相关理论及技术介绍32.1相关理论介绍32.2配置系统开发环境33总体设计53.1课题内容与功能设计53.2系统模块设计54软件分析74.1系统概要设计74.1.1系统流程图74.1.2系统整体框架图94.2系统功能设计104.2.1首页管理模块104.2.2个人中心

2560. 打家劫舍 IV

沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋。小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额。给你一个整数数组nums表示每间房屋存放的现金金额。形式上,从左起第i间房屋中放有nums[i]美元

Docker文档阅读笔记-How to Commit Changes to a Docker Image with Examples

介绍在工作中使用Docker镜像和容器,用得最多的就是如何提交修改过的Docker镜像。当提交修改后,就会在原有的镜像上创建一个新的镜像。本博文说明如何提交一个新的Docker镜像。前提①有一个可以直接访问服务器的运行终端;②帐号需要root权限;③已经安装并且配置好了docker手把手教提交修改后的Docker镜像s

【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理

Godot4.1因为我在游戏中发现,越运行游戏变得越来越卡,当你使用Node节点中的print_orphan_nodes()方法打印信息的时候,会出现如下的孤儿节点信息孤儿节点信息是以节点实例ID-StrayNode:节点名称(Type:节点类型)作为格式输出,可以多运行几次查看是否节点实例ID是否是相同的,通常不是随

LeNet-5

目录一、知识点二、代码三、查看卷积层的featuremap1.查看每层信息​2.show_featureMap.py背景:LeNet-5是一个经典的CNN,由YannLeCun在1998年提出,旨在解决手写数字识别问题。一、知识点1.iter()+next()iter():返回迭代器next():使用next()来获取

热文推荐