微信小程序原理

2020-04-14  本文已影响0人  依然还是或者其他

前言

了解微信小程序原理,感觉可以帮助自己更好理解为什么有些问题是这样那样的,整理了下,以前发现的一些问题也更能理解了

基本架构

小程序的基本架构由View视图层、APPServices逻辑层组成,两者之间是相对独立,它们之间是通过微信的JSBridge来进行通信和协作的。

渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发。

运行机制:

小程序启动可以分为两种情况,一种是冷启动,一种是热启动

小程序销毁时机
通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁。具体而言包括以下几种情形:

更新机制

未启动时更新

开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开。

启动时更新

小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。

如果需要马上应用最新版本,可以使用 wx.getUpdateManager API 进行处理。

View视图层

由WXML、WXSS两部分组成

AppServices逻辑层

1、App( ) 小程序的入口;
2、Page( ) 页面的入口
3、提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。
4、每个页面有独立的作用域,并提供模块化能力。
5、数据绑定、事件分发、生命周期管理、路由管理运行环境

逻辑层的运行环境
IOS - JSCore
Android - X5 JS解析器
DevTool - nwjs Chrome 内核

setData机制

小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的 evaluateJavascript 所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。
而 evaluateJavascript 的执行会受很多方面的影响,数据到达视图层并不是实时的

简单理解的话,如用户在视图层触发一些交互,底层代码的逻辑是:
View视图层->JSBridge->APPServices逻辑层->JSBridge->View视图层
这种复杂的交互逻辑,在一些强交互场景下就会显得卡顿,所以原生组件出现。
原生组件的逻辑是
原生组件->APPServices逻辑层->原生组件

因为原生组件本身是有客户端控制(可以理解为JSBridge),所以简化了代码交互的逻辑。
由于原生组件脱离在 WebView 渲染流程外,所以在使用原生组件时,跟小程序普通组件存在一些差异:

参考

上一篇 下一篇

猜你喜欢

热点阅读