vue项目打包后,由于html被缓存导致出现白屏的处理方案

 更新时间:2023年03月19日 15:11:39   作者:胖子liu  
这篇文章主要介绍了vue项目打包后,由于html被缓存导致出现白屏的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

背景

vue线上的项目修改打包,重新部署后,线上出现了白屏,无法显示

原因

这是因为浏览器缓存了之前的html,用户访问的还是之前的html,但是由于我们重新打包更新了服务器的资源,那么之前的html上引用的资源已经不存在了,所以页面就无法显示出来了。

解决思路

1. 手动刷新。懂的都都懂,用户自己看到屏幕白茫茫一片,肯定以为网络不好,多刷新几次就出来了。

2. 在html加上 no-cache 等等 meta标签,然后服务器ngix也加伤 no-cache 等不缓存的代码,网上搜一搜:vue打包缓存白屏,会有好多,这里就不多说了,主要是我加了这些东西后跟没加的效果一样,并不能解决,还有可能是项目是放在别人的cdn上,改不了服务器,可能也不会起作用。

3. 代码刷新。通过测试我们可以看到,当出现白屏时,刷新可以使页面恢复正常,那是刷新时绕过了缓存,有兴趣的朋友可以去了解这方面的知识。所以,我们只需要在资源加载出错的时候让页面重新刷新,那么问题就可以解决了。

代码刷新处理方法

1. 监听资源加载。在页面加载完成时,使用window自带方法,监听资源加载失败error时,查找失败的资源是否是我们vue项目的资源,只要匹配一个即可通知我们调用刷新页面的方法。

汗颜,我是想监听失败的js、css,奈何一直无法监听到,所以放弃了,有成功的朋友可以交流交流。

2. 在项目main.js内定义一个全局变量

window.my_isLoad = 1

然后我们在index.html内写上监听的方法,此处需注意,如果使用window.onload,那要确保你项目其他地方没有使用这个方法,不然会失效,因为window.onload只能执行一次,多个时只执行最后一个。

或者引入jquery,使用jquery的ready方法,该方法可以多次调用,并且执行的时间节点比onload靠前,节省时间

先在index.html引入jquery

$(document).ready(
        function(){
          if(!window.my_isLoad) {
            // 这里可供自己测试查看,上线时可去掉,或自己做替他交互也可以,比如在页面上给什么提示信息、按钮
            var paydiv = document.createElement('div')
                paydiv.innerHTML = '资源加载失败,我要刷新了'
                document.body.appendChild(paydiv)
            // 
            setTimeout(()=>{
              document.body.removeChild(paydiv)
              window.location.reload(true)
            },10000)
            // 这个延迟时间可自己控制,页面加载出错多久后刷新页面
          }
        }
      )

上面使用的是通过在main.js内新增变量去判断,由于我司的页面有很多嵌入app的混合项目,在某个ios内出现了刷新页面时,缓存了之前window的变量,导致判断不准确,所以又想了一个不使用window变量的方法。

思路就是在App.vue 内创建一个元素,然后同样在index.html判断页面是否存在这个元素

在mounted生命周期里执行这个方法,添加一个元素,我们在index.html内通过id判断这个元素

this.$nextTick(()=>{
      (function(){
        var appDom = document.getElementById('app')     //这里的app是我们vue项目的app
        var checkDom = document.createElement('span')
        checkDom.setAttribute('id', 'my-check-load-dom')   //这里的id是我们需要判断的
        checkDom.style.display = 'none'
        appDom.appendChild(checkDom)
      })()
    })
$(document).ready(
        function(){
          var myLoadDom = document.getElementById('my-check-load-dom')
          if(!myLoadDom) {
            var paydiv = document.createElement('div')
                paydiv.innerHTML = '资源加载失败,我要刷新了'
                document.body.appendChild(paydiv)
            setTimeout(()=>{
              document.body.removeChild(paydiv)
              window.location.reload(true)
            },10000)
          }
        }
      )

至此,在资源加载时候,页面可以自动刷新,从而答案重新获取资源,解决白屏的问题。

若是嵌入app的混合项目,需要app的webview支持我们浏览器的刷新方法,这点可以自己去测试,若不支持的话,可以去跟公司的app大佬沟通,有些webview默认不支持,需要他们写方法支持。 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue实现动态路由的方法及路由原理解析

    vue实现动态路由的方法及路由原理解析

    这篇文章主要介绍了路由原理及vue实现动态路由,Vue Router 提供了丰富的 API,可以轻松地实现路由功能,并支持路由参数、查询参数、命名路由、嵌套路由等功能,可以满足不同应用程序的需求,需要的朋友可以参考下
    2023-06-06
  • vue3实战教程之axios的封装和环境变量

    vue3实战教程之axios的封装和环境变量

    这篇文章主要给大家介绍了关于vue3实战教程之axios的封装和环境变量的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Vue.js桌面端自定义滚动条组件之美化滚动条VScroll

    Vue.js桌面端自定义滚动条组件之美化滚动条VScroll

    这篇文章主要给大家介绍了关于Vue.js桌面端自定义滚动条组件之美化滚动条VScroll的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅谈关于vue中scss公用的解决方案

    浅谈关于vue中scss公用的解决方案

    这篇文章主要介绍了浅谈关于vue中scss公用的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • vue实现导航栏下拉菜单

    vue实现导航栏下拉菜单

    这篇文章主要为大家详细介绍了vue实现导航栏下拉菜单,带展开收缩动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 在vue中利用全局路由钩子给url统一添加公共参数的例子

    在vue中利用全局路由钩子给url统一添加公共参数的例子

    今天小编就为大家分享一篇在vue中利用全局路由钩子给url统一添加公共参数的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    这篇文章主要为大家详细介绍了Vue.js实现多条件筛选、搜索、排序及分页的表格功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vue项目报错Extra semicolon (semi)问题及解决

    vue项目报错Extra semicolon (semi)问题及解决

    这篇文章主要介绍了vue项目报错Extra semicolon (semi)问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 探秘Vue异步更新机制中nextTick的原理与实现

    探秘Vue异步更新机制中nextTick的原理与实现

    nextTick 是 Vue 提供的一个重要工具,它的作用主要体现在帮助我们更好地处理异步操作,下面就跟随小编一起来探索一下nextTick的原理与实现吧
    2024-02-02
  • 基于vue组件实现猜数字游戏

    基于vue组件实现猜数字游戏

    这篇文章主要为大家详细介绍了基于vue组件实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论