前言
初学小程序时一直在思考:小程序到底是什么?它既不是原生的APP应用,也不是浏览器的WEB应用,看起来像是在微信中虚拟出的一个APP。带着这样的疑问,发现了一个被微信官方称为基础库的东西,希望能借此来了解小程序。
参考文章
目录
- 基础库是什么?
- 小程序是运行在基础库上的吗?
基础库是什么?
基础库是小程序运行的必要环境,我们的开发主要就是面向基础库开发的。基础库封装了微信和手机的能力并提供给小程序使用,我们使用基础库提供的组件和API开发起来非常的方便。了解和使用基础库就揭开了小程序90%的神秘面纱。
基础库存在于我们的微信客户端中,它和微信一样,也会有其自己的版本,每个版本都会有一些新特性。微信官方为了使得基础库的版本和微信的版本同步,采取了一个微信版本对应一个基础库版本的方式。这就使得用户在更新最新版本的微信时也能更新至最新版本的基础库。带来的优点就是用户的基础库都是最新版本的。
小程序是运行在基础库上的吗?
普遍认为小程序是要运行在微信客户端上的,这么说似乎没什么问题,但非常不严谨。相比于微信客户端那么大的一个概念,客户端中绑定的基础库更像是小程序的SDK。他封装微信和手机功能的同时也使得开发者能够屏蔽微信版本和手机系统的差异。
如果从开发者的视野看,说小程序运行在基础库上也没什么问题。但这个开发者一定是个菜鸟(这篇文章初始版本的我),因为开发了一段时间后发现基础库并不是一块厚实的棉被,并不能把底层(微信和手机)的一切功能的包裹的严严实实。比如小程序的提示框在不同的微信版本则有不同的样式,又比如JS代码中的new Data("2018-2-8 11:34:00")在Android手机上能成功解析,在iOS上则会报错。这究竟是基础库的漏洞还是我们对小程序的理解不够深入呢?
上面的那两个问题已结说明“棉被理论”行不通了,因为一床漏风的棉被肯定不是好棉被。那究竟是什么原因会让JS代码在不同的手机系统上出现不同的结果呢?顺着这条线我先是找到了运行JS代码的浏览器内核,比如被大家嫌弃的IE浏览器内核Trident,以及Safari和Chrome使用的Webkit内核,还有火狐浏览器使用Gecko内核。继续了解后又发现了自己的无知,浏览器最核心其实分为两部分:渲染引擎(Rendering Engine)和JS引擎。我上面说的其实都是渲染引擎,真正解析JS代码的则是JS引擎。查了文档后才发现:
在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中,是由 WKWebView 来渲染的,环境有 iOS8、iOS9、iOS10
在 Android 上,小程序的 javascript 代码是通过 X5 JSCore来解析,是由 X5 基于 Mobile Chrome 53/57 内核来渲染的
在 开发工具上, 小程序的 javascript 代码是运行在 nwjs 中,是由 Chrome Webview 来渲染的
也就是说基础库并不能解决小程序的一切问题。JS代码的解析和页面的渲染都要调用手机系统的浏览器内核。这么看来基础库只能算是一个调度资源的调度器,将小程序需要的资源经过简单的封装然后调度过去而已。
按照这样的思路,小程序并不是运行在基础库上的。如果非要下一个定义的话,可以说:小程序是通过基础库运行在手机及微信上的。难怪小程序保存到桌面也有点原生应用的感觉,当然这里面涉及到了一个JSBridge的技术,有待进一步的学习。
最后:自己对小程序的了解还是知之甚少,看了别人介绍的文章~里面介绍了jsBridge,有空可以好好研究研究。有新的了解就持续更新吧。