前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Vue技巧之】生产部署自动更新提示

【Vue技巧之】生产部署自动更新提示

作者头像
老张的哲学
发布2024-03-12 18:23:22
6670
发布2024-03-12 18:23:22
举报
文章被收录于专栏:NetCore 从壹开始

先说下故事背景,我们平时在部署Vue等前端项目的时候,因为客户端浏览器缓存原则,经常会出现修改后,而用户不能第一时间更新的情况,只能通过禁用缓存,或者配置nginx,或者干脆联系用户,让用户刷新页面等方案,我都尝试过,都不是很舒服,今天又学到了一个技巧,分享给大家,个人感觉还是可以的,是一个思路,可以往这个方向思考。

Part 1

说下思路和效果

思路其实很简单,就是我们可以在build后的index.html页面上,设置一个参数,也可以直接使用js文件的文件指纹参数,这里的文件指纹,其实就是编译后的文件的一个后缀,下次build的指纹肯定和上次的不一样:

代码语言:javascript
复制
<link href=/js/chunk-23e41f57.1c019000.js rel=prefetch>

我今天用一个参数来举例,比如说一个version=xx,然后写一个定时器,每隔几秒或者这个参数,只要发生了变化,就提示用户刷新页面,大概效果是这样的:

大概思路就是这样,只要build完成,手动修改或者自动获取下index.html的某个参数的值是否变化,来给客户端用户提醒,来获取刷新机制。

Part 2

设计具体的代码逻辑

有了思路,下边就比较简单了,这里用到了一个刷新的封装js方法即可,内容很简单,直接上代码,应该只要有前端经验的都能看懂。

首先在index.html配置下参数:

然后封装checkVersion方法,来处理具体逻辑:

代码语言:javascript
复制
// checkVersion.js
function fetchVersion() {
    // 使用 fetch API 来获取 index.html 文件
    return fetch('/')
      .then(response => response.text())
      .then(html => {
        // 使用正则表达式来提取版本号
        const versionMatch = html.match(/var version = (\d+);/);
        if (versionMatch && versionMatch.length > 1) {
          return versionMatch[1]; // 返回版本号
        }
        throw new Error('不能找到版本号。');
      });
  }
  
  function checkVersion() {
    let currentVersion; // 当前页面的版本号
  
    // 初始化时获取一次版本号
    fetchVersion().then(version => {
      currentVersion = version;
    });
  
    // 创建定时器,每10秒检查一次
    setInterval(() => {
      fetchVersion().then(newVersion => {
        // 检查版本号是否有变化
        if (newVersion !== currentVersion) {
          // 如果版本号变化,提示用户,并更新当前版本号
          if (confirm('检测到新版本,是否重新加载页面?如果信息还未提交完,请点击取消,继续填写.')) {
            window.location.reload(); // 用户确认后重新加载页面
          }
          currentVersion = newVersion; // 更新当前版本号,避免重复提示
        }
      }).catch(error => console.error('获取版本号失败:', error));
    }, 10000); // 设置时间间隔为 10000 毫秒(10 秒)
  }
  
  export default checkVersion;

接下来,只需要在主入口文件main.js引用即可:

这样就完成了,每次build完成后参数就自动带过去了,这里可以用date()时间戳也行,反正自己定义自己的变化发版规则

这样每次部署完后,客户端用户那边就会收到通知,自动刷新了。也算是一种方案了,而且这种自动刷新是前端本地的,也不占带宽和浏览啥的,自己根据情况定义刷新周期就行,好啦,感兴趣的可以试试,如果你也有更好的生产环境部署方案,欢迎一起讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NetCore 从壹开始 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档