建一个app平台的费用 移动app开发平台架构( 二 )


打包Android和IOS,肯定需要相应的平台项目存在,在 react-native init 时创建的项目,就已经包含了 android 和 ios 的模版工程,打包完的工程会加载bundle文件,然后启动项目 。这里就不展(tou)开(lan)了,有兴趣的可以看:React Native For Android 架构初探 。

建一个app平台的费用 移动app开发平台架构

文章插图
图片来源QQ空间移动开发团队,完成启动流程图
2、WEEX
Alibaba 出品,JavaScript语言,JS V8引擎,Vue设计模式,原生渲染
2.1、理念架构
“Write once, run everywhere”, weex的定义就像是:写个 vue 前端,顺便帮你编译成性能还不错的 apk 和 ipa(当然,现实有时很骨感) 。基于 Vue 设计模式,支持 web、android、ios 三端,原生端同样通过中间层转化,将控件和操作转化为原生逻辑来提高用户体验 。
在 weex 中,主要包括三大部分:JS Bridge、Render、Dom,分别对应WXBridgeManager、WXRenderManager、WXDomManager,三部分通过WXSDKManager统一管理 。其中 JS Bridge 和 Dom 都运行在独立的 HandlerThread 中,而 Render 运行在 UI 线程 。
JS Bridge 主要用来和 JS 端实现进行双向通信,比如把 JS 端的 dom 结构传递给 Dom 线程 。Dom 主要是用于负责 dom 的解析、映射、添加等等的操作,最后通知UI线程更新 。而 Render 负责在UI线程中对 dom 实现渲染 。
建一个app平台的费用 移动app开发平台架构

文章插图
2.2、实现原理
和 react native一样,weex 所有的标签也不是真实控件,JS 代码中所生成存的 dom,最后都是由 Native 端解析,再得到对应的Native控件渲染,如 Android 中标签对应 WXTextView 控件 。
weex 中文件默认为 .vue ,而 vue 文件是被无法直接运行的,所以 vue 会被编译成 .js 格式的文件,Weex SDK会负责加载渲染这个js文件 。Weex可以做到跨三端的原理在于:在开发过程中,代码模式、编译过程、模板组件、数据绑定、生命周期等上层语法是一致的 。不同的是在 JS Framework 层的最后,web 平台和 Native 平台,对 Virtual DOM 执行的解析方法是有区别的 。
建一个app平台的费用 移动app开发平台架构

文章插图
实际上,在 Native 中对 bundle 文件的加载大致经历以下阶段:
weex 接收到 js 文件以后,JS Framework 根据文件为 Vue 模式,会调用weex-vue-framework 中提供的 createInstance方法创建实例 。(也可能是Rax模式)
createInstance 中会执行 Js Entry 代码里 new Vue 创建一个组件,通过其 render 函数创建出 Virtual DOM 节点 。
由JS V8 引擎上解析 Virtual DOM ,得到 Json 数据发送至 Dom 线,这里输出 Json 也是方便跨端的数据传输 。
Dom 线程解析 Json 数据,得到对应的 WxDomObject,然后创建对应的WxComponent 提交 Render。
Render在原生端最终处理处理渲染任务,并回调里JS方法 。
得益于上层的统一性,只是通过 weex-vue-framework 判断是由Vue.js 生成真实的 Dom ,还是通过 Native Api 渲染组件,weex 一定程度上上,用JS 实现了 vue 一统天下的效果 。
建一个app平台的费用 移动app开发平台架构

文章插图
weex 在原生渲染 Render 时,在接收到渲染指令后,会逐步将数据渲染成原生组件 。Render 通过解析渲染数据的描述,然后分发给不同的模块 。
比如 控件渲染属于 dom 模块中,页面跳转属于navigator模块等 。模块的渲染过程并非一个执行完,再执行另一个的流程,而是类似流式的过程 。如上一个的组件还没渲染好,下一个
的渲染又发了过来 。这样当一个组件的嵌套组件很多时,或者可以看到这个大组件内的UI,一个一个渲染出来的过程
weex 比起react native,主要是在JS V8的引擎上,多了 JS Framework 承当了重要的职责,使得上层具备统一性,可以支持跨三个平台 。总的来说它主要负责是:管理Weex的生命周期;解析JS Bundle,转为Virtual DOM,再通过所在平台不同的API方法,构建页面;进行双向的数据交互和响应 。
建一个app平台的费用 移动app开发平台架构

文章插图
2.3、打包
weex 作为 react-native 之后出现的跨平台实现方案,自然可以站在前人的肩膀上优化问题,比如:Bundle文件过大问题 。
Bundle文件的大小,很大程度上影响了框架的性能,而 weex 选择将 JS Framework 集成到 WeexSDK 中,一定程度减少了JS Bundle的体积,使得 bundle 里面只保留业务代码 。
打包时,weex 是通过 webpack 打包出 bundle 文件的 。bundle 文件的打包和 entry.js 文件的配置数量有关,默认情况下之后一个 entry 文件,自然也就只有一个bundle文件 。