首页 > 其他分享 >前端重新部署如何通知用户刷新网页?

前端重新部署如何通知用户刷新网页?

时间:2023-01-31 21:45:23浏览次数:59  
标签:网页 package await 重新部署 json version 刷新 import level

场景:

有时候上完线,用户还停留在老的页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。

设置一个全局路由,在路由跳转的时候获取当前版本号和旧版本号进行对比,如果不一样,就通知客户进行刷新页面

// version.js,与package.json同级
import router from '@/router'
import axios from 'axios'
// import store from '@/store'

router.beforeEach(async (to, from, next) => {
  console.log('路由跳转')
  try {
    // 实时获取的版本号

    const realVersion = await getVersion()

    // version可以存在本地,也可以存在store中
    const localVersion = localStorage.getItem('version') || realVersion
    if (localVersion !== realVersion) {
      console.log('远端代码有更新', {
        localVersion,
        realVersion
      })
      // 通知客户刷新操作
    }
    next()
  } catch (e) {
    console.log(e)
  }
})

export const getVersion = () => {
  return new Promise((resolve, reject) => {
    axios.get('./package.json', {
      headers: {
        'Cache-Control': 'no-cache'
      },
      baseURL: ''
    }).then(res => {
      resolve(res.data.version)
    }, e => {
      reject(e)
    })
  })
}

在main中引入version.js

// main
...
import {
  getVersion
} from '../plugin/version'

// 获取当前版本号
const version = await getVersion()
// 存放在本地或者store中
localStorage.setItem('version', version)

新增一个addVersion.js文件,用于每次构建更改版本号,与package.json同级

// 如果是vite打包,需要这两行代码
import { createRequire } from 'module';
const require = createRequire(import.meta.url);

//npm run build打包前执行此段代码
let fs = require('fs');

//返回package的json数据
function getPackageJson() {
  let data = fs.readFileSync('./package.json'); //fs读取文件
  return JSON.parse(data); //转换为json对象
}

let packageData = getPackageJson(); //获取package的json
let arr = packageData.version.split('.'); //切割后的版本号数组
arr[2] = parseInt(arr[2]) + 1;
packageData.version = arr.join('.'); //转换为以"."分割的字符串
//用packageData覆盖package.json内容
fs.writeFile(
  './package.json',
  JSON.stringify(packageData, null, "\t"),
  (err) => {}
);

执行build命令时增加addVersion文件的执行参数

node ./addVersion.js

 

tips:另外,如果是vite打包,需要安装vite-plugin-top-level-await依赖

npm install vite-plugin-top-level-await -D

在vite.config.js配置此插件

import topLevelAwait from 'vite-plugin-top-level-await'

export default defineConfig({
  plugins: [
    topLevelAwait({
      // The export name of top-level await promise for each chunk module
      promiseExportName: '__tla',
      // The function to generate import names of top-level await promise in each chunk module
      promiseImportName: i => `__tla_${i}`
    })
  ]
});

这么做的原因是「ECMAScript」提案 Top-level await 由 Myles Borins 提出,它可以让你在模块的最高层中使用 await 操作符。在这之前,你只能通过在 async 函数或 async generators 中使用 await 操作符。Top-level await 是个新特性,打包不支持此特性

缺点:如果一直不切换路由,将无法及时通知到客户进行页面刷新

另外也有轮询的做法,可以参考:【链接

 

标签:网页,package,await,重新部署,json,version,刷新,import,level
From: https://www.cnblogs.com/kewenxin/p/17080868.html

相关文章

  • nginx部署vue history模式项目页面刷新报404问题
    nginx部署vuehistory模式项目页面刷新报404问题解决方案:在nginx配置种添加以下代码:try_files$uri$uri//index.html示例:location/{rootdist;......
  • 网页数据实时更新的三种简单方法
    一、页面自动刷新<metahttp-equiv="refresh"content="20">其中20指每隔20秒刷新一次页面.二、页面自动跳转:<metahttp-equiv="refresh"content="20;url=http://www.hackh......
  • 《中国地质图集》网页版
    公众号【地质掘墓人】曾经发布了《中国地质图集》电子版,其中的图片内容很完整,但网页却无法正常使用,故我基于原文件中的图文,参考其网页设计效果,重新制作了一版网页程序。1......
  • 案例黑马旅游网页
    案例黑马旅游网页<!doctypehtml><htmllang="zh-CN"><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metanam......
  • 网页版红警的资源加载的实现
    由于红警的资源比较大,红警2加上红警尤里复仇两个版本,还有二十多首高清无损的背景音乐,有一个G左右的大小,当用户打开网页玩耍的时候,总不能每次都下载一个G的资源吧。所以需要......
  • 网页红警,如何将存入本地的音频转成可播放状态
    之前资源加载,我实现了将资源以ArrayBuffer的形式保存到的本地Indexeddb中,里面包含很多的音频文件,那么,如何将音频文件拿出以后,直接播放呢?有两个方法可以实现:URL.createObject......
  • 微信小程序-关于下拉刷新的设置
    局部设置页面刷新:{"usingComponents":{},"enablePullDownRefresh":true}自己需要哪个页面支持下拉刷新,就在其json文件中加上。 全局设置页面刷新:在全局的ap......
  • BUUCTF-misc-刷新过的图片
    刷新过的图片-F5隐写kali下载F5-steganographygitclonehttps://github.com/matthewgao/F5-steganography进入F5-steganography目录,解压文件cdF5-steganography......
  • Obsidian + Cubox 实现网页剪藏本地保存
    问题/需求:网页剪藏内容保存到本地/icloud云盘。保存文件格式便于迁移,可跨应用。网页中的图片能够快捷的保存到本地,避免图片链接失效。如何解决:环境:macos12.1应用......
  • 小程序嵌套H5网页,微信支付流程
    问题:小程序嵌套h5无法使用微信jsapi和公众号相关的支付,官方明确表示h5无法调起微信支付解决:微信小程序嵌套h5,h5无法唤起微信支付h5发起微信支付时,先跳转至小......