这篇文章主要是对小程序官方文档做部分深入解读;让大家了解小程序实现背后的机制原理。
由于笔者没有获取到微信官方提供的小程序实现原理图,很多内容都是通过阅读文档资料反推和理解所得,如有误解之处,望指正。
本文建议阅读时间: 5min
目录小程序SDK
定义
JS-SDK
小程序基础库与JS-SDK的共同点
小程序基础库与JS-SDK的不同点
小程序基础库查看方法
小程序基础库与客户端之间的关系
小程序基础库更新机制
微信版本分布
微信版本和基础库版本
开发者工具切换基础库版本
wx 对象
JsBridge
webview与客户端的关系
两种 JsBridge 实现思路
微信关于 JsBridge 的实现
通信机制
架构介绍
执行环境
事件
生命周期事件
UI事件
Page.prototype.setData
总结
小程序SDK官方文档称其为“基础库”。
这是一个很宽泛的名词,只是觉得很重要,但说不好它具体有什么作用。我总结了 小程序5月带给我的惊喜 ,它支持的功能也越来越丰富,体验也越变越好,而这些动作如果用专业一点的术语概括就是“升级基础库”。
微信从开放内测到现在,微信基础库已经从的 v1.0.0 升级到了 v1.3.0 。
那么,“基础库”到底是什么东西?
小程序基础库提供丰富的微信原生API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。
这是官方对于“基础库”的定义。我们知道小程序的开发十分类似于现在的移动web开发,而移动web能使用到手机系统功能,app特色功能是非常有限的,而“基础库”的作用就是为了拓展小程序这方面能力,让其功能与表现更接近原生app。
JS-SDK我们发现“基础库”的功能和微信的 JS-SDK 十分类似,顺便再回顾下微信 JS-SDK 又是做什么的呢?
微信 JS-SDK 是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信 JS-SDK ,网页开发者可借助微信高效地使用拍照、选取图片、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特色功能,为微信用户提供更优质的网页体验。
小程序基础库与JS-SDK的共同点为当前应用调起手机系统能力和微信能力;
都需要基础库的支持;
小程序基础库与JS-SDK的不同点支持的API:小程序基础库对系统能力和微信能力做了更全面的封装,包括网络请求、存储等,而网页版JS-SDK相应的功能直接调用 window 能力;
引入方式:小程序基础库直接集成到微信的不同版本中,JS-SDK是以一个js文件的形式被引入项目里;
小程序基础库查看方法官方API : getSystemInfo 、 getSystemInfoSync 。
wx.getSystemInfo({ success: function(obj) { obj = obj || {}; console.log('SDKVersion: ', obj.SDKVersion); }, fail: function() { console.error('[error]: getSystemInfo failed.'); } });返回对象中 SDKVersion 的值就是该微信版本携带的小程序基础库的版本号。
注意:该属性在小程序版本 v1.1.0 才开始支持。
小程序基础库与客户端之间的关系小程序的能力需要微信客户端来支撑,每一个基础库都只能在对应的客户端版本上运行,高版本的基础库无法兼容低版本的微信客户端。
官方的这种说法存在一些问题。现在基础库版本和客户端版本并不是一一对应关系。客户端可以主动升级小程序基础库版本达到灰度上线新版的目的,所以必然存在一个客户端版本对应多个基础库版本的情况。
小程序基础库更新时机为了避免新版本的基础库给线上小程序带来未知的影响,微信客户端都是携带 上一个稳定版 的基础库发布的。
在新版本客户端发布后,我们再通过后台灰度新版本基础库,灰度时长一般为 12 小时,在灰度结束后,用户设备上才会有新版本的基础库。
以微信 6.5.8 为例,客户端在发布时携带的是 1.1.1 基础库(6.5.7上已全量的稳定版)发布,在 6.5.8 发布后,我们再通过后台灰度 1.2.0 基础库。
笔者使用的IOS设备更新到v6.5.8时对应的 SDKVersion 是 1.2.0, 但截止发稿日,该值已经变成了 1.2.4。
“细思恐极”,如果我们已经完成一台装有 6.5.4 版本微信的Oppo手机对小程序的兼容测试,很有可能过几天这台Oppo手机将小程序基础库更新到新版本导致小程序不可用。