详解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 相关文章推荐
最简单的jQuery程序 入门者学习
Jul 09 Javascript
js getElementsByTagName的简写方式
Jun 27 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
jQuery定义插件的方法
Dec 18 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
React中jquery引用的实现方法
Sep 12 jQuery
Koa2 之文件上传下载的示例代码
Mar 29 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
Node.js 多线程完全指南总结
Mar 27 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
Sep 16 Javascript
layui使用及简单的三级联动实现教程
Dec 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 iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
django中静态文件配置static的方法
2018/05/20 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
深入分析python 排序
2020/08/24 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
UNIX命令速查表
2012/03/10 面试题
学习十八大精神心得体会
2013/12/31 职场文书
田径运动会通讯稿
2014/09/13 职场文书
借钱欠条怎么写
2015/07/03 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL