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界面)
双线程模型是小程序框架与业界大多数前端 Web 框架不同之处。基于这个模型,可以更好地管控以及提供更安全的环境。缺点是带来了无处不在的异步问题(任何数据传递都是线程间的通信,也就是都会有一定的延时),不过小程序在框架层面已经封装好了异步带来的时序问题。
2.2 组件系统
我们知道小程序是有自己的组件的,这些基本组件就是基于 Exparser 框架。 Exparser
基于 WebComponents
的 ShadowDOM
模型,但是不依赖浏览器的原生支持,而且可在 纯 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函数更新界面的。毕竟小程序的框架刚推出,应该后续会有很大不同吧。