什么是 React Native?
ReactNative(简称RN)是Facebook于2015年4月开源的跨平台联通应用开发框架react native 源码编译,是Facebook原创开源JS框架React在原生联通应用平台上的衍生产品。 它支持iOS和Android平台。 RN使用Javascript语言、类似HTML的JSX以及CSS来开发联通应用,因此熟悉Web后端开发的技术人员只需很少的学习就可以步入联通应用开发领域。 可以称为:Learnnonce、writeanywhere
来源官网:
ReactNative主要特点:
谁在使用 React Native? 从ReactNative的官网我们可以看到以下公司正在使用或者曾经使用过ReactNative的结构。
ReactNative是如何加载和执行的?
首先,编写一段非常简单的ReactNative代码:
当iOS客户端启动时,通过执行以下代码加载ReactNative的根视图。
程序运行后,你会看到右边的界面,这是一个带有原生视图的应用程序!
只需十几行代码,就可以实现一个带有原生视图的应用程序,这真是太神奇了。 那么你会问,这么简单的几行代码如何驱动底层并生成原生应用程序呢? 尽管如此,ReactNative 框架和工具集为您完成了大部分工作。
通过对脚本进行打包编译,编译出来的JSBundle文件非常大。 至于昨天的代码,编译出来的JSBundle足有645KB,上面的内容非常复杂。
react-native bundle --platform ios --entry-file index.js --bundle-output ./bundle/ios/index.ios.bundle --dev false
在讲JSBundle加载之前,我们需要先了解一下ReactNative的核心驱动JavaScriptCore
JavaScript 核心有哪些?
ReactNative的核心驱动力来自于JSEngine。 所有 JS 和 JSX 代码都将由 JSEngine 执行。 在iOS上react native 源码编译,默认的JSEngine是JavaScriptCore,iOS7之后的设备都支持它。 JavaScriptCore源自WebKit,因此Android上也默认使用JavaScriptCore。 JavaScriptCore是一个JavaScript虚拟机,为JavaScript执行提供底层资源。 在浏览器中,位置如下:
JavaScriptCore主要由以下几个模块组成:
下面以IOS客户端的启动为例,讲解ReactNative的启动和加载过程
第一阶段,【创建RCTRootView】->【创建RCTBridge】->【调用【RCTCxxBridgestart】
1.创建JS线程
2.初始化NativeModule
3.创建executorFactory
4.在js线程中初始化通信桥
6.运行js文件(将加载的JS文件交给JSCore解析执行)
第 2 阶段:创建 ContentView 并加载应用程序
一种是创建 RCTRootContentView,向视图添加手势识别器,然后在bridge.uiManager 中注册自身。
第二个是加载应用程序
[bridge enqueueJSCall:@"AppRegistry"
method:@"runApplication"
args:@[moduleName, appParameters]
completion:NULL];
执行完毕后,执行bounce方法callNativeModules,最终弹跳到native模块
关键的 JavaScript 类 AppRegistry。
AppRegistry是所有ReactNative应用程序的JS入口。 应用程序的根组件应该通过AppRegistry.registerComponent注册自身,然后原生系统可以在启动完成后调用AppRegistry.runApplication来加载应用程序的代码包并运行应用程序。
1.ReactNative代码,定义App,并注册
AppRegistry.registerComponent的代码实现
iOS客户端启动程序并运行对应的ReactNative应用程序
AppRegistry.runApplication 的实现
总体来说,ReactNative的技术框架如下:
ReactNative的通信机制
1.ReactNative页面调用native方式
在Native中,编写一个实现“RCTBridgeModule”协议的Objective-C类
通过RCT_EXPORT_METHOD宏,曝光方法
2. Native方式通知ReactNative页面
在Native代码中,定义一个继承自RCTEventEmitter的类
当原生代码需要通知ReactNative页面时,通过sendEventWithName:body:将事件和参数广播到ReactNative页面。
其实ReactNative页面需要为用户注册,代码如下:
参考:
RN源代码:
RN官方文档(入门):
英语:
ReactNative源码分析--IOS客户端启动流程(从OC到JS):
ReactNative分析:
JavaScriptCore综合分析: