最近有个Vue项目中会偶尔出现<代码>加载块{n}失败> 代码的报错,报错来自于webpack进行代码洒之后某些包文件延迟加载失败。但是这个问题的根本原因没有被找的到,因为这个问题出现的偶然性太高了,而且有的手机上会出现,有的不会,用模拟器不会出现,用真机又会出现,不知道是网络原因还是webpack的错误。在github, stackoverflow等各种地方也找不到原因和解决方案,这是github上关于这个问题的讨论:加载块{n} # 742失败,虽然最后还是不了了之,但是大家可以参考一下。
这个问题出现概率比较小但是一旦出现就会导致页面崩溃,所以还是得解决,下面就贴出我的解决方案:
我的思路是既然找不到报错的原因那么尝试去捕获这个错误并做容错处理,有两种实现,一是在服务端捕获这个错误,一个是在前端捕获。
报错的原因是某些js包没有被找的到,所以在服务端接收到获取该js文件的请求时先判断该js文件是否存在,如果存在直接返回js文件,如果不存在则返回一个提示信息给前端,让前端处理。假设服务端用表达作为静态文件服务器,代码如下:
app.all (/\。js/美元(点播,res)=比;{ const文件名=req.path.slice (req.path.lastIndexOf (“/? + 1); const filePath=路径。解决(__dirname”。/公共/静态/js/+文件名); 如果(fs.existsSync (filePath)) { fs.sendFile (filePath); 其他}{ res.setHeader(“内容类型”、“应用程序/javascript;utf - 8字符集=') res.setHeader (“Accept-Ranges”、“字节”) res.setHeader(“不同”,“接受编码”) res.setHeader(“传输编码”、“分块”) res.setHeader (“last - modified”,新的日期().toUTCString ()) res.setHeader (cache - control,“no - cache”) res.send(“窗口。serverRebuildHook,,window.serverRebuildHook ();”) } });
当js文件未找到时,通过<代码> res.send(“窗口。serverRebuildHook,,window.serverRebuildHook();”) 代码>向前端返回一条消息,并执行前端定义的<代码> serverRebuildHook 代码>方法。
接着我们在前端实现<代码> serverRebuildHook 代码>方法:
窗口。serverRebuildHook=function () { alert('服务器版本已更新,正在刷新本地缓存,请稍后…”); location.replace (location.href); }
方法很简单,提示一下用户服务端更新然后重新刷新当前页面。
这种实现是参考github上的回答,相对比较繁琐,而且用户体验并不好,只能刷新当前页面,不能跳转到目标页。
由于项目里面用到了vue-router, vue-router的错误处理函数alt="详解Vue项目中出现加载块{n}失败问题的解决方法">
当在渲染一个路由的过程中,需要尝试解析一个异步组件时发生错误。完全符合我们场景,所以在onError方法中我们实现如下代码:
router.onError(错误)=比;{ const模式=/加载块(\ d) +失败/g; const isChunkLoadFailed=error.message.match(模式); const定位路径=router.history.pending.fullPath; 如果(isChunkLoadFailed) { router.replace(定位路径); } });
当捕获到<代码>加载块{n}失败> 代码的错误时我们重新渲染目标页面,这种实现明显更简单和友好。
后续如果发现了导致<代码>加载块{n}失败> 代码的本质原因会再更新本文,欢迎关注!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。