详解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 相关文章推荐
javascript 关闭IE6、IE7
Jun 01 Javascript
js 禁用只读文本框获得焦点时的退格键
Apr 25 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
Jun 03 Javascript
EasyUI中在表单提交之前进行验证
Jul 19 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
Javascript实现登录记住用户名和密码功能
Mar 22 Javascript
微信小程序实战之自定义抽屉菜单(7)
Apr 18 Javascript
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 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/03/29 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
js实现分页功能
2017/05/24 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
个人安全承诺书
2014/05/22 职场文书
物流专业求职信
2014/06/30 职场文书
运动会演讲稿200字
2014/08/25 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2014年幼师工作总结
2014/11/22 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
西安导游词
2015/02/12 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
Django路由层如何获取正确的url
2021/07/15 Python
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS