1.简介
learn once, write everywhere
设计理念:既拥有Native的用户体验、又保留React的开发效率
优点:
- 跨平台
- 上手快
- 原生体验
缺点:
- Native的原生控件有更好的体验;
- Native有更好的手势识别;
- Native有更合适的线程模型,尽管Web Worker可以解决一部分问题,但如图像解码、文本渲染仍无法多线程渲染,这影响了Web的流畅性。
2.原理
JavaScriptCore: 负责 bundle 产出的 JS 代码的解析和执行;
JS Engine: JS 的运行环境;
React Native 会把应用的 JS 代码编译成一个 JS 文件(x x.bundle),React Native 框架的目标就是解释运行这个 JS 脚本文件。如果是 Native 拓展的 API,则直接通过 bridge 调用 Native 方法,最基础的比如绘制 UI 界面,映射 Virtual DOM 到真实的 UI 组件中。
Bridge: 给 React Native 内嵌的 JS Engine 提供原生接口的扩展供 JS 调用;
所有的本地存储、图片资源访问、图形图像绘制、3D 加速、网络访问、震动效果、NFC、原生控件绘制、地图、定位、通知等都是通过 Bridge 封装成 JS 接口以后注入 JS Engine 供 JS 调用。
React Native 同样借助 JS Engine 的能力,基于 JavaScriptCore 来执行 JS,但是是通过 Bridge 来进行交互的,JS 不会直接引用 Native 层的对象实例,Native 也不会直接引用 JS 层的对象实例
3.环境配置
iOS 所需环境: Node、Watchman、Xcode、CocoaPods。
Android 所需环境: Node、Watchman、JDK 和 Android Studio。
具体查看官网
4.API概述
- 基础UI组件:如 View,Text,Image,TextInput,ScrollView 和 StyleSheet。此外,还提供了UI控件,如Button,Picker,Slider 和 Switch。
- 列表:FlatList(用于呈现可滚动列表)和 SectionList(类似于 FlatList 但用于分段列表)的列表
- Android 专用组件:如 Android BackHandler,DatePickerAndroid,ToastAndroid。
- iOS 专用组件:如 AlertIOS,ImagePickerIOS,NavitatorIOS,TabBarIOS。
- 通用组件:可以在 Components and APIs 上查询所有的公共组件
核心组件与原生组件转换:
TextInput:处理文本输入
ScrollView: 滚动视图
FlatList: 长列表滚动:加载当前可视列表,渲染元素结构近似而仅数据不同。
特定平台代码:Platform, StyleSheet , 特定平台扩展名
5.Flutter vs React Native
Flutter 是由谷歌开发的软件开发工具包(SDK)
React Native 由 Facebook 建立的,基于 React 用于创建移动应用程序,而不会影响应用程序的外观和感觉
开发体验
React Native : 开发的时候大多只关心样式界面的搭建,原生能力有客户端或者 Bridge 实现。
Flutter : 一套平台无关的 UI 框架,并且在 Flutter 里面万物皆 Widget。但开发一个控件需要嵌套多个 Widget 去实现,会产生回调地狱问题
产物
react Native 产生的是 bundle 文件,实际上就是 JS 脚本文件;
Flutter 编译后 Android 产生的主要是一些应用程序指令段、数据段,虚拟机数据段、指令段,iOS 则是 App.framework,原生的数据集。
原生能力 & 性能
区别不是很大,性能方面 React Native 稍微差一点,原生灵活性上 React Native 要有优势