前端版本更新提示

前端版本更新提示

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

一、思路:
我们可以通过每次打包构建(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",

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是uniapp中实现app版本更新提示的步骤: 1.在后台添加app版本管理的菜单,用于管理app版本号和下载链接。 2.在前端代码中,使用uni.request()方法向后台请求最新版本号和下载链接。 3.获取当前app版本号,与后台返回的最新版本号进行比较,如果当前版本号小于最新版本号,则提示用户更新。 4.用户点击更新后,使用uni.downloadFile()方法下载最新版本的安装包。 5.下载完成后,使用uni.showModal()方法提示用户是否安装更新。 6.用户点击安装后,使用uni.installApp()方法安装最新版本的应用。 以下是示例代码: ```javascript // 获取当前app版本号 const version = uni.getStorageSync('version') || '1.0.0'; // 请求最新版本号和下载链接 uni.request({ url: 'https://example.com/version', success: (res) => { const latestVersion = res.data.version; const downloadUrl = res.data.downloadUrl; // 比较当前版本号和最新版本号 if (version < latestVersion) { // 提示用户更新 uni.showModal({ title: '发现新版本', content: '是否立即更新?', success: (res) => { if (res.confirm) { // 下载最新版本的安装包 uni.downloadFile({ url: downloadUrl, success: (res) => { // 提示用户安装更新 uni.showModal({ title: '下载完成', content: '是否立即安装?', success: (res) => { if (res.confirm) { // 安装最新版本的应用 uni.installApp({ filePath: res.tempFilePath }); } } }); } }); } } }); } } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值