微信小程序原理与架构设计

微信小程序原理与架构设计

  • 0.目前移动端主流的开发模式:
  • 1.0 小程序页面与H5页面的区别
  • 2.0 小程序的架构设计
    • 2.1 双线程模型
    • 2.2 组件系统
  • 3. 小程序的生命周期

0.目前移动端主流的开发模式:

  • Native APP 原生应用
    开发一款 APP,如果注重性能,不需要过多的动态内容,可以选择原生应用来开发
  • WebAPP 网页应用
    如果性能要求不高,只是需要点开即用,那么 WebAPP 即可满足
  • Hybrid App 混合式开发
    Hybrid App 混合式的开发是一种折中的方法,将前两者优势互补,满足大部分的需求
  • ReactNative
    深度定制的开发模式,开发只需要写 Javascript 就可以产出性能可与原生媲美的产品
  • 轻应用小程序
    深度定制的开发模式,开发只需要写 Javascript 就可以产出性能可与原生媲美的产品

1.0 小程序页面与H5页面的区别

  • 运行环境:小程序基于浏览器内核重构的内置解析器,而 h5 的宿主环境是浏览器。所以小程序中没有 DOM 和 BOM 的相关 API , jQuery 和一些 NPM 包都不能在小程序中使用;
  • 系统权限:小程序能获得更多的系统权限,如网络通信状态、数据缓存能力等;
  • 渲染机制:小程序的逻辑层和渲染层是分开的,而 h5 页面 UI 渲染跟 JavaScript 的脚本执行都在一个单线程中,互斥。所以 h5 页面中长时间的脚本运行可能会导致页面失去响应。

小程序开发过程中我们面对的是 iOS 和 Android 微信客户端和辅助开发的小程序开发者工具。所以微信小程序介于 web 端和原生 App 之间,能够丰富调用功能接口,同时又跨平台。

2.0 小程序的架构设计

2.1 双线程模型

小程序的渲染层和逻辑层分别由2个线程管理:

  • 渲染层:界面渲染相关的任务全都在 WebView 线程里执行。一个小程序存在多个界面,所以渲染层存在多个 WebView 线程。
  • 逻辑层:采用 JsCore 线程运行JS脚本。
    视图层和逻辑层通过系统层的 WeixinJsBridage 进行通信:逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层把触发的事件通知到逻辑层进行业务处理。

(页面渲染的具体流程是:在渲染层,宿主环境会把 WXML 转化成对应的 JS 对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的 setData 方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面)
微信小程序原理与架构设计_第1张图片
双线程模型是小程序框架与业界大多数前端 Web 框架不同之处。基于这个模型,可以更好地管控以及提供更安全的环境。缺点是带来了无处不在的异步问题(任何数据传递都是线程间的通信,也就是都会有一定的延时),不过小程序在框架层面已经封装好了异步带来的时序问题。

2.2 组件系统

我们知道小程序是有自己的组件的,这些基本组件就是基于 Exparser 框架。 Exparser 基于 WebComponentsShadowDOM 模型,但是不依赖浏览器的原生支持,而且可在 纯 JS 环境中运行。

小程序中,所有节点树相关的操作都依赖于 Exparser ,包括 WXML 到页面最终节点树的构建、 CreateSelectorQuery 调用和自定义组件特性等。

现在微信小程序也支持自定义组件了,用法和组件间通信类似于 Vue 。

3. 小程序的生命周期

小程序的生命周期借鉴了Android的生命周期,如果你了解过Android的APP开发,那么理解小程序的就会很简单。

界面线程有四大状态:

1,初始化状态:初始化界面线程所需要的工作,包括工作机制,基本和我们开发者没有关系,等初始化完毕就向“服务线程”发送初始化完毕信号,然后进入等待传回初始化数据状态。

2,首次渲染状态:收到“服务线程”发来的初始化数据后(就是 json和js中的data数据),就开始渲染小程序界面,渲染完毕后,发送“首次渲染完毕信号”给服务线程,并将页面展示给用户。
,3,持续渲染状态:此时界面线程继续一直等待“服务线程”通过this.setdata()函数发送来的界面数据,只要收到就重新局部渲染,也因此只要更新数据并发送信号,界面就自动更新。

4,结束状态:结束渲染。

服务线程五大状态:

1,初始化状态:无需和其他模块交流,跟小程序开发也没多大关联,此阶段就是启动服务线程所需的基本功能,比如信号发送模块。系统的初始化工作完毕,就调用自定义的onload和onshow,
然后等待界面线程的“界面线程初始化完成”信号。
onload是只会首次渲染的时候执行一次,onshow是每次界面切换都会执行,简单理解,这就是唯一差别。

2,等待激活状态:接收到“界面线程初始化完成”信号后,将初始化数据发送给“界面线程”,等待界面线程完成初次渲染。
3,激活状态:收到界面线程发送来的“首次渲染完成”信号后,就进入激活状态既程序的正常运行状态,并调用自定义的onReady()函数。

4,此状态下就可以通过 this.setData 函数发送界面数据给界面线程进行局部渲染,更新页面。

5,后台运行状态:如果界面进入后台,服务线程就进入后台运行状态,从目前的官方解读来说,这个状态挺奇怪的,和激活状态是相同的,也可以通过setdata函数更新界面的。毕竟小程序的框架刚推出,应该后续会有很大不同吧。

你可能感兴趣的:(小程序,前端,腾讯,微信,架构)