前端部署发布项目后,如何通知用户刷新页面、清除缓存

这篇具有很好参考价值的文章主要介绍了前端部署发布项目后,如何通知用户刷新页面、清除缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下只是一些思路,有更好的实现方式可以留言一起交流学习

方式一:纯前端
在每次发布前端时,使用webpack构建命令生成一个json文件,json中写个随机生成的一个字符串(比如时间戳),每次打包程序都会自动更新这个json文件。
在项目中,通过定时任务或者在切换页面路由时,请求json文件。使用本地保存的上一次生成的字符串和json文件中的字符串进行比较,如果两个字符串不一样,则说明前端重新部署了,提醒用户进行更新或进行强制刷新的操作。

方式二:前后端配合
在每个请求的header里面加上发版版本号,和保留在客户端的上一次版本号进行比较,如果不一致则强制刷新,刷新后保存当前版本号。(或者单独写一个返回版本号的接口)

下面重点说一下纯前端如何做:

①webpack 4构建 生成一个json文件,在项目目录下新建plugin文件夹,新建version-webpack-plugin.js如下

/** 自定义的插件: 生成版本号json文件 */
const fs = require("fs");
class VersionPlugin {
  apply(compiler) {
    // emit 是异步 hook,使用 tapAsync 触及它,还可以使用 tapPromise/tap(同步)
    compiler.hooks.emit.tap("Version Plugin", (compilation) => {
      const outputPath = compiler.path || compilation.options.output.path;
      const versionFile = outputPath + "/version.json";
      const timestamp = Date.now(); // 时间戳作为版本号
      const content = `{"version": "${timestamp}"}`;
 
      /** 如果路径存在则返回 true,否则返回 false。 */
      if (!fs.existsSync(outputPath)) {
        // 同步地创建目录。 返回 undefined 或创建的第一个目录路径(如果 recursive 为 true)。 这是 fs.mkdir() 的同步版本。
        fs.mkdirSync(outputPath, { recursive: true }); 
      }
      // 生成json文件
      fs.writeFileSync(versionFile, content, {
        encoding: "utf8",
        flag: "w",
      });
    });
  }
}
 
module.exports = { VersionPlugin };

webpack3低版本的构建方式

/** 自定义的插件: 生成版本号json文件 */
const fs = require('fs')
class VersionPlugin {
  apply (compiler) {
    compiler.plugin('done', function () {
      // 复制文件的逻辑,此时文件已经编译完成
      const outputPath = compiler.outputPath
      const versionFile = outputPath + '/version.json'
      const timestamp = Date.now() // 时间戳作为版本号
      const content = `{"version": "${timestamp}"}`

      /** 如果路径存在则返回 true,否则返回 false。 */
      if (!fs.existsSync(outputPath)) {
        // 同步地创建目录。 返回 undefined 或创建的第一个目录路径(如果 recursive 为 true)。 这是 fs.mkdir() 的同步版本。
        fs.mkdirSync(outputPath, { recursive: true })
      }
      // 生成json文件
      fs.writeFileSync(versionFile, content, {
        encoding: 'utf8',
        flag: 'w'
      })
    })
  }
}

module.exports = { VersionPlugin }

②在vue.config.js中使用这个 plugin

const { VersionPlugin } = require('./plugin/version-webpack-plugin.js');

前端部署发布项目后,如何通知用户刷新页面、清除缓存

③在每次执行webpack构建命令,都会在dist目录下生成一个version.json文件,里面有一个字段叫 version,值是构建时的时间戳,每次构建都会生成一个新的时间戳。

前端部署发布项目后,如何通知用户刷新页面、清除缓存

前端部署发布项目后,如何通知用户刷新页面、清除缓存

④发起ajax请求,请求version.json文件获取version时间戳,和本地保存的上一次的时间戳做比较,如果不一样,则进行对应的操作。/plm/version.json,plm是我项目的前缀,改成你自己的项目地址,能请求到 version.json文件就行。

import axios from 'axios'
import {MessageBox} from 'element-ui'
export function reloadVersion() {
    axios.get(window.location.origin + '/plm/version.json?v=' + Date.now()).then(rsp => {
        let localVersion = localStorage.getItem('localVersion')
        let onlineVersion = rsp.data.version
        if(onlineVersion){
            if(localVersion!==onlineVersion){
                // 弹框提示更新
                MessageBox.confirm('有版本更新,是否刷新确保获取最新数据?', '版本更新', {
                    confirmButtonText: '更新',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    // 发版版本号和本地版本号不一致,保存最新的版本号到本地,并刷新页面获取最新的页面
                    localStorage.setItem('localVersion',onlineVersion)
                    window.location.reload();
                })
            }
        }
    })
}
  

⑤请求发起的时机,可以使用定时器或者在切换页面的时候进行校验版本。根据自己的实际情况选择合适的调用时机。 

(二)通过监听网页端的报错,进行相应的处理。

如果是覆盖式的更新,有可能发版前就已经删除了上一个版本的dist文件,会造成缓存的页面依然调用已经被删除的文件,所以会白屏报错。报错就有可能不会执行到上面发起请求获取版本号的操作。所以如果监听到如下的几种报错,可以进行刷新页面的操作,

前端部署发布项目后,如何通知用户刷新页面、清除缓存

在index.html根目录文件中加入如下代码。为了防止页面一直刷新,所以加了一个超过次数就不再继续刷新的逻辑文章来源地址https://www.toymoban.com/news/detail-452306.html

  <script>
    // 错误监听
    window.addEventListener('error', (e) => {
      console.log('globalError'+e)
      // 类似manifest.js和app.js等静态资源报错
      if(e.target.outerHTML.indexOf('js/manifest.') != -1 || e.target.outerHTML.indexOf('js/app.') != -1|| e.target.outerHTML.indexOf('js/chunk-') != -1){
        var errorTime = sessionStorage.getItem('mainAppErrorTime')
        if(errorTime&&errorTime>0){
          errorTime++
        } else{
          errorTime = 1
        }
        var timer = setTimeout(function() {
          // 错误次数存在缓存,刷新超过3次不会继续刷新。退出页面重进后,次数重置
          sessionStorage.setItem('mainAppErrorTime', errorTime)
          window.location.reload()
        }, 1000);
        if(errorTime&&errorTime>=3){
          clearTimeout(timer) // 清空定时器
        }
      }
    }, true);
  </script>

到了这里,关于前端部署发布项目后,如何通知用户刷新页面、清除缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 前端项目部署后,如何提示用户版本更新

    前端项目部署后,如何提示用户版本更新

    项目部署上线后,特别是网页项目,提示正在操作系统的用户去更新版本非常 important 。一般我们都会用“刷新大法”来清理缓存,但是对于正在操作网页的用户,不造系统更新了,请求的还是老版本的资源。 为了确保用户能够及时获得最新的功能和修复的 bug,我们需要通知

    2024年04月11日
    浏览(10)
  • 前端部署nginx刷新后404,解决Nginx刷新页面后404的问题

    前端部署nginx刷新后404,解决Nginx刷新页面后404的问题

    使用Nginx部署后,登录页面刷新一下就出来404,如下图: 刷新以后 ,页面变成404 Not Found 查看了一下nginx配置,出现问题的配置是这样的: 修改后的配置是这样的 添加了 try_files $uri $uri/ /index.html, 然后重启一下nginx问题就解决了。 解释: try_files 表示检查文件是否存在,返回

    2024年02月13日
    浏览(20)
  • Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

    Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

            在前端项目开发中,实现用户的登陆注册功能时常常会有一个问题,那就是我们设置的登录状态,在浏览器页面刷新后就消失了,这其实只是因为我们没有保存用户状态。 这里小马演示使用的是 localStorage   +   vuex 方法(其他诸如 sessionStorage、cookie 等用法相同,

    2023年04月08日
    浏览(15)
  • nginx 部署vue项目,页面白屏或者页面刷新出现404问题

    将vue项目打包部署到nginx上面运行 问题一: 运行时页面白屏。 问题二: 页面可以正常显示,当刷新页面的时候页面报404 错误。 页面白屏分析: 我们可以先查看一下nginx下的 logs/error.log 日志文件,确定我的问题是因为项目打包时候路劲配置问题。 页面404分析 :我们在将

    2024年02月15日
    浏览(12)
  • Vue项目nginx服务器部署刷新页面404错误

    最近想自己做点小项目练手,前端用的是vue框架,用nginx当做服务器来部署。但是当部署完成后,遇到了刷新页面和打开新页面报404错误的问题 问题就像上面描述的一样,刷新页面和打开新页面都是报404错误。 先说最终解决办法,在nginx的配置文件的location中改一下设置方式

    2024年02月17日
    浏览(15)
  • 在浏览器的舞台上演:前端如何挑战页面刷新的极限

    在无尽的数字海洋中,用户和浏览器之间建立了一座看不见的桥梁,连接了网页的现实与虚拟。而在这座桥上,JavaScript像是一位魔法师,可以通过各种巧妙的技巧,让页面焕然一新,展示出绚丽的景象。 这个博客将带你走进前端的奇妙世界,揭示页面刷新的幕后秘密。从简

    2024年02月04日
    浏览(9)
  • 使用nginx方向代理部署Vue项目刷新页面404的问题解决

    部署出现的问题为:由于项目中使用的vue router 项目直接使用node环境部署项目,在同一个路由如: 192.168.1.30:/home刷新浏览器正常 nginx部署刷新不出现404 /nginx not found 如何解决? 以下是我的想法:似乎是nginx代理使其直接访问文件,而没有使项目的路由生效从而正确加载资源 这

    2024年02月07日
    浏览(17)
  • nginx 部署vue项目,路由模式为history时,页面刷新404问题

    nginx 部署vue项目,路由模式为history时,页面刷新404问题

    nginx部署vue项目,文件放在html下的dist文件夹中 nginx.conf 文件中,server 里配置文件的位置、请求跨域等信息 在启动项目后因为配置的是root,首先是找不到html下面的sys-test文件夹,再经过配置修改为alias配置后,刷新又会报404错误,最终配置为如下,成功解决 因为打包部署后,

    2023年04月08日
    浏览(14)
  • Vue/React 项目部署到服务器后,刷新页面出现404报错

    Vue/React 项目部署到服务器后,刷新页面出现404报错

    问题描述:在本地启动项目一切正常, 部署到服务器上线后出现BUG,项目刷新页面出现404 。 起初以为是自己路由守卫或是token丢失问题,找了一圈终于解决了 产生原因: 我们打开vue/react打包后生成的dist文件夹,可以看到只有一个 index.html 文件及一些静态资源,这个是因为

    2024年02月07日
    浏览(20)
  • vue3项目部署到服务器,刚打开没事,一刷新页面就404

    vue3项目部署到服务器,刚打开没事,一刷新页面就404

    vue3项目部署到服务器,刚打开没事,一刷新页面就404 不知道什么原因。百度了下才发现问题所在 问题所在: vue-router历史模式的问题: vue3中历史模式,默认改为了HTML5模式: createWebHistory() 解决办法: createWebHistory 换成 createWebHashHistory ,将历史模式,由当前的HTML5模式,改

    2024年01月18日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包