首页 > 其他分享 >Vue 项目配置自动更新,自动刷新页面

Vue 项目配置自动更新,自动刷新页面

时间:2023-11-17 17:37:51浏览次数:27  
标签:Vue const dayjs value VERSION 自动更新 TIME import 页面

今天用户反馈使用页面的时候,有时候点击没反应,排查下来,是因为发布版本的时候,用户那边没有加载最新的文导致的,然后根据思路,做了这个自动更新的功能


效果预览

http://demo.webwlx.cn/#/update

实现思路

1. 把当前版本的编译时间,通过环境变量的方式保存起来

打开 vite.config.js

import dayjs from "dayjs";
import fs from "fs";
//  获取当前时间戳
const VERSION_TIME = dayjs().format("YYYY-MM-DD HH:mm:ss");
// 把 VERSION_TIME 写入到 public/version.json 文件中
fs.writeFileSync("./public/version.json", JSON.stringify({ VERSION_TIME }));
export default defineConfig({
  // 添加环境变量
  define: {
    "import.meta.env.VERSION_TIME": JSON.stringify(VERSION_TIME),
  },
});

2.封装 update.vue,我这里使用的是 antd 的弹窗,如果其他组件库可自行修改

<template>
  <!-- <a-button @click="startUpdate" type="primary">更新</a-button> -->
  <a-modal
    v-model:visible="updateDialog"
    width="300px"
    :footer="null"
    title="更新提示"
    :closable="false"
    :keyboard="false"
    :maskClosable="false"
  >
    <h1 class="text-xl">发现新版本</h1>
    <p class="mt-2">
      发布时间:<span class="text-red-500">{{ newVersionTime }}</span>
    </p>
    <a-button type="primary" shape="round" class="ml-auto mr-auto mt-10 block"
      >{{ count }} 秒后 更新</a-button
    >
  </a-modal>
</template>
<script setup>
  import axios from 'axios';
  import { onMounted, ref } from 'vue';
  import dayjs from 'dayjs';
  const interCheck = ref(null);
  const count = ref(5);
  const newVersionTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
  const updateDialog = ref(false);
  function startCheck() {
  	// 每 3s 检查一次更新
  	if (!interCheck.value) {
  		interCheck.value = setInterval(() => {
  			checkVersion();
  		}, 5000);
  	}
  }
  function endCheck() {
  	clearInterval(interCheck.value);
  	interCheck.value = null;
  }
  async function checkVersion() {
  	//  axios.defaults.headers 不加载缓存
  	const publicVersion = await axios.get(location.origin + '/version.json?t=' + Date.now(), {
  		headers: {
  			'Cache-Control': 'no-cache',
  			Pragma: 'no-cache',
  			Expires: '-1',
  		},
  	});
  	const NEW_VERSION_TIME = publicVersion.data.VERSION_TIME;
  	const VERSION_TIME = import.meta.env.VERSION_TIME;
  	if (NEW_VERSION_TIME && new Date(NEW_VERSION_TIME) > new Date(VERSION_TIME)) {
  		endCheck();
  		newVersionTime.value = NEW_VERSION_TIME;
  		startUpdate();
  	}
  }

  async function startUpdate() {
  	// 开始自动更新倒计时
  	count.value = 5;
  	updateDialog.value = true;
  	// 倒计时
  	const timer = setInterval(() => {
  		count.value--;
  		if (count.value === 1) {
  			clearInterval(timer);
  			// 强制刷新页面
  			location.reload(true);
  		}
  	}, 1000);
  }

  onMounted(() => {
  	startCheck();
  });
</script>

3.在app.vue引入

<template>
  <Update></Update>
  <div id="app">
    <router-view></router-view>
  </div>
</template>
<script setup>
  import Update from "./components/update.vue";
</script>

标签:Vue,const,dayjs,value,VERSION,自动更新,TIME,import,页面
From: https://www.cnblogs.com/wp-leonard/p/17839275.html

相关文章

  • 前端页面的懒加载和预加载
    前言懒加载也就是延迟加载。当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,从而减轻服务器压力,避免用户等待时间过长(一般在网站图片很多......
  • Vue 该如何实现组件缓存?
    在面向组件化开发中,我们会把整个项目拆分为很多业务组件,然后按照合理的方式组织起来,那么自然会存在组件之前切换的问题,vue中有个动态组件的概念,它能够帮助开发者更好的实现组件之间的切换。但是在面对需求频繁的变化,切换组件时,动态组件在切换的过程中,组件的实例都是重新创建的,而......
  • Vue-打印组件
    组件代码:<el-buttonv-print="{id:'print-content'}"icon="el-icon-printer">打印</el-button>//插件vue-print-nb示例: ......
  • vue-富文本/自定义上传图片
    1、下载组件npminstallvue-quill-editor–D2、在需要的组件内引入富文本import{quillEditor}from'vue-quill-editor'import'quill/dist/quill.core.css'import'quill/dist/quill.snow.css'import'quill/dist/quill.bubble.css'com......
  • 实例解析html页面语言
    清晰的了解html代码表达的意思才能准确的通过代码展示出开发者的设计思路。这里总结了一些常见的的页面代码,逐行解释其表达的意思,以备能随时翻阅,常备常练。示例资料<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=......
  • Vue3 模板引用 ref 的实现原理
    什么是模板引用ref?有时候可以使用 ref attribute为子组件或HTML元素指定引用ID。<template><inputref="input"/></template><script>import{defineComponent,ref}from"vue";exportdefaultdefineComponent({setup(){......
  • Vue3 的 effect、 watch、watchEffect 的实现原理
    所谓watch,就是观测一个响应式数据或者监测一个副作用函数里面的响应式数据,当数据发生变化的时候通知并执行相应的回调函数。Vue3最新的watch实现是通过最底层的响应式类ReactiveEffect的实例化一个reactiveeffect对象来实现的。它的创建过程跟effectAPI的实现类似,所......
  • Vue插槽(Slot)的实现原理
    实现原理(简单文字)slot又名插槽,是Vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出口。插槽slot是子组件的一个模板标签元素,而这一个标签元素是否显示,以及怎么显示是由父组件决定的。slot又分三类,默认插槽,具名插槽和作用域插槽实现原理:当子组件vm......
  • vuex与redux比较
    相同点state共享数据流程一致:定义全局state,触发,修改state原理相似,通过全局注入store。不同点vuex定义了state、getter、mutation、action四个对象;redux定义了state、reducer、action。vuex触发方式有两种commit同步和dispatch异步;redux同步和异步都使用disp......
  • 手写基础vuex
    实现一个插件:声明Store类,挂载$storeStore具体实现:创建响应式的state,保存mutations、actions和getters实现commit根据用户传入type执行对应mutation实现dispatch根据用户传入type执行对应action,同时传递上下文实现getters,按照getters定义对state做派......