前一段时间,为了遵守《高性能网站建设指南》的约定——压缩JavaScript,我把swiper的版本由swiper.jquery.js改成了swiper.jquery.min.js,结果奇怪的事情发生了——安卓版的微信加载网页超级慢,而非微信版的浏览器访问网站均正常,这个问题,我还特意在网络上搜了搜,还真有人遇到这样的问题。但解决办法没有。
这就奇了怪了,最初,我的怀疑对象肯定不是swiper,我怀疑是微信安卓版的签名问题。因为在使用 https://github.com/wechat-group/weixin-java-tools 进行签名的时候有这样一段代码:
@Override public String getJsapiTicket(boolean forceRefresh) throws WxErrorException { Lock lock = this.getWxMpConfigStorage().getJsapiTicketLock(); try { lock.lock(); if (forceRefresh) { this.getWxMpConfigStorage().expireJsapiTicket(); } if (this.getWxMpConfigStorage().isJsapiTicketExpired()) { String responseContent = execute(SimpleGetRequestExecutor.create(this), WxMpService.GET_JSAPI_TICKET_URL, null); JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject(); String jsapiTicket = tmpJsonObject.get("ticket").getAsString(); int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt(); this.getWxMpConfigStorage().updateJsapiTicket(jsapiTicket, expiresInSeconds); } } finally { lock.unlock(); } return this.getWxMpConfigStorage().getJsapiTicket(); }
怀疑这段代码的原因就是它有一个lock,但时候证明原因不在于此。这个方法请求得响应结果特别的快。
后来,折腾了一天,实在是没招了,就只能回滚项目源码的版本,一次次试错,最后在临近晚上7点的时候才把问题确定在swiper上。
当时页面引用的swiper是这样的:
<script src="https://cdn.bootcss.com/Swiper/3.3.1/js/swiper.jquery.min.js"></script>
最初代码部署在阿里云的服务器上时,我手机是iPhone6,微信订阅号访问的时候速度特别正常。但是老板的手机是华为的安卓,微信访问慢得要人崩溃,这期间我一直认为不是代码的问题,而是他手机的问题,最后老板被客户逼急了,还刷了机(悲催的是数据还丢了),结果访问速度依然很慢。后来,他就来逼我,这™没有一点错误信息啊,我手机正常啊,非微信的安卓浏览器也访问正常啊。代码绝对是没有问题的。
后来没办法,别人的安卓手机微信访问网站也是慢,问题总要解决啊。
我必须要在本地重现这个问题了,使用微信提供的微信web开发者工具没有问题,Google Chrome浏览器没有问题。
然后开启ngrok,奇怪的现象发生了,我的手机iPhone6:
微信浏览器的进度条一直停留在大概这个位置!
现在我确信代码是在某个地方出现了bug!,确定无疑了!
回滚历史版本是必须的,这是一项重复性特别高的工作,一行一行代码的瞧啊,就像是在拾麦子一样。最后,问题终于找到是在swiper的应用上面!!!!!!!!!
把压缩版换成开发版:
<script src="https://cdn.bootcss.com/Swiper/3.3.1/js/swiper.jquery.js"></script>
这个时候,访问竟然正常了!!!!!!!!!!!!!!神奇的swiper!!!!!!!!!!!!
把swiper切换成3.4.2的开发版还是压缩版,都依然有问题。
<script src="https://cdn.bootcss.com/Swiper/3.4.2/js/swiper.jquery.js"></script>
是不是使用swiper的时候出错了呢?
这问题我也考虑过,试验过。
new Swiper('.recom-container', { pagination : '.recom-pagination', lazyLoading : true, slidesPerView : 1, paginationClickable : true, }); // 热点新闻 new Swiper('.index-new-list', { autoplay : 3000, direction : 'vertical', loop : true, paginationClickable : true }); // 导航 new Swiper('.index-nav', { scrollbarHide : true, slidesPerView : 'auto', centeredSlides : false, grabCursor : true });
使用方法应该是没有问题的,应该就是swiper版本的问题,当然这问题的发生也特别的奇怪,它阻碍页面的呈现。并且看浏览器的脸色。
问题的结果,也只能是说swiper在版本更新的时候忽略了某些浏览器的兼容,导致内部的某些地方阻塞。
解决的方案,其实也很简单,只能将就使用3.3.1的开发版。也就是
<script src="https://cdn.bootcss.com/Swiper/3.3.1/js/swiper.jquery.js"></scri