详解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 ui对话框实例代码
May 10 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
js实现的map方法示例代码
Jan 13 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
动态加载js的方法汇总
Feb 13 Javascript
require.js的用法详解
Oct 20 Javascript
详解用node编写自己的cli工具
May 23 Javascript
简单谈谈React中的路由系统
Jul 25 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
vue中实现图片压缩 file文件的方法
May 28 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
Nov 16 Javascript
CocosCreator入门教程之网络通信
Apr 16 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
Python实现获取操作系统版本信息方法
2015/04/08 Python
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python中的itertools的使用详解
2020/01/13 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
水果连锁超市创业计划书
2014/01/24 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Android Studio 计算器开发
2022/05/20 Java/Android