Vue开发中出现Loading Chunk Failed的问题解决

 更新时间:2022年03月29日 17:21:37   作者:Yukon  
本文主要介绍了Vue开发中出现Loading Chunk Failed的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

报错现象

某天测试反应在点击页签的时候出现了 Loading Chunk Failed 的错误,经过本人百度分析后判断是异步组件在发包时旧资源被替换的问题,然后一通CV操作之后发现问题还是存在,于是便有如下探究。

发生原因

用户在发包前进入了页面(也就是请求到了 index.html ),并且在 index.html 中可以得知将来要请求的异步组件的名字叫 a.js ,当服务器这时候发包,并且清空掉了 a.js 这个资源,改名叫 a1.js 。发包之后用户点击 a.js 对应的组件时,浏览器拿着先前在 index.html 得知的 a.js 这个名字去服务器请求资源就得到了以上的 Loading Chunk Failed 报错。

正常的生产上线流程可能存在静态资源和页面分属不同服务器,应该是先全量部署静态资源(各种js,css,图片),不清空旧资源,然后再部署页面。但如果清空掉旧资源就可能导致报错。

如果在测试环境中可能会采取清空覆盖掉旧资源,这个时候就必须要前端进行控制了。

解决思路

  • 在监听到路由报错的时候,前端强制刷新页面,重新获取index.html和对应的静态资源路径。
  • 设置preFetch,网络空闲的时候就请求资源,可以大幅降低报错的几率。

触发bug

想要解决问题首先就是得复现问题,涉及到发包上线的测试和验证都有点小尴尬,因此提供下个人思路

  • 最直接的就是你开个页面,然后控制台网络禁用掉缓存,然后发包后进入其他异步组件触发bug。
  • 如果想要触发 onError 这个钩子的话,直接断开 devServer 就可以了。
  • 本地复现的话就是开个本地服务器,然后进入页面,把 dist 文件夹中对应的js文件删去即可触发。

代码实现

 /* 正则使用'\S'而不是'\d' 为了适配写魔法注释的朋友,写'\d'遇到魔法注释就匹配不成功了。
  * 使用reload方法而不是replace原因是replace还是去请求之前的js文件,会导致循环报错。
  * reload会刷新页面, 请求最新的index.html以及最新的js路径。
  * 直接修改location.href或使用location.assign或location.replace,和router.replace同理, 
  * 在当前场景中请求的依然是原来的js文件,区别仅有浏览器的历史栈。因此必须采用reload.
  * reload()有个特点是当你在A页面试图进入B页面的时候报错,会在A页面刷新,因此在刷新后需要手动书写逻辑
  * 进入B页面,可以在router.onReady()方法里面书写
  * 为了避免在特殊情况下服务器丢失资源导致无限报错刷新,做了一步控制,仅尝试一次进入B页面,
  * 如果不成功就只刷新A页面,停留在当前的A页面。
  */
 ​
 ​
 router.onError((error) => {
   const jsPattern = /Loading chunk (\S)+ failed/g
   const cssPattern = /Loading CSS chunk (\S)+ failed/g
   const isChunkLoadFailed = error.message.match(jsPattern || cssPattern)
   const targetPath = router.history.pending.fullPath
   if (isChunkLoadFailed) {
     localStorage.setItem('targetPath', targetPath)
     window.location.reload()
   }
 })
 ​
 router.onReady(() => {
   const targetPath = localStorage.getItem('targetPath')
   const tryReload = localStorage.getItem('tryReload')
   if (targetPath) {
     localStorage.removeItem('targetPath')
     if (!tryReload) {
       router.replace(targetPath)
       localStorage.setItem('tryReload', true)
     } else {
       localStorage.removeItem('tryReload')
     }
   }
 })

一点思考

我之前提到过异步组件而不是路由懒加载导致了这个问题的发生,有趣的是,当你子组件是用懒加载方式进行,并且没有设置或者关闭了preFetch,且之前没有缓存。很可能也会报这种错。在网络中和路由懒加载一样是报 404 找不到对应资源,区别就是不会报 loadingChunkError 的错误。

设置缓存策略中页面一定要对页面( inedx.html )设置no cache no store,避免依然指向旧的已被删除的资源,只有Get方式获取的资源才可以设置缓存策略。

到此这篇关于Vue开发中出现Loading Chunk Failed的问题解决的文章就介绍到这了,更多相关Vue Loading Chunk Failed内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.js中v-for指令的用法介绍

    Vue.js中v-for指令的用法介绍

    这篇文章介绍了Vue.js中v-for指令的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 详解如何在Vue中快速实现数据可视化大屏展示

    详解如何在Vue中快速实现数据可视化大屏展示

    在现代数据驱动的应用程序中,数据可视化大屏已经成为了非常重要的一环,通过对海量数据进行可视化展示,可以帮助用户更好地理解和分析数据,从而做出更加明智的决策,在Vue中进行数据可视化大屏展示也变得越来越流行,本文将介绍如何在Vue中快速实现数据可视化大屏展示
    2023-10-10
  • vue中v-bind和v-model的区别及说明

    vue中v-bind和v-model的区别及说明

    这篇文章主要介绍了vue中v-bind和v-model的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue el-input设置必填提示功能(单个与多个)

    vue el-input设置必填提示功能(单个与多个)

    有的功能需要设置必填项,当然也需要判断是不是添上了,下面这篇文章主要给大家介绍了关于vue el-input设置必填提示功能(单个与多个)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • vue项目如何使用$router.go(-1)返回时刷新原来的界面

    vue项目如何使用$router.go(-1)返回时刷新原来的界面

    这篇文章主要介绍了vue项目如何使用$router.go(-1)返回时刷新原来的界面问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 详解如何在Vue3中捕获和处理错误

    详解如何在Vue3中捕获和处理错误

    Vue 3 作为前端开发中一个非常流行的框架,在错误处理方面提供了灵活和强大的能力,本文将深入介绍在 Vue 3 中如何捕获和处理错误,包括组件级的错误处理、全局错误处理以及如何与异常日志系统集成,需要的朋友可以参考下
    2024-07-07
  • vue2 elementui if导致的rules判断失效的解决方法

    vue2 elementui if导致的rules判断失效的解决方法

    文章讨论了在使用Vue2和ElementUI时,将if语句放在el-form-item内导致rules判断失效的问题,并提出了将判断逻辑移到外部的解决方案,感兴趣的朋友一起看看吧
    2024-12-12
  • Vue3中引入scss文件的方法步骤

    Vue3中引入scss文件的方法步骤

    这篇文章主要给大家介绍了关于Vue3中引入scss文件的方法步骤,在实际项目中,各种样式往往有很多重复的情况,为了能够使样式的后续开发和维护更加惬意,将这些共同的代码进行命名然后调用这些变量是一个很好的选择,需要的朋友可以参考下
    2023-08-08
  • 如何在Vue中使用CleaveJS格式化你的输入内容

    如何在Vue中使用CleaveJS格式化你的输入内容

    这篇文章主要介绍了如何在Vue中使用CleaveJS格式化你的输入内容,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】

    vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】

    说到h5的翻页,很定第一时间想到的是swiper。但是我当时想到的却是,vue里边怎么用swiper。这篇文章主要介绍了vue-awesome-swiper - 基于vue实现h5滑动翻页效果 ,需要的朋友可以参考下
    2018-11-11

最新评论