详解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进度条插件 Progress Bar小问题解决
Jul 12 Javascript
js中cookie的添加、取值、删除示例代码
Oct 21 Javascript
JQuery的ready函数与JS的onload的区别详解
Nov 21 Javascript
js 验证身份证信息有效性
Mar 28 Javascript
javascript数组排序汇总
Jul 07 Javascript
全面解析bootstrap格子布局
May 22 Javascript
AngularJS入门教程之更多模板详解
Aug 19 Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 Javascript
AutoJs实现刷宝短视频的思路详解
May 22 Javascript
详解Vite的新体验
Feb 22 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连mysql和oracle数据库性能比较
2006/10/09 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
网上抓的一个特效
2007/05/11 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
原生JS实现天气预报
2020/06/16 Javascript
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
详谈python http长连接客户端
2017/06/12 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
利用python 读写csv文件
2020/09/10 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
大学生水果店创业计划书
2014/01/28 职场文书
一年级语文教学反思
2014/02/13 职场文书
运动会入场式解说词
2014/02/18 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
信用卡催款律师函
2015/05/27 职场文书
人生感悟经典句子
2019/08/20 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python