当项目上线后,IE用户发现了这么个BUG:进入预览页面偶尔能浏览正常,偶尔失败,而且失败很频繁
技术经理赶紧找到了我,让我把这个问题解决掉,相信大家都知道,这种偶然性BUG解决起来特别麻烦。
我本地项目跑起来,确实也复现了这个问题,进入页面偶尔行,偶尔不行,注意:有的版本会报
undefined
这个错误,有的版本会报
意外地调用了方法或属性访问
,如果你要问我为什么知道的,我就该上图了
我把很多版本都测试了一遍,然并卵,要么就是IE不支持高版本,要么就是报那两个错误,但这两个错误其实都是同个问题导致的,这里暂且先买个关子
报
undefined
这个错误时,总是会伴随着
Unhandled promise rejection undefined
的错误
可以看出来这是promise函数下的一个错误,但是由于IE下无法点击错误定位到相关的错误,所以你很难根据源码去找到错误的位置,这就没了思路去解决该错误
报
意外地调用了方法或属性访问
这个错误时,能点击错误找到对应的错误位置
遇到这些错误,我们仍然习惯性的去网上找办法,看看有没有人和自己的境遇相同
然而搜了大半圈,我惊奇的发现:似乎没有人和我遭遇相同,还是说我使用的姿势不对?于是我问了我另外一些做技术相关的朋友,他们也有用到pdf.js这个插件的,结果在IE也是二次刷新报错,只不过他们客户都不是IE用户,所以暂时没有发现这个问题。
既然没人解决这个问题,我就尝试自己解决。
我开始分析上面代码:第一次进入页面时,代码到这都能正常执行下去,唯有刷新页面后,代码到这里就会抛异常,当时也挺郁闷,尝试了各种try catch,debugger,发现xhr从上面创建到这的变量内容每次都是一样,于是我就郁闷了:为什么只有第一次才好使,后面就不行呢??
那个时候,我开始debugger逐行分析,然而每次分析都好像徒劳,因为从上到下,从xhr创建到xhr.open,每个步骤的函数变量内容都是一样的,为什么后面就抛异常呢?我思来想去始终都没琢磨明白。
终于苦心不负有心人!在自己的坚持下,发现了规律:每次我修改代码后,ctrl+s保存代码,由于我在vue.config.js设置了
hotOnly: true
的热更新机制,所以都会自动重新执行一遍代码编译,而每次编译后页面都会重新刷新加载一遍,我发现IE正是在这种重新编译重新刷新页面的机制下,每次pdf预览都能正常!
这个时候我又疑惑了:为什么重新编译导致的页面刷新能够预览正常,而手动刷新页面就不好使?难道在IE浏览器中页面刷后,变量不都是重新创建、赋值的吗?还是说webpack的机制导致某些变量有缓存,而代码重新编译后才使的这些变量重新被销毁、创建?
这些都是我的猜想,然而即使这些猜想成立,我又该如何去修复?这使我到了进退两难的地步。