起因
在某个项目的信息确认的页面在一部vivo手机的自带浏览器里,detail.js文件加载失败,在其他手机上都是正常的,经过排查,不论是重试加载js,还是更改js顺序,都无法正常加载该js文件。
最后将打包的文件名修改成confirm.js后,就能够正常加载了,这时候怀疑是浏览器的广告拦截导致的问题。接着将广告拦截关闭,再把文件名改回detail.js后,就能够正常加载该js文件了,现在已经确定是广告拦截将js的加载给阻止了。
测试vivo的广告拦截策略
被拦截的js文件为detail.js,然后将这几个文件名排列组合一下,看一下有哪几种组合的js会被拦截。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | let script = []
 for (let i = 0; i < 9; i++) {
 script[i] = document.createElement('script')
 script[i].onerror = function () {
 document.body.append(script[i].src + '::加载错误了')
 }
 }
 
 script[0].src = '/static/lymonTest/dealVerify/js/detail.js'
 script[1].src = '/static/lymonTest/verify/js/detail.js'
 script[2].src = '/static/lymonTest/verify/js/detaillist.js'
 script[3].src = '/static/lymonTest/detail/js/verify.js'
 script[4].src = '/static/lymonTest/detail/js/verifylist.js'
 script[5].src = '/static/lymonTest/js/detail.js'
 script[6].src = '/static/lymonTest/js/verify.js'
 script[7].src = '/static/lymonTest/js/verifylist.js'
 script[8].src = '/static/lymonTest/js/detaillist.js'
 
 setTimeout(() => {
 for (let i = 0; i < 9; i++) {
 document.body.append(script[i])
 }
 }, 3000);
 
 | 
根据上述代码,每个js文件会输出自己的文件名,如果加载失败,则会输出该文件名加载错误。然后我们测试一下在vivo自带浏览器里,有哪几个文件会被阻止加载,结果如下:

由结果可以发现js/detail.js这个路径的js文件会被拦截,其余的则不会,由此可以判断只要是这个路径的js文件,都会发生加载失败的问题。
解决办法
项目中打包的文件名,尽量不要用detail这个文件名,防止被拦截加载,vivo的广告拦截策略我们没法查看以及更改,所以只能避免这种情况发生。