背景介绍
现有的app类型
native-app
概念
指的是原生程序,一般依托于操作系统,有很强的交互,是一个完整的APP。可拓展性强,需要用户下载安装使用。
优点
用户体验优秀,性能稳定,操作速度快,设计出色的动效等,用户留存率高
缺点
分发成本高,维护成本高,更新缓慢,不同的平台,提交-审核-上线等流程(尤其是IOS),较为复杂。
web-app
web app是采用HTML5语言写出来的APP,不需要下载安装,生存在浏览器中的应用,基本上可以说是触屏版的网页应用。
优点
开发成本低,更新快,更新不需要通知用户,不需要手动升级,跨平台和终端
缺点
临时性的入口,设计受限制,体验较差,复杂的功能对硬件有高的要求
hybird-app
指的是本原生半Web的混合类APP,需要下载安装,看上去类似原生的native-app,但是只有很少的UI web view,用户访问的内容是web。相当于在web应用上嵌套了一层native-app的外壳。
例如很多新闻类的APP,视频类的APP普遍采取的是native的框架,web的内容。
hybird app极力去打造类似原生APP的体验,但是仍然受限于技术,网速等很多因素,尚不完美。
react-native
产出的并不是“网页应用”, 或者说“HTML5应用”,又或者“混合应用”。 最终产品是一个真正的移动应用,从使用感受上和用Objective-C或Java编写的应用相比几乎是无法区分的。 React Native所使用的基础UI组件和原生应用完全一致。
优点
1,hot loading模式可以让开发者省去漫长的编译过程,在应用运行状态下就可以做到热替换新代码。
2,RN可以完美兼容使用OC、Java、swift编写的组件。如果需要针对应用的某一部分做代码优化,中途换成原生代码编写也比较容易。
原理概述(iOS平台)
首先,需要明白的一点是,即使使用了react-native,还是需要UIKit等框架。JS只是辅助,它只提供了配置信息和逻辑的处理结果。RN和hybird没有关系,它只是以JS的形式告诉OC应该执行什么代码。
注:UIKit框架是界面相关操作组件集合,是iPhone应用程序开发中最基本的框架,也是用的最多最重要的框架。
其次,react-native能运行起来,靠的是OC和JS的交互,JS是脚本语言,不会经过编译、链接等操作,而是在运行时动态的进行词法、语法分析,生成抽象语法树(AST)和字节码,然后右解释器负责执行或者使用JIT将字节码转化为机器码再执行。整个流程由JavaScript引擎负责完成。
RN中如何使得JS代码能够“指挥”OC代码
苹果提供了一个叫做JavaScript Core 的框架,这是一个JavaScript引擎。我们可以通过下面的这段代码简单的感受一下OC如何调用
JSContext *context = [[JSContext alloc] init];
JSValue *jsVal = [context evaluateScript:@"21+7"];
int iVal = [jsVal toInt32];
这里的JSContext指的是JS代码的运行环境,通过evaluateScript即可执行JS代码并获取返回结果。
JS是单线程的语言,不具备自运行的能力,总是被调用。很多介绍RN的文章都会提到JS线程的概念,世界上,它表示的是OC创建了一个单独的线程,这个线程只用于执行JS代码,而且JS代码只会在这个线程中执行。
OC与JS交互
JavaScript Core 是面相OC的框架,在OC这一端,我们对JS上下文知根知底,可以很容易发获取到对象,方法等各种信息,包括调用JS函数。
但是JS不知道OC有哪些方法可以调用,RN提供了一套通信机制,可以使得JS来调用OC并且得到结果后回调JS函数。
通信机制
未完待续
网友评论