• 媒体品牌
    爱范儿
    关注明日产品的数字潮牌
    APPSO
    先进工具,先知先行,AIGC 的灵感指南
    董车会
    造车新时代,明日出行家
    玩物志
    探索城市新生活方式,做你的明日生活指南
  • 知晓云
  • 制糖工厂
    扫描小程序码,了解更多

如何解决小程序的兼容性问题?

小程序

2017-02-04 18:32

文 | kamidox

微信小程序发布有一段时间了,但目前小程序的兼容性问题,特别是 Android 平台兼容性问题,特别严重。据我观察,好多小程序都曾踩过兼容性的坑。

掉坑里不要紧,更让人捉急的是,微信审核人员打回了紧急修复兼容性的版本。这就好比从坑里爬上来的时候,手刚抓到坑沿,又被微信官方踩到,再次跌落坑底。

这下,就只能眼睁睁地看着后台用户在破口大骂:「什么东西都没有啊,什么破小程序」。

微信小程序的兼容性问题除了微信本身的 Bug 外,大部分是目标平台对 JavaScript 标准库支持程度不同造成的。

微信本身引起的 Bug

微信本身的 Bug 引发的兼容性问题有个现成的例子,就是 wx.request() 返回的状态码 res.statusCode 的值在 iOS 下是 int 型数据,而在 Android 6.0.1 上却是 String 型数据

如果你判断服务器的返回状态码方法不当,可能就踩到坑里了。

wx.request({
  url: 'http://api.example.com',
  success: function (res) {
    if (res.statusCode === 200) {
      // success
    } else {
      // server failure
    }
  }
})

上述代码就踩坑了。在判断状态码时,正确的做法是使用 == 而不是使用 === 来判断。另外一个更规范的方法是使用 parseInt(res.statusCode) === 200 来实现。

JavaScript 标准库兼容性问题

比如 Array.find() 方法在 iOS 10.2 / Android 7.0 上完美支持,但在 Android 6.0.1 上却不支持。如果代码里用到了这个接口,就会导致在 Android 6.0.1 上无法正常工作。

通过对比发现,这类接口不支持的个数还是比较多的。特别是 Android 平台版本众多,兼容性问题就更严重,可能一不小小心就掉到坑里。

如何避开这些坑?

微信本身 Bug 只能绕过去,但对 JavaScript 引擎的兼容性,我们有更优雅的解决方法。比如,我们可以打补丁,使用 Polyfill 来实现这些不支持的标准库方法。

比如,修复 Android 6.0.1 平台不支持 String.startsWith() 的问题,可以使用下面的 Polyfill 代码:

if (!String.prototype.startsWith) {
  console.warn('define polyfill for Array.prototype.startsWith');
  String.prototype.startsWith = function (searchString, position){
    position = position || 0;
    return this.substr(position, searchString.length) === searchString;
  };
}

推而广之,我们可以把平台不支持的标准库方法,使用 Polyfill 实现。因此,我开发了 minapp-polyfill 这个项目。

使用方法很简单,把 minapp-polyfill 项目里的 polyfill.js 拷贝到小程序源码目录下。在需要打补丁的 JavaScript 源文件头部引入如下代码即可:

import 'path/to/polyfill.js'

目前这个项目只是搭了个骨架,还有很多方法需要实现。PRs is welcome。

原文地址:http://www.jianshu.com/p/90220a55f542

minapp-polyfill 项目地址:https://github.com/kamidox/minapp-polyfill

本文由知晓程序授权转载,关注微信号 zxcx0101,回复「1228」获得全网第一本《小程序入门指南》电子书。

zxcx-qun

new_zx

登录,参与讨论前请先登录

评论在审核通过后将对所有人可见

正在加载中

小程序商店 minapp.com,一扫即用的小程序大全。微信公众号「知晓程序」,做中国最好的小程序报道。

本篇来自栏目

解锁订阅模式,获得更多专属优质内容