XCore开发体验
背景
XCore 是一个动态跨平台框架。类似 RN,Weex。一次编写,多端运行是我们的目标。
技术方案
选型
- 客户端使用 js 解析引擎,对加载过来的js进行解析,并绑定原生的代码,通过原生代码来实现界面的绘制,事件的传递等。
- 说说选型。
- 前端基础库,我们选择了 Vue。Vue 非常适合移动界面的开发,现在已经越来越普及。选择 Vue,可以减少前端同学的学习成本。
- 安卓端解析引擎,使用谷歌提供的 V8 引擎。chrome 浏览器就在使用 V8 引擎对js进行引擎,解析速度很快。
- iOS端,没有选择,只能使用jscore。这个是由于平台所限制的。
- 谈谈排版。我们选择了 flex 排版。不了解的同学可以先行谷歌。flex排版方式,非常适合native端解析,而且容易使用。所需要支持的特性较少,但是功能强大。
- 功能实现。我们是标准 web api 的一个子集。一个为特定业务场景而生的微浏览器内核。
架构
最上层我们提供Web标准的子集,DOM操作的子集,CSS的子集,H5API的子集,以及所需的事件
我们使用的是标准的CSS规范,在Web端是直接使用的。Native端,在DOM Tree,每个Node有自己的Style属性,当Node被创建或者变成dirty的时候,会触发排版计算。
排版计算主要输出就是元素的位置和大小,随后元素的位置和大小的信息会被同步到Shadow Tree上,Shadow Tree在适当的时机将位置与大小的信息设置的Native Tree上对应的Native View的属性上,最终一次布局完成。
-
为什么是在合适的时机,而不是立即的设置Native Tree呢?因为Native View的场景不是在DOM node创建的时候立即创建的。普通的Node是在attach时候才创建Native View,而在ListView的场景,是在对用Item系统通知需要创建的时候创建的
-
好处是,内核更加灵活。因为都是标准的Web API,能相对容易的接入各种前端框架,不用被单一的开发框架限定死。
-
理论上,我们可以接入任何前端框架,当然我们不是一个大而全的浏览器内核,不能提供完善的API,所以接入的改造成本还是难免。
渲染层面我们支持一份代码三端运行,在web和native端我们都有不同的实现
-
Native的渲染模型,三棵树,两个线程:这个渲染模型分为三棵树,DOM Tree, Shadow Tree,Native Tree。
- DOM Tree:可以理解为标准浏览器中的DOM Tree,前端可以通过标准的API进行构建、操作。DOM Tree分两部分:在JS虚拟机里面有一层JS DOM的wrapper,方便我们对DOM的操作管控。
在Native层面是真正的DOM Tree实现,JS DOM Wrapper与Native DOM是严格的一一映射
排版在Native DOM上执行,这样能保证DOM的API操作都是实时的。 - Shadow Tree可以理解为DOM Tree在 UI线程的映射,用于同步数据与操作到UI线程;为了提高性能,对数据同步我们是有批处理的。
- Native Tree:对应的是Native UI组件构建出来的Tree,负责真正的渲染;在Android和iOS分别使用相应的UI Framework。
- DOM Tree:可以理解为标准浏览器中的DOM Tree,前端可以通过标准的API进行构建、操作。DOM Tree分两部分:在JS虚拟机里面有一层JS DOM的wrapper,方便我们对DOM的操作管控。
-
优势
- Web上,由于我们是标准的子集,可以直接运行。
- Native端,我们是复用系统原生的渲染能力,这样才能保证页面达到原生级别的体验。
扩展能力的建设。提供扩展机制,方便native开发人员提供对应的native组件
我们提供常用的基础标签,如 view, label, image, input 等。在基础标签的基础上我们提供扩展组件的能力:
- 一类就是自定义组件,用于弥补基础标签的不足。这个要求要有三端实现。自定义组件适合去复用已有的相对通用的Native组件,比如轮播图。对性能实时性要求较高的场景也个很好的弥补,如下拉刷新。
- 另外一类扩展是插件,我们完整的支持Cordova插件,复用原有的40+Cordova插件
调试工具
由于不断的推广,使用人员也越来越多,调试问题亟待解决。在安卓和iOS端通过对对应的js解析引擎的调研,发现其都有自己对应的调试协议。我们通过封装调试协议,在本机通过一个nodejs脚本开启调试服务,将解析引擎的信息通过这个服务进行中转,服务将消息统一处理为浏览器使用的调试协议,通过websocket发送给浏览器,然后在浏览器的操作会发送到此服务上,再进行转换,发送到对应的解析引擎,实现调试功能。目前已经具有:断点调试,console输出,dom实时高亮,浏览器展示设备界面,变量输入等功能。
基础功能复用
我们大量复用了以后App架构的基础设施,如果图片,网络,日志统计等等,Web版的页面在App也是使用Web容器,其他离线化,开关,数据收集等都是复用Web容器的功能。同时,我们还提供了配套的编译、集成的工具。
总结
个人经历的第一个框架开发,框架开发确实需要考虑诸多因素。在高速的迭代中,也成长了许多。