React Native 原理

React Native 是一个跨平台移动应用开发框架,它允许开发者使用 JavaScript 和 React 来开发 iOS 和 Android 原生应用。React Native 的核心原理是通过 桥接(Bridge) 技术,使用 JavaScript 来控制原生组件,并将应用逻辑与原生代码进行交互。

React Native 原理概述

React Native 的基本原理是利用 JavaScript 线程原生线程 进行通信,构建跨平台的原生应用。具体来说,它采用了 虚拟 DOM桥接机制,使得 JavaScript 代码与原生 UI 组件能够相互协调和交互。

以下是 React Native 的工作原理的几个关键组成部分:

1. JavaScript 线程与原生线程

React Native 将应用的逻辑(JS 代码)和 UI 渲染分配给不同的线程:

JavaScript 线程:运行 JavaScript 代码的线程,主要用于执行业务逻辑和管理应用的状态。

原生线程:负责 UI 渲染和原生代码执行(例如 UIKit 或 Android Views)。这个线程会管理所有原生控件的渲染,保持 UI 的流畅性。

2. 虚拟 DOM 与 UI 渲染

React Native 使用与 React 类似的 虚拟 DOM(Virtual DOM)来管理 UI 的更新:

• 当 JS 线程发生状态变化时,React Native 会重新渲染虚拟 DOM。

• 经过差异化计算后,React Native 将更新的 UI 信息传递给原生线程。

• 原生线程通过原生控件(如 <View>、<Text>)更新应用的界面。

3. 桥接(Bridge)机制

React Native 通过 桥接(Bridge)机制来实现 JavaScript 线程和原生线程之间的通信。桥接是 React Native 的核心,它使得 JavaScript 可以调用原生模块(如相机、定位、传感器等)。

JavaScript 与原生模块的通信:通过桥接,JavaScript 线程可以向原生线程发送消息(例如发起网络请求、读取文件),并等待响应。

原生与 JavaScript 的回调:原生代码也可以通过桥接机制向 JavaScript 发送消息,从而触发 JavaScript 中的回调函数。

桥接的机制大致如下:

• JavaScript 线程执行应用逻辑,并通过桥接向原生线程发送调用请求。

• 原生线程执行请求,并通过桥接将结果返回 JavaScript 线程。

• JavaScript 根据结果更新虚拟 DOM,并最终更新原生 UI。

4. 原生组件与 JavaScript 组件

React Native 提供了封装好的 原生组件(如 <View>、<Text>、<Button> 等)和 JavaScript 组件(如业务逻辑组件)。这些组件都可以在应用中进行组合和使用。

原生组件:React Native 会将原生组件映射成原生控件。例如,<View> 在 Android 上会变成 View 控件,在 iOS 上变成 UIView 控件。

JavaScript 组件:这些组件包含业务逻辑,React Native 会通过桥接机制与原生 UI 组件进行交互。

5. 异步执行和多线程

React Native 是基于异步编程的:

UI 渲染线程JS 执行线程是独立的,彼此并行工作,避免了阻塞和卡顿。

异步调用:大部分与原生模块的交互都是异步的,这可以避免主线程被阻塞,确保 UI 渲染的流畅性。

批量更新:React Native 会将一系列 UI 更新合并为一次更新,从而减少不必要的渲染,提高性能。

6. React Native 的架构图

在 React Native 的架构中,通常会有以下几个部分:

1. JS 层:

• 编写的 JavaScript 代码运行在 JavaScript 引擎(如 V8 或 JavaScriptCore)中,负责应用逻辑、状态管理、业务处理等。

2. React 层:

• React 负责 UI 的状态管理和虚拟 DOM 渲染。它与原生层通过桥接进行通信。

3. 桥接(Bridge)层:

• 充当 JavaScript 层和原生层之间的中介。所有的 JS 与原生组件的交互都通过这个桥进行。

4. 原生层:

• 包含原生 UI 组件和原生代码,直接与操作系统交互(如 UI 控件、文件系统、传感器等)。

另一个层面理解:

  • Java层: 主要负责 Native 的 UI 渲染和底层功能调用, Java 层的核心 jar 包是 react-native.jar, 封装了很多接口, 例如 Module, Registry, Bridge
  • C++层: 主要封装了 JavaScriptCore, 起到了解析 JS 代码的作用
  • JS 层: 利用 JS 代码去进行事件的分发和 UI 代码的编写, 主要以下几部分:
    • Component: 编写 JSX 来构建虚拟 DOM
    • Lifecycle: 生命周期必不可少, 可以在组件的各种时期器进行一些操作
    • Layout: 使用 FlexBox 进行布局, 用 css-layout, 不依赖 DOM, 可以编译成 Native 端代码, 用于布局样式的展示, 目前不支持 CSS3


 

RN 现在主要有 3 个线程

  1. JS Thread 执行线程, 负责逻辑层面的处理, Metro 将 React 源码打包成 bundle 文件, 然后传给 JS 引擎执行, 现在 IOS 和 Android 统一的是 JSC
  2. UI Thead 主要主责原生渲染 Native UI 和调用原生能力 (Native Module)
  3. Shadow Thead 这个线程主要创建 Shadow Tree 来模拟 React 结构树, RN 使用 Flexbox 布局, 但是原生不支持, Yoga 引擎就是将 Flexbox 布局转换为原生布局的

7. 如何实现跨平台

React Native 的跨平台特性主要依赖于以下两点:

组件封装:React Native 提供的核心组件是跨平台的,例如 <View>、<Text> 等,它们在 Android 和 iOS 上都能渲染为各自原生平台的 UI 控件。

平台差异处理:React Native 允许开发者通过 Platform API 来处理不同平台之间的差异,做出平台特定的调整。

• 例如:Platform.OS === 'ios' 用于判断当前平台是 iOS,Platform.select() 可用来为不同平台选择不同的组件或样式。

8. 开发和调试

React Native 提供了良好的开发体验:

热重载:React Native 支持热重载(Hot Reloading),即修改代码后,应用会立即重新加载,只更新修改过的部分,提升开发效率。

远程调试:开发者可以通过 Chrome 浏览器调试 JavaScript 代码,方便排查问题。

9. 原生模块和库

如果 React Native 中没有提供某些功能,开发者可以通过原生模块或第三方库来扩展 React Native:

原生模块:使用原生语言(Java/Kotlin 或 Objective-C/Swift)编写,暴露给 JavaScript 使用。

第三方库:React Native 社区有很多开源的第三方库,可以在应用中使用它们来快速实现功能。

总结

React Native 的原理通过 JavaScript 和原生代码之间的桥接实现了跨平台的能力。它通过将业务逻辑与 UI 渲染分开,采用虚拟 DOM 和异步执行机制,能够在 iOS 和 Android 上以接近原生的性能和体验运行。同时,它保持了 React 风格的声明式编程,减少了开发者的工作量。

拓展

React Native 的不足

由于 React Native 和原生交互依赖的只有一个 Bridge,而且 JS 和 Native 交互是异步的,所以对需要和 Native 大量实时交互的功能可能会有性能上的不足,比如动画效率,性能是不如原生的

React Native 始终是依赖原生的能力,所以摆脱不了对原生的依赖,相对 Flutter 的自己来画 UI 来说,React Native 显得有些尴尬。

和其他跨端技术比较

Flutter vs React Native

开发体验

React Native 在界面开发延续了 React 开发风格,支持 css-in-js(其实就是用 js 来写 css),而且在 0.59 版本之后支持了 React Hook 函数式编程,开发的时候大多只关心样式界面的搭建,原生能力有客户端或者 Bridge 实现。

Flutter 最大的特点在于:Flutter 是一套平台无关的 UI 框架,并且在 Flutter 里面万物皆 Widget。很多时候开发一个控件需要嵌套多个 Widget 去实现,与 JS 里面的回调地狱有点像,而这也是被吐槽代码嵌套样式难看的原因。

状态管理

React Native 和 Flutter 对于状态管理,两者有着很高的相似度,虽然内部实现很大差别,但是都可以获取 state 和 setState 的方式去更新页面的状态。

产物

React Native 产生的是 bundle 文件,实际上就是 JS 脚本文件;而 Flutter 编译后 Android 产生的主要是一些应用程序指令段、数据段,虚拟机数据段、指令段,iOS 则是 App.framework,其实也是一些原生的数据集。

原生能力 & 性能

其实两者的在这方面的区别不是很大,性能方面 React Native 稍微差一点。但是在原生灵活性上 React Native 要有优势。


JSI

javascript interface js虚拟机通用接口层,是针对JS引擎封装的上层API框架,使用JSI做JS引擎调用的优点:

1.底部可以任意替换JS引擎而不影响上层JS引擎的使用。如:可以任意替换JavaScript Core, V8等。

2.通过JSI,JavaScript可以持有C++宿主对象的引用,所以可以直接调用原生方法(UIView, NativeModule),它与现在统一使用Bridge这个通道和消息异步调用比起来,提高了消息发送的及时性,避免了消息队列执行的等待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980371.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI之状态管理全解析

文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…

win32汇编环境,窗口程序使用树形视图示例一

;运行效果 ;win32汇编环境,窗口程序使用树形视图示例一 ;树形视图控件Treeview,就是那种点击后,会展开的控件,类似于文件夹列表。这里展示了最基本的应用,纯文本模式的展开树形视图,同时获得选中项的内容 ;字体丑了点,这里主要解释原理了,懒得设置了。直接抄进RadAsm可编…

金融支付行业技术侧重点

1. 合规问题 第三方支付系统的平稳运营&#xff0c;严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提&#xff0c;其中第十八条的规定堪称重中之重&#xff0c;是支付机构必须牢牢把握的关键准则。 第十八条明确指出&#xff0c;非银行支付机构需构建起必要且独…

FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新&#xff0c;例如php 7.3.7升级到了7.3.8&#xff0c;另外之前的版本有同学踩了坑&#xff0c;主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面会提到&#xff0c;请各位同学留意。 因为最近换电脑…

【卫星语音通信】神经网络语音编解码算法:AudioDec

引言&#xff1a;低码率时代的语音革命 在偏远山区的蜂窝基站与卫星电话之间&#xff0c;在远洋货轮的应急通信频道里&#xff0c;清晰流畅的语音传输往往关乎生命财产安全。传统蜂窝通信&#xff08;如4G VoLTE&#xff09;和卫星通信系统&#xff08;如海事卫星电话&#xf…

大数据学习(53)-Hive与Impala

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

【基于Raft的KV共识算法】-序:Raft概述

本文目录 1.为什么会有Raft&#xff1f;CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体&#xff1f; 3.实现思路任期领导选举日志同步 1.为什么会有Raft&#xff1f; 简单来说就是数据会随着业务和时间的增长&#xff0c;单机不能存的下&#xff0c;这个时候需要以某种…

Redis---LRU原理与算法实现

文章目录 LRU概念理解LRU原理基于HashMap和双向链表实现LRURedis中的LRU的实现LRU时钟淘汰策略近似LRU的实现LRU算法的优化 Redis LRU的核心代码逻辑Redis LRU的核心代码逻辑Redis LRU的配置参数Redis LRU的优缺点Redis LRU的优缺点 LRU概念理解 LRU&#xff08;Least Recentl…

【Java-黑马程序员】2024IDEA下载安装[ IntelliJ IDEA]

IDEA概述 IntelliJ IDEA – 用于 Pro Java 和 Kotlin 开发的 IDEhttps://www.jetbrains.com/idea/安装:傻瓜式安装,建议修改安装路径。 选择版本 Ultimate:功能全面,适合企业开发,需付费。 Community:免费,适合个人和小型项目。 选择适合你操作系统的版本 Windows版…

centos 下dockers部署surveyking-docker开源考试系统

下载初始化脚本&#xff0c;并自动部署至当前文件夹 https://raw.githubusercontent.com/xianyu-one/surveyking-docker/main/setup.sh -O setup.sh chmod x setup.sh bash setup.sh 手工部署 1:先卸载这些旧版本&#xff0c;以及关联的依赖项sudo yum remove docker docker-…

[3/11]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码

[3]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码 前言 在C#开发中&#xff0c;性能优化是提升系统响应速度和资源利用率的关键环节。 当然&#xff0c;同样是所有程序的关键环节。 通过遵循下述建议&#xff0c;可以有效地减少不必要的对象创建&#xff0c;从而减…

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装

【deepseek第二课】docker部署dify&#xff0c;配置私有化知识库&#xff0c;解决网络超时&#xff0c;成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错&#xff0c;网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程 2. 页面探索2.1 设置管理账号2.2 添加…

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊&#xff1a; Water Resource…

在C++中如何实现线程安全的队列

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言如何实现一个线程安全的队列思路应用场景代码实现总结 前言 在一次和豆包的模拟面试中&#xff0c;豆包问我&#xff1a;“在C中&#xf…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

[操作系统] 文件的软链接和硬链接

文章目录 引言硬链接&#xff08;Hard Link&#xff09;什么是硬链接&#xff1f;硬链接的特性硬链接的用途 软链接&#xff08;Symbolic Link&#xff09;什么是软链接&#xff1f;软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…

c# winform程序 vs2022 打包生成安装包

最近&#xff0c;利用c# winform程序该客户开发一套进销存管理系统&#xff0c;项目在部署前&#xff0c;需要生成安装包&#xff0c;以便部署在客户电脑上面。总结步骤如下&#xff1a; 1、在打包之前 (VS中需要包括Microsoft visual studio installer projects扩展项目)&…