自己的2个手机还有公司中的测试机都没有ios12以下的系统,在开发和上线过程中根本没有发现有任何问题。在上线过后陆陆续续的收到过有ios10的用户反馈打开白屏。网上查了一下说是ios10对es6兼容性不好。然后我查看了一下打包后的文件,确实发现里面有一些箭头函数。
然后我将打包后的文件又转了一次,把箭头函数都转成了es5。由于没有ios10系统的测试机只能直接打包上线等结果了。但是过了几天又有线上用户反馈ios10系统的显示白屏。麻了麻了
就在最近几天终于找到了一个刚入职的同事有个ios10系统的手机,突然感觉抓住了光,有了希望,然后开始找BUG之旅。
首先找了网上说的普遍的第一种方法:
由于ios10对promise支持不好,所以尝试一下使用es6-promise和babel-polyfill
npm install es6-promise
npm install babel-polyfill
然后在main.js里面把依赖引进来
import 'babel-polyfill'
import Promise from 'promise'
Promise.polyfill()
打包后运行,发现还是白屏!直接yue了,有点摸不着头脑。
后来想了想,为啥每次就各别几个H5有人反馈说白屏,那一定是这几个H5引的包出了问题。然后找到main.js,把所有依赖全注释掉,然后页面里涉及到的引用也都注释掉,就保留一些最原始的html结构和样式。
接下来就是大工程了,把一个个依赖重新解开注释,页面里面也慢慢给复原。搞了2个多小时终于找到了问题,swiper!!!看了一下用的swiper7,想了想之前这么多年用swiper从来没出现过这种问题,可能是版本太高了。然后卸载了swiper7,重新装了swiper3修改了一些使用方法,重新打包。
nice~解决问题。
由于平时比较忙,所以也没有探究swiper7到底是哪里与ios10不兼容。年底了,空下来又想起了这件事,所以上网好好的查了一下这方面的问题。发现有一篇文章也讲到了这个情况:
使用Swiper插件:这是由于Swiper插件中用到了ES6的语法a = b ** c,a是b的c次方,而iOS 10的Safari里不认识这样的语法,认为这是一个错误,所以你需要让Swiper经过babel的包装,而缺省状态下babel是不对node_modules里的模块进行编译的。(swiper不兼容原因解析来源)