详解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 相关文章推荐
Google韩国首页图标动画效果
Aug 26 Javascript
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
javascript中有趣的反柯里化深入分析
Dec 05 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
js获取电脑分辨率的思路及操作
Nov 22 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
Django模板继承 extend标签实例代码详解
May 16 Javascript
React配置子路由的实现
Jun 03 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实现加减法验证码代码
2014/02/14 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
python list转dict示例分享
2014/01/28 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
生日宴会答谢词
2014/01/09 职场文书
学习决心书范文
2014/03/11 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
读书月活动方案
2014/05/22 职场文书
考试诚信承诺书
2014/05/23 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python