移动app开发平台架构,建一个app平台的费用 。发迹号带你了解更多相关信息 。
跨平台一直是老生常谈的话题,cordova、ionic、react-native、weex、kotlin-native、flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头(事实上更多是共存发展)看完本篇,相信你会对于当下跨平台移动开发的现状、实现原理、框架的选择等有更深入的理解 。
一、前言
【建一个app平台的费用 移动app开发平台架构】为什么我们需要跨平台开发? 本质上,跨平台开发是为了增加代码复用,减少开发者对多个平台差异适配的工作量,降低开发成本,提高业务专注的同时,提供比web更好的体验 。嗯~通俗了说就是:省钱、偷懒 。
本篇主要以react-native、weex、flutter,结合资讯展望,深入聊聊当前跨平台移动开发的实现原理、现状与未来 。至于为什么只讲它们,因为对比ionic、phoneGap,它们更于 “naive” (? ̄? ??  ̄??) 。
文章插图
二、原理与特性
目前移动端跨平台开发中,大致归纳为以下几种情况:
react native、weex均使用JavaScript作为编程语言,目前JavaScript在跨平台开发中,可谓占据半壁江山,大有“一统天下”的趋势 。
kotlin-native开始支持 iOS 和 Web 开发,(kotlin已经成为android的一级语言)也想尝试“一统天下” 。
flutter是Google跨平台移动UI框架,Dart作为谷歌的亲儿子,毫无疑问Dart成为flutter的编程语言,如下图,作为巨头新生儿,在flutter官网也可以看出,flutter同样“心怀天下” 。
文章插图
1、React Native
Facebook 出品,JavaScript语言,JSCore引擎,React设计模式,原生渲染
1.1、理念架构
“Learn once, write anywhere” ,代表着 Facebook对 react native 的定义:学习 react ,同时掌握 web 与 app 两种开发技能 。react native 用了 react 的设计模式,但UI渲染、动画效果、网络请求等均由原生端实现 。开发者编写的js代码,通过 react native 的中间层转化为原生控件和操作,比ionic等跨平台应用,大大提高了的用户体验 。
总结起来其实就是利用 JS 来调用 Native 端的组件,从而实现相应的功能 。
如下图所示,react native 的跨平台是实现主要由三层构成,其中 C++ 实现的动态连结库(.so),作为中间适配层桥接,实现了js端与原生端的双向通信交互 。这里最主要是封装了 JavaScriptCore 执行js的解析,而 react native 运行在JavaScriptCore中,所以不存在浏览器兼容的问题 。
其中在IOS上直接使用内置的javascriptcore,在Android 则使用方开源的jsc.so 。
文章插图
1.2、实现原理
和前端开发不同,react native 所有的标签都不是真实控件,JS代码中所写控件的作用,类似 Map 中的 key 值 。JS端通过这个 key 组合的 Dom ,最后Native端会解析这个 Dom ,得到对应的Native控件渲染,如 Android 中 标签对应 ViewGroup 控件 。
文章插图
在 react native 中,JS端是运行在独立的线程中(称为JS Thread ) 。JS Thread 作为单线程逻辑,不可能处理耗时的操作 。那么如 fetch 、图片加载 、 数据持久化 等操作,在 Android 中实际对应的是 okhttp 、Fresco 、SharedPreferences等 。而跨线程通信,也意味着 Js Thread 和原生之间交互与通讯是异步的 。
可以看出,跨平台的关键在于C++层,开发人员大部分时候,只专注于JS 端的代码实现 。在原生端提供的各种 Native Module 模块(如网络请求,ViewGroup控件),和 JS 端提供的各种 JS Module(如JS EventEmiter模块),都会在C++实现的so中保存起来,双方的通讯通过C++中的保存的映射,最终实现两端的交互 。通信的数据和指令,在中间层会被转为String字符串传输,双向的调用流程如下图 。
文章插图
1.3、打包加载
最终,JS代码会被打包成一个 bundle 文件,自动添加到 App 的资源目录下 。react native 的打包脚本目录为
/node_modules/react-native/local-cli,打包最后会通过 metro 模块压缩 bundle 文件 。而bundle文件只会打包js代码,自然不会包含图片等静态资源,所以打包后的静态资源,其实是被拷贝到对应的平台资源文件夹中 。
其中图片等存在资源的映射规则,比如放在 react native 项目根目录下的 img/pic/logo.png 的资源,编译时,会被重命名后,根据大小 merged 到对应的是drawable目录下,修改名称为img_pic_logo.png 。
- 有哪些制作婚礼电子请柬的APP 制作电子请柬的APP有哪些
- 建造一个标准场需要多少钱 11人场地标准尺寸
- 为什么医生不建议去网上买药 阿里大药房的药可靠吗
- 凤头虎尾打一个字 凤头虎尾打一成语
- 建议卸甲的技巧方法 美甲甲片怎么卸下来
- 5a写字楼和甲级写字楼的区别 5a级甲级写字楼建筑标准
- 含手机创建热点步骤 电脑连接手机热点怎么连
- 老年斑怎么治疗 手上老年斑怎么治疗
- 开个快递超市一个月能盈利多少 快递店一个月能挣多少钱
- 福建客家土楼 福建客家土楼图片