详解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 相关文章推荐
js 加载并解析XML字符串的代码
Dec 13 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
JavaScript触发onScroll事件的函数节流详解
Dec 14 Javascript
js+html5实现半透明遮罩层弹框效果
Aug 24 Javascript
vue使用drag与drop实现拖拽的示例代码
Sep 07 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
基于layui的下拉列表的数据回显方法
Sep 24 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
Mar 02 Javascript
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
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
德劲1107的电路分析与打磨
2021/03/02 无线电
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
php mysql数据库操作类
2008/06/04 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
用JQUERY增删元素的代码
2012/02/14 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
python django 访问静态文件出现404或500错误
2017/01/20 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
Python根据成绩分析系统浅析
2019/02/11 Python
谈谈Python中的while循环语句
2019/03/10 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
Python2与Python3的区别点整理
2019/12/12 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
股权转让协议范本
2014/12/07 职场文书