当前位置: 首页 > article >正文

【VUE】14、VUE项目如何自动识别服务端是否发布了新版本

今天介绍的是通过轮询的方式去检测服务端是否发布了新版本,从而提醒客户刷新页面,提升用户体验。

1、实现思路

  1. 使用轮询的方式获取项目中 index.html 文件。
  2. 查询文件引入的 JS 文件是否有更新( Vue 每次打包后会生成新的引入文件,如 login.513ef76d.js)。
  3. 对比新旧文件,如果有不同,则说明服务器中的项目文件已经更新,需要提示用户刷新页面以获取最新的项目资源。

2、实现步骤

在 src 目录下新建一个 auto-update.js 文件,内容为:

let lastSrc;

// 匹配 Script 标签中的 src
const scriptReg = /\<script.*src=["'](?<src>[^"']+)/gm;

/**
 * 提取服务器的 Script 标签中的 src
 */
async function extractNewScripts() {
    const html = await fetch('/?_timestamp=' + Date.now()).then(resp => {
        return resp.text()
    })
    scriptReg.lastIndex = 0
    let result = []
    let match;
    while ((match = scriptReg.exec(html))) {
        result.push(match.groups.src)
    }
    return result
}

/**
 * 判断是否有新版本
 */
async function hasNewVersion() {
    const newScripts = await extractNewScripts()
    if (!lastSrc) {
        lastSrc = newScripts
        return false
    }
    let result = false
    if (lastSrc.length !== newScripts.length) {
        result = true
    }
    for (let i = 0; i < lastSrc.length; i++) {
        if (lastSrc[i] !== newScripts[i]) {
            result = true
            break
        }
    }
    lastSrc = newScripts
    return result
}

/**
 * 自动更新定时器
 */
function autoRefresh() {
    setTimeout(async () => {
        const needUpdate = await hasNewVersion()
        if (needUpdate) {
            const result = confirm('项目发布新版本,立即更新?')
            if (result) {
                location.reload()
            }
        }
        autoRefresh()
    }, 5000)
}

autoRefresh()

在 main.js 文件中引入 auto-update.js 文件即可

import './auto-update'

3、测试

将项目打包发布,浏览器访问项目

在这里插入图片描述

改变项目中的页面内容,重新打包发布
在这里插入图片描述
点击 “确定” 之后,页面就会自动刷新了

如您在阅读中发现不足,欢迎留言!!!


http://www.kler.cn/a/445037.html

相关文章:

  • 使用Python编辑JPEG文件EXIF字段中的缩略图
  • 32单片机串口数据接收、空闲IDLE中断详解
  • Redis篇-19--运维篇1-主从复制(主从复制,读写分离,配置实现,实战案例)
  • WebGL入门到进阶教程 - 系统学习Web3D技术
  • [创业之路-199]:《华为战略管理法-DSTE实战体系》- 3 - 价值转移理论与利润区理论
  • Git安装及基础学习
  • Redis 突然变慢了如何排查并解决?
  • Spring Boot实现OAuth2.0登录实战
  • Flutter组件————BottomNavigationBar
  • vue2 - Day03 - (生命周期、组件、组件通信)
  • scala图书馆系统
  • ChatGPT生成接口测试用例(二)
  • mybatisPlus使用步骤详解
  • 安卓环境配置及打开新项目教程,2024年12月20日最新版
  • uniapp Native.js 调用安卓arr原生service
  • 《军工记忆》第二季播出,科技创新铸国之重器
  • mybatis逆向工程插件MyBatisX使用介绍
  • 裸金属服务器和传统服务器的区别
  • XLSTM+informer时间序列预测模型
  • 深入理解 Linux wc 命令
  • 【开源免费】基于Vue和SpringBoot的在线宠物用品交易网站(附论文)
  • WebGL入门到进阶教程 - 系统学习Web3D技术
  • 依托 SSM 与 Vue 的电脑测评系统:展现电脑真实实力
  • Unity Shader学习日记 part 2 线性代数--矩阵
  • 搭建 Elasticsearch 集群:完整教程
  • 分布式链路追踪简介-01-dapper 论文思想介绍