纯前端解决--发版后导致浏览器页面缓存出现问题

问题背景
最近公司项目使用了后端返回路由,动态加载,所以代码中都是实用import来加载页面路由,这也导致了测试环境发布新版本后,页面缓存访问的还是原有的页面路径,所以页面会报错,如下:
在这里插入图片描述
试了很多种方法,如在.html页面的meta中添加cache-control;nginx中配置缓存策略;在文件打包中加上时间戳;。。。都没有很好的作用,最终选择前端本地版本号。
思路如下,在路由守卫beforEach处进行判断当前本地所存储版本号与服务器上文件版本号是否一致,如果不一致,则执行location.reload(),具体操作:

	1.在public/static中添加version.json文件
{
    "version": "1.0.1"
}
	2.在src中创建一个version文件夹,并创建versionUpdate.js文件
import axios from 'axios'
import {Message} from "@arco-design/web-vue";
const isNewVersion = () => {
    let url = `//${window.location.host}/static/version.json?t=${new Date().getTime()}`;
    axios.get(url).then(res => {
        if (res.status === 200) {
            console.log(res.data.version, 'version')
            let version = res.data.version,
                localVueVersion = localStorage.getItem('version');
            if (localVueVersion && localVueVersion != version) {
                localStorage.setItem('version', version);
                Message.info('获取有新版本,即将刷新页面获取最新版本')
                window.location.reload();
                return;
            } else {
                localStorage.setItem('version', version);
            }
        }
    });
}

export default {
    isNewVersion
}

3.在全局路由拦截中,只要每次版本号不同就重新加载页面清除浏览器缓存
router.beforeEach(async (to, from, next) => {
  versionTood.isNewVersion()
  // 其他逻辑
})

本身自己有这样一个思路,但是就是想不起来如何接口化获取本地文件数据,感谢大佬@我总是词不达意

--------------------------------------------------------------------------追 更 一 下---------------------------------------------------------------------------------
本来大佬是实现了在打包中实现版本号自增的,但是按照大佬的写法打包出现问题,因为着急上线所以选择手动更改,今天有时间又来琢磨了一下。

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "node ./src/addVersion.js && vue-cli-service build",
    "test": "node ./src/addVersion.js && vue-cli-service build --mode test",
},

原本是在package.json中先执行addVersion.js脚本,但是在我的项目中不适用,后来发现可以在vite.config.ts中进行配置

addVersion.js文件:

const fs = require('fs');

//返回version的json数据
async function getVersionJson() {
    let data = fs.readFileSync('./public/static/version.json') //fs读取文件
    return JSON.parse(data) //转换为json对象
}

export default async function addVersion() {
    let versionData = await getVersionJson() //获取version的json
    let arr = versionData.version.split('.') //切割后的版本号数组
    arr[2] = parseInt(arr[2]) + 1
    versionData.version = arr.join('.') //转换为以"."分割的字符串
    //用versionData覆盖version.json内容
    try {
        // 将数据转换为 JSON 字符串并写入文件
        fs.writeFileSync('./public/static/version.json', JSON.stringify(versionData, null, '\t'));
        console.log('version has been successfully updated.');
    } catch (err) {
        console.error('Error writing to version:', err);
    }
}

vite.config.ts文件:

import addVersion from './src/version/addVersion'
export default defineConfig({command, mode}) => {
	return {
		plugins: [addVersion()]
	}
}

这样就不用每次手动改版本号啦!
在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值