详解Vue项目中出现Loading chunk {n} failed问题的解决方法


Posted in Javascript onSeptember 14, 2018

最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某些bundle文件lazy loading失败。但是这个问题的根本原因没有被找到,因为这个问题出现的偶然性太高了,而且有的手机上会出现,有的不会,用模拟器不会出现,用真机又会出现,不知道是网络原因还是webpack的bug。在github、stackoverflow等各种地方也找不到原因和解决方案,这是github上关于这个问题的讨论:Loading chunk {n} failed #742,虽然最后还是不了了之,但是大家可以参考一下。

这个问题出现概率比较小但是一旦出现就会导致页面崩溃,所以还是得解决,下面就贴出我的解决方案:

我的思路是既然找不到报错的原因那么尝试去捕获这个错误并做容错处理,有两种实现,一是在服务端捕获这个错误,一个是在前端捕获。

服务端实现

报错的原因是某些js bundle没有被找到,所以在服务端接收到获取该js文件的请求时先判断该js文件是否存在,如果存在直接返回js文件,如果不存在则返回一个提示信息给前端,让前端处理。假设服务端用express作为静态文件服务器,代码如下:

app.all(/\.js$/, (req, res) => {
  const fileName = req.path.slice(req.path.lastIndexOf('/') + 1);
  const filePath = path.resolve(__dirname, './public/static/js/' + fileName);
  if (fs.existsSync(filePath)) {
    fs.sendFile(filePath);
  } else {
    res.setHeader('Content-Type', 'application/javascript; charset=UTF-8')
    res.setHeader('Accept-Ranges', 'bytes')
    res.setHeader('Vary', 'Accept-Encoding')
    res.setHeader('Transfer-Encoding', 'chunked')
    res.setHeader('Last-Modified', new Date().toUTCString())
    res.setHeader('Cache-Control', 'no-cache')
    res.send('window.serverRebuildHook && window.serverRebuildHook();')
  }
});

当js文件未找到时,通过res.send('window.serverRebuildHook && window.serverRebuildHook();')向前端返回一条消息,并执行前端定义的serverRebuildHook方法。

接着我们在前端实现serverRebuildHook方法:

window.serverRebuildHook = function () {
 alert('服务器版本已更新,正在刷新本地缓存,请稍后...');
 location.replace(location.href);
}

方法很简单,提示一下用户服务端更新然后重新刷新当前页面。

这种实现是参考github上的回答, 相对比较繁琐,而且用户体验并不好,只能刷新当前页面,不能跳转到目标页。

前端实现

由于项目里面用到了vue-router,vue-router的错误处理函数 onError 是不是能够捕获该错误呢?我们来看一下官方文档的说明:

详解Vue项目中出现Loading chunk {n} failed问题的解决方法

当在渲染一个路由的过程中,需要尝试解析一个异步组件时发生错误。 完全符合我们场景,所以在onError方法中我们实现如下代码:

router.onError((error) => {
 const pattern = /Loading chunk (\d)+ failed/g;
 const isChunkLoadFailed = error.message.match(pattern);
 const targetPath = router.history.pending.fullPath;
 if (isChunkLoadFailed) {
  router.replace(targetPath);
 }
});

当捕获到Loading chunk {n} failed的错误时我们重新渲染目标页面,这种实现明显更简单和友好。

后续如果发现了导致Loading chunk {n} failed的本质原因会再更新本文,欢迎关注!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ext监听事件方法[初级篇]
Apr 27 Javascript
基于jquery的checkbox下拉框插件代码
Jun 25 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
自己封装的javascript事件队列函数版
Jun 12 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
Vuex模块化实现待办事项的状态管理
Mar 15 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
TypeScript开发Node.js程序的方法
Apr 30 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
Mar 06 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 #Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
Sep 14 #Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 #Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
Sep 14 #Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 #Javascript
node中的session的具体使用
Sep 14 #Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 #Javascript
You might like
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python最长公共子串算法实例
2015/03/07 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python3运算符常见用法分析
2020/02/14 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
计算机工程学院个人求职信
2013/10/05 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
爱我中华演讲稿
2014/05/20 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
Python语言中的数据类型-序列
2022/02/24 Python