详解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 相关文章推荐
7个Javascript地图脚本整理
Oct 20 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
简介JavaScript中Math.LOG10E属性的使用
Jun 14 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
Bootstrap基本样式学习笔记之表单(3)
Dec 07 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
详解vuejs几种不同组件(页面)间传值的方式
Jun 01 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
react-navigation之动态修改title的内容
Sep 26 Javascript
解决axios post 后端无法接收数据的问题
Oct 29 Javascript
JS出现404错误原理及解决方案
Jul 01 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中echo,print_r与var_dump区别分析
2014/09/29 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
简单学习vue指令directive
2016/11/03 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python基础教程之常用运算符
2014/08/29 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
机器学习python实战之手写数字识别
2017/11/01 Python
python如何统计序列中元素
2020/07/31 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
经典c++面试题五
2014/12/17 面试题
护理学毕业生自荐信
2013/10/02 职场文书
毕业生在校学习的自我评价分享
2013/10/08 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
公司口号大全
2014/06/11 职场文书
工作年限证明模板
2015/06/15 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Python turtle实现贪吃蛇游戏
2021/06/18 Python
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL