vue实现项目部署成功之后提示用户刷新页面

vue实现项目部署成功之后提示用户刷新页面

在这里插入图片描述

1. 项目根目录新建 version.js

require("fs").writeFileSync("./public/version.txt", new Date().getTime().toString())	

2. 改写package.json中打包命令

  "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:prod": "node version.js && vue-cli-service build --mode production", // 这样会在public目录下生成version.txt文件,记录当前时间戳"format": "prettier --write \"src/**/*.js\" \"src/**/*.vue\""},

3. 新建src/utils/watchUpdate.js文件

// 引入提示框页面组件
import Modal from "./updateModal.vue";
import Vue from "vue";let time = 0; // 计算轮询次数
let version = ""; // 缓存的版本号
let prodFlag = process.env.NODE_ENV === "production"; // 是否是生产环境
let timer = null; // 轮询定时器
// 轮询用检测方法
let timerFuncion = async () => {// 次数超过的时候 停止轮询 防止用户挂着网页一直轮询if (time >= 5) {// 仅清除计时器clearInterval(timer);return (timer = null);}// fetch 部署后同层级的version文件 并且加上时间戳参数 防止去访问本地硬盘的缓存let res = await fetch(`/version.txt?v=${new Date().getTime().toString()}`).then((res) => {return res.json();}).catch((err) => {console.log(err);return clearTimer(); // 访问失败就完全关闭轮询});// console.log("存储的version:" + version)// console.log("获取到version:" + res)// console.log("比较结果:", res == version)// 首次加载网页的时候 存储第一份versionif (!version) {version = res;console.log("首次加载版本", version);} else if (version != res) {console.log("发现版本更新", version);// 弹出更新提示 发现verison文件更新了 就代表新部署了// 借鉴Element的Message实现挂载vue组件到页面上let MessageConstructor = Vue.extend(Modal);let instance = new MessageConstructor({data: {},});instance.id = new Date().getTime().toString();instance.$mount();document.body.appendChild(instance.$el);return clearTimer();}time++;
};
// 检测鼠标是否移动 移动代表用户活跃中 把轮询比较用的次数一直清0
let moveFunction = () => {// 判断在生产环境下才执行if (prodFlag) {time = 0;// 长时间挂机后 不在轮询的网页 在鼠标活跃于窗口的时候重新检测if (!timer) {timer = setInterval(timerFuncion, 1000);}}
};
// 当被main.js 引用的时候 开始轮询于监听鼠标移动事件
if (prodFlag) timer = setInterval(timerFuncion, 5000);
window.addEventListener("mousemove", moveFunction);
// 完全清除轮询 不轮询 不监听鼠标事件
let clearTimer = () => {clearInterval(timer);window.removeEventListener("mousemove", moveFunction);timer = null;
};

4. 新建 src/utils/updateModal.vue文件

<template><div class="update-modal"><div class="title">系统更新🚀</div><div class="content">系统已更新,请刷新页面(请在刷新前注意保存当前页面数据)。</div><div class="actions"><button @click="handleAfterLeave">忽略</button><button @click="refresh">刷新</button></div></div>
</template><script>
export default {methods: {handleAfterLeave() {this.$destroy(true);this.$el.parentNode.removeChild(this.$el);},refresh() {this.handleAfterLeave();// window.location.replace(window.location.href); //没有刷新缓存location.reload(true); // 刷新了缓存},},
};
</script><style scoped>
.update-modal {user-select: none;position: fixed;//right: 10px;//bottom: 20px;top: 33%;left: 0;right: 0;margin: auto;max-width: 300px;min-width: 250px;width: 50%;background-color: #fff;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);border-radius: 5px;padding: 10px 15px;animation: shakeY 1.5s linear;z-index: 99999;
}
@keyframes shakeY {from,to {transform: translate3d(0, 0, 0);}10%,30%,50%,70%,90% {transform: translate3d(0, -10px, 0);}20%,40%,60%,80% {transform: translate3d(0, 10px, 0);}
}.shakeY {animation-name: shakeY;
}
.update-modal .title {height: 50px;line-height: 50px;font-size: 18px;margin-bottom: 10px;
}
.update-modal .content {text-indent: 2em;font-size: 16px;
}
.update-modal .actions {display: flex;justify-content: flex-end;margin-top: 30px;
}
.update-modal .actions button {display: inline-block;line-height: 1;white-space: nowrap;cursor: pointer;background: #fff;border: 1px solid #dcdfe6;color: #606266;-webkit-appearance: none;text-align: center;box-sizing: border-box;outline: none;margin: 0;transition: 0.1s;font-weight: 500;-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none;padding: 10px 20px;font-size: 14px;border-radius: 4px;margin-left: 10px;
}
.update-modal .actions button:last-child {background-color: #409eff;color: #fff;border-color: #409eff;
}
</style>

5. main.js中导入watchUpdate文件

import "./utils/watchUpdate.js"; // 监听页面更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java集合篇】接上篇博文--为什么在JDK8中HashMap要转成红黑树

为什么在JDK8中HashMap要转成红黑树 ✔️为什么不继续使用链表✔️为什么是红黑树✔️红黑树的性能优势 ✔️ 拓展知识仓✔️为什么是链表长度达到8的时候转✔️为什么不在冲突的时候立刻转✔️关于为什么长度为8的时候转(源码注释解读)✔️为什么长度为6的时候转回来?✔️双向…

leetcode:136只出现一次的数字(详解),又名找到单身狗

期末考试临近&#xff0c;每天复习一点知识&#xff0c;还是可以复习完的&#xff0c;加油 前言 我后来才知道这是力扣上的一道题&#xff0c;我当时写他的时候名字叫找到单身狗&#xff0c;即使那个只出现了一次的数字 题目 136. 只出现一次的数字 给你一个 非空 整数数组…

每日一题——LeetCode1021删除最外层括号1047消除字符串相邻重复字符串

这两道题基本上来说是差不多的&#xff0c;一个匹配并删除字符串中的( ) 一个匹配并删除字符串中相邻重复的元素&#xff0c;其实都是用到栈这种数据结构&#xff0c;通过匹配不同的条件使用入栈出栈操作保存或删除目标元素来实现。 1021.删除最外层括号 var removeOuterParent…

DevOps搭建(十五)-kubernetes部署项目详细步骤

1、k8s简介 k8s官网地址 https://kubernetes.io/zh-cn/docs/home/ 2、安装kuboard 详细步骤可参考官网 https://kuboard.cn/install/install-k8s.html 2.1、环境准备 至少 2 台 2核4G 的服务器。 选择v1.19&#xff0c;因为高版本的已经把docker给舍弃掉了。 https://k…

C语言编译器(C语言编程软件)完全攻略(第二十二部分:Code::Blocks使用教程(使用Code::Blocks编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十二、Code::Blocks使用教程&#xff08;使用Code::Blocks编写C语言程序&#xff09; 前面我们给出了一段完整的 C 语言代码&#xff0c;就是在显示器上输出 “C语言中文网”&#xff0c;如下所示&#xff1a; #include <stdio…

04set注入专题/简单类型/数组/List/Set/Map/空字符串/null/特殊符号

1.1注入外部Bean 在之前使用的案例就是注入外部Bean的方式。 <!-- class属性声明要管理哪个类中的对象 property标签的name是提示set方法名ref标签指明注入的bean的id--><bean id"userServiceBean" class"com.powernode.spring6.service.UserService…

【信息论与编码】习题-单选题

目录 单选题1.下列说法正确的是&#xff08;B&#xff09;2.在信息论中&#xff0c;若用对数底2为&#xff0c;则信息量的单位为&#xff08;C&#xff09;3.率失真函数的下限为&#xff08;A&#xff09;4.给定xi条件下随机事件yj所包含的不确定度和条件自信息量p(yj /xi)。&a…

大数据平台数据治理与建设方案:PPT全文90页,附下载

关键词&#xff1a;数据治理&#xff0c;大数据&#xff0c;数据治理平台&#xff0c;数据治理顶层设计&#xff0c;大数据治理&#xff0c;数据治理建设 一、数据治理建设需求分析 1、业务需求和目标&#xff1a;首先&#xff0c;明确业务需求和目标是非常重要的。数据治理项…

VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。

问题描述&#xff1a;今天打开centos7虚拟机就是直接打不开了报了下面的错误&#xff0c;也没有动任何东西&#xff0c;点确定后&#xff0c;也是依然没有反应 问题原因&#xff1a;可能是虚拟机中的内存满了&#xff0c;需要清理内存 解决方法如下 首先cmd打开终端敲入如下命…

Weblogic安全漫谈(四)

黑名单机制必然会推动两种研究方向的发展&#xff1a;一是挖掘不在黑名单的新组件&#xff0c;是为绕过规则&#xff1b;二是发掘检查的盲区&#xff0c;是为绕过逻辑。 CVE-2020-14756 二次反序列化具有对抗检查逻辑的天生丽质&#xff0c;在CVE-2018-2893中就有利用字节数组…

创新性文生视频模型,南洋理工开源FreeInit

文本领域的ChatGPT&#xff0c;画图领域的Midjourney都展现出了大模型强大的一面&#xff0c;虽然视频领域有Gen-2这样的领导者&#xff0c;但现有的视频扩散模型在生成的效果中仍然存在时间一致性不足和不自然的动态效果。 南洋理工大学S实验室的研究人员发现&#xff0c;扩散…

热图分析(这个热力图代表的是不同描述符与pIC50之间的皮尔逊相关系数。)

案例一&#xff1a; 这个热力图代表的是不同描述符与pIC50之间的皮尔逊相关系数。pIC50是一种表示化合物在生物学测定中抑制效果的负对数IC50值&#xff0c;它通常用于药物发现和评估中&#xff0c;用来量化化合物对特定靶标的抑制能力。 要分析这个热力图&#xff0c;你需要关…

Syntax Error: Error: Cannot find module ‘imagemin-optipng‘

一、背景&#xff1a; 心酸&#xff0c;很难受&#xff1b;本人主要做后端开发&#xff0c;这几天要打包前端项目 遇到了这个报错 Syntax Error: Error: Cannot find module imagemin-optipng 搞了3天时间才打包成功&#xff0c;使用了各种姿势才搞定。期间百度了各种方案都…

Java学习苦旅(十八)——详解Java中的二叉树

本篇博客将详细讲解二叉树 文章目录 树型结构简介基本概念表示形式 二叉树概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的简单创建二叉树的遍历前中后序遍历层序遍历 结尾 树型结构 简介 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09…

【方法】PPT设置密码后如何修改?

PowerPoint是我们日常和工作中经常用到的办公软件&#xff0c;有时候为了保护文件&#xff0c;还会设置密码&#xff0c;那设置密码后又想要修改密码&#xff0c;怎么操作呢&#xff1f;下面来看看PPT常用的两种密码是如何修改的。 1. “打开密码” 想要修改PPT的“打开密码”…

NX二次开发中如何从对象选择控件中获得选中面的TAG值

一、概述 在NX二次开发中所有的对象操作都是通过对对象的TAG值进行操作控制&#xff0c;如何结合BlockUI控件&#xff0c;得到对象的TAG值是十分重要的一步。今天就遇到了这个问题&#xff0c;其实不是不会&#xff0c;而是思维习惯&#xff0c;直接利用对象选择器->Tag()&a…

leetcode:3. 无重复字符的最长子串

一、题目 二、函数原型 int lengthOfLongestSubstring(char* s) 三、思路 本题就是找最长的无重复字符子串。 两层循环&#xff0c;外层循环控制字串的起始位置&#xff0c;内层循环控制字串的长度。 设置一个长度为256且初始为0的hash表&#xff08;因为一共有256个字符…

安卓拍照扫描APP解决方案——基于深度学习的文本方向检测与校正

简介 在OCR&#xff08;光学字符识别&#xff09;系统中&#xff0c;为了提高OCR系统的性能&#xff0c;确保准确识别文本内容。图像预处理是一个关键的组成部分。其中&#xff0c;一个重要的任务是矫正文本方向。例如&#xff0c;在进行文字识别时&#xff0c;不仅需要有效地…

数据结构和算法-插入排序(算法效率 折半优化 顺序表与链表插入排序 代码实现)

文章目录 插入排序算法实现算法效率分析优化-折半插入排序代码实现对链表进行插入排序小结 插入排序 首先49当作第一个已经排好序得元素&#xff0c;将第二个元素与前面得元素对比&#xff0c;发现小于49&#xff0c;于是49移动位置 此时将65与之前元素对比&#xff0c;发现其…

【KingbaseES】实现MySql函数TEXT_EQUAL

TEXT_EQUAL CREATE OR REPLACE FUNCTION text_equal_ci(text_value1 text, text_value2 text) RETURNS boolean AS $$ BEGIN RETURN (lower(text_value1) lower(text_value2)); END; $$ LANGUAGE plpgsql IMMUTABLE;