React-native的新架构

news2025/7/22 14:46:31

本文总结:

文章主要介绍了 React Native 的新架构,包括以下几个方面的内容:📱✨

  • 如何抹平 iOS 和 Android 样式差异,提升跨平台一致性;

  • 分析了旧架构中存在的问题,如通信瓶颈、启动慢、维护复杂等;

  • 介绍了 JSI 中间层 带来的变革,如:

    • 不再强依赖 JavaScriptCore 引擎

    • 直接在 JS 层调用 Native 方法,提升交互效率;

  • 讲解了 RN 的渲染阶段流程

  • 常用基础库(如 React Navigation)的配套使用;

  • 异常捕捉机制热更新/包体更新的思路。

🔍 关联问题与亮点:

  • 新架构优势是什么? 新架构通过引入 JSI、Fabric 和 TurboModules,解决了旧通信机制的性能瓶颈,提升了启动速度和运行效率。

  • Fabric 如何优化渲染? Fabric 渲染引擎让渲染流程更接近 React 生态,通过异步渲染、协调与 Commit 阶段的优化,实现更流畅的 UI 体验。🌈

  • Turbo Modules 怎样加速? TurboModules 通过 按需加载、延迟初始化 方式提升模块加载性能,且与 JSI 结合使 JS 层调用 Native 层更加轻量、直接。⚡

1、React-native的style

上一篇文章,我们应该已经对跨平台有了一定的概念,但这里其实有一个问题并没有解决,就是其实在ios和安卓上的样式是有差异的,那么我们的Rn就需要去抹平这种差异化,rn中采用的是css-in-js

我们在js中写的style对象,将由单独的一个线程去处理,也就是Shadow thread。在这个线程中由Yoga引擎(这也是facebook开发的)重新去计算app的布局,这个引擎在计算了有关app的东西后,将结果又反馈至UI线程,最终呈现出来。

那么一个完整的老版本的架构是这样的:

然后我们现在把整个流程理一下: 假设我们现在有一段react的代码

<View style={{width: 200, height: 200}}/> 

下一步就是js线程将其序列化

UIManager.createView([352,"RCTView",191,{width":200,"height":200}])

而此时这个task进入到了桥前的异步队列中,它的目的地是ShadowThread,ShadowTread接收到这条信息后,先反序列化,形成Shadow tree,然后传给Yoga,形成原生布局信息。

下一步又先序列化把信息传给native线程,然后拿到后反序列化根据布局信息去进行渲染和绘制。

大伙现在应该已经对一个rn的整体架构有了基本的了解,还记得上篇文章的问题吗?负载和异步会导致性能问题和不确定性。

  • 线程信息的传递因为要减小开销每次都需要反复序列化,但序列化又是一个消耗很大的事情。

  • 异步队列的不确定性,你并不能保证一个事件的顺序。

因此rn的新架构就是要去解决这些问题,也就是现在的中间层。

2、React-native新架构

关于新架构的内容很多,可能有些地方我自己也有理解不当的地方欢迎指正。

我们先讲讲最大的改动,就rn在新架构中直接把老的桥干掉了,直接换成了一个新的中间层或者说通用层,也就是 JS Interface (JSI)。在这个通用层里面有很多的新内容我们可以先看一下这个架构图。

So,我们来看看有哪些变化,上面的图中间部分,就是JSI。(解释一下为啥这个图是这样的,因为就Turbo Modules我其实认为是Native Moudles的加强,而FabricRenderer的加强,他们是原本就存在的)。

1、JS-bundle不再强依赖JavaScriptCore引擎了。我们现在可以很方便用更好的引擎去替换了,性能更好了。比如Hermes

2、JSI让我们可以直接在js层调用native的方法了。由HostObject C++ object实现,它直接存储了native层方法和属性的引用放在了一个全局对象上,然后我们js就可以直接调用java/oc的api

3、Turbo Modules的出现(上图中的Native Moudles),在之前的架构中 JS 使用的所有 Native Modules(例如蓝牙、地理位置、文件存储等)都必须在应用程序打开之前进行初始化,这意味着即使用户不需要某些模块,但是它仍然必须在启动时进行初始化。

Turbo Modules 基本上是对这些旧的 Native 模块的增强,正如在前面介绍的那样,现在 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间。

4、Fabric也就是上图中的renderer(以前shadow层是在native层实现的),一个新的UI渲染器,它就相当于在c++中,可以直接创建一个 ShadowTree,一个就是快,同时也减少了渲染元素的步骤。

可能大家没懂,举个例子:当 App 运行时,React 会执行你的代码并在 JS 中创建一个 ReactElementTree ,基于这棵树渲染器会在 C++ 中创建一个 ReactShadowTreeFabric 会使用 Shadow Tree 来计算 UI 元素的位置,而一旦 Layout 完成,Shadow Tree 就会被转换为由 Native Elements 组成的 HostViewTree(例如:RN 里的 会变成 Android 中的 ViewGroup 和 iOS 中的 UIView)。

5、 codegen其实就是一个静态类型检查器,CodeGen使用类型确定后的 JavaScript 来为Turbo ModulesFabric定义供他们使用的接口元素,并且它会在编译时生成更多的native代码,而非运行时。

3、RN的渲染

将 React 代码渲染到宿主平台,我们称为渲染流水线,可大致分为三个阶段:

  • 渲染(Render):在 JavaScript 中,React 执行那些业务逻辑代码创建 React 元素树(React Element Trees)。然后在 C++ 中,用 React 元素树创建 React 影子树(React Shadow Tree)。

  • 提交(Commit):在 React 影子树完全创建后,渲染器会触发一次提交。这会将 React 元素树和新创建的 React 影子树的提升为“下一棵要挂载的树”。 这个过程中也包括了布局信息计算。

  • 挂载(Mount):React 影子树有了布局计算结果后,它会被转化为一个宿主视图树(Host View Tree)。

4、一些基本的库

Ok,上面都是框架的架构设计,我们先有一个大体的概念,那么现在我们稍微走近实战去了解一些必要的包,因为后面不会怎么讲。

React-native只内置了一些必要的包,但为了尽可能的减小包的大小,许多的包需要你自己去配置,例如:asyncStorage,这种sdk你需要一点点依赖相关的原生知识,但问题不大,一般都会有模版去教你,照着模版就行了(但也不一定,绝大数情况是)。那么我们现在就看看一些常用的包。

3.1、React Navigation

这个应该几乎是每个用rn的同学都该了解的东西了,原生appweb的路由是不同的,在app里其实是没有url这种概念,在原生里要理解screen,也就是说控制用户所见屏幕。在老版本rn有一些原始导航组件去控制屏幕,但很复杂,所以就现在一般都会用到react-navigation这个库。

我直接上实战吧,

import * as React from "react";

import { NavigationContainer } from "@react-navigation/native";

import { createNativeStackNavigator } from "@react-navigation/native-stack";

import Home from "./Home";

import Settings from "./Settings";

const Stack = createNativeStackNavigator();

export default function App() {

return (

    <NavigationContainer>

        <Stack.Navigator>
          <Stack.Screen name="Home" component={Home} />

            <Stack.Screen name="Settings" component={Settings}/>

        </Stack.Navigator>

    </NavigationContainer>

);

}

createNativeStackNavigator创建你的导航组件的一个方法,它返回一个对象,里面有ScreenNavigator2个组件,他们用来配置导航


import React from "react";

import { View, Text, Button, StatusBar } from "react-native";

import styles from "./styles";
export default function Home({ navigation }) {

return (

<View style={styles.container}>

<StatusBar barStyle="dark-content" />

<Text>Home Screen</Text>

<Button

title="Settings"

onPress={() => navigation.navigate("Settings")}/>
</View>
);

}

就看到home组件,当你按下的时候就跳转到settings这个屏幕上去,更多的内容我们后面实战的时候再讲吧,只是做个简单的演示。

3.2 RN组件库

antd mobile估计国内我们基本用的都这个或者就是自己封装的组件库,推荐几个其他的NativeBaseReact Native Element UI KitternReact-native-paper

3.3 启动页

其实启动页就是你js线程启动前展示的过度页面,React-native-bootsplash

3.4 Icon

react-native-vector-iconsreact-native-svg

3.5 异常捕捉

通常,当我们开发一个web应用时,我们很好处理错误,因为它们不会超出JS的范围。简单的说我们前端就是web的王(掌控力),我们可以很容易地看到原因,并在DevTools中打开日志。

Rn因为除了环境的JS之外,我们还有native组件,这也可能导致app执行中的错误。因此,当发生错误时,我们的应用程序将关闭立即我们很难弄清楚原因,因此React-native-exception-handler也正是解决这个问题的包。

就像这样:


import { setJSExceptionHandler, setNativeExceptionHandler } from "react-native-exception-handler";
setJSExceptionHandler((error, isFatal) => {

// …

});

const exceptionhandler = (exceptionString) => {

// 处理异常代码

};

setNativeExceptionHandler(

exceptionhandler,

forceAppQuit,

executeDefaultHandler

);

3.6 包更新 其实如果是ios我们要更新应用上传到商店,有这么个技术OAT可以替换js包,就可以看看微软的Codepush

4.结束

[rn中文文档地址],就这2篇文章都是在理一些基础理论的东西,对于一些组件api大伙可以看看文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 全平台安装指南:从 Linux 到 Windows 的详细教程

目录 一、Git 简介 二、Linux 系统安装指南 1、CentOS/RHEL 系统安装 2、Ubuntu/Debian 系统安装 3、Windows 系统安装 四、安装后配置&#xff08;后面会详细讲解&#xff0c;现在了解即可&#xff09; 五、视频教程参考 一、Git 简介 Git 是一个开源的分布式版本控制系…

Tree 树形组件封装

整体思路 数据结构设计 使用递归的数据结构&#xff08;TreeNode&#xff09;表示树形数据每个节点包含id、name、可选的children数组和selected状态 状态管理 使用useState在组件内部维护树状态的副本通过deepCopyTreeData函数进行深拷贝&#xff0c;避免直接修改原始数据 核…

AI书签管理工具开发全记录(五):后端服务搭建与API实现

文章目录 AI书签管理工具开发全记录&#xff08;四&#xff09;&#xff1a;后端服务搭建与API实现前言 &#x1f4dd;1. 后端框架选型 &#x1f6e0;️2. 项目结构优化 &#x1f4c1;3. API路由设计 &#x1f9ed;分类管理书签管理 4. 数据模型定义 &#x1f4be;分类模型&…

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP

工业机器人服务专家 年轻的 More Robots 公司成立仅一年多&#xff0c;但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务&#xff0c;包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人&#xff0…

多模态大语言模型arxiv论文略读(九十八)

Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题&#xff1a;Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者&#xff1a;Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…

EXCEL--累加,获取大于某个值的第一个数

一、函数 LET(data,A1:A5,cumSum,SCAN(0,data,LAMBDA(a,b,ab)),idx,MATCH(TRUE,cumSum>C1,0),INDEX(data,idx)) 二、函数拆解 1、LET函数&#xff1a;LET(name1, value1, [name2, value2, ...], calculation) name1, name2...&#xff1a;自定义的变量名&#xff08;需以字…

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】

文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址&#xff1a;Ollama 官网下载很慢&#xff0c;甚至出现了下载完显示 无法下载&#xff0c;需要授权 目…

win主机如何结束正在执行的任务进程并重启

最近遇到一个问题&#xff0c;一个java入库程序经常在运行了几个小时之后消息无法入库&#xff0c;由于已经没有研发人员来维护这个程序了&#xff0c;故此只能每隔一段时间来重启这个程序以保证一直有消息入库。 但是谁也不能保证一直有人去看这个程序&#xff0c;并且晚上也不…

maven中的maven-resources-plugin插件详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 一、插件定位与核心功能 maven-resources-plugin是Maven构建工具的核心插件之一&#xff0c;主要用于处理项目中的资源文件&#xff08;如…

ROS云课基础篇-01-Linux-250529

ROS云课基础篇收到了很多反馈&#xff0c;正面评价比例高&#xff0c;还有很多朋友反馈需要写更具体一点。 ROS云课基础篇极简复习-C、工具、导航、巡逻一次走完-CSDN博客 于是&#xff0c;有了这篇以及之后的案例&#xff0c;案例均已经测试过8年&#xff0c;但没有在博客公…

深入了解 C# 异步编程库 AsyncEx

在现代应用程序开发中&#xff0c;异步编程已经成为提升性能和响应能力的关键&#xff0c;尤其在处理网络请求、I/O 操作和其他耗时任务时&#xff0c;异步编程可以有效避免阻塞主线程&#xff0c;提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持&#xff08;通…

Vulhub靶场搭建(Ubuntu)

前言&#xff1a;Vulhub 是一个开源的漏洞靶场平台&#xff0c;全称是 Vulhub: Vulnerable Web Application Environments&#xff0c;主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统&#xff0c;适合渗透测试学习者、…

C++:参数传递方法(Parameter Passing Methods)

目录 1. 值传递&#xff08;Pass by Value&#xff09; 2. 地址传递&#xff08;Pass by Address&#xff09; 3. 引用传递&#xff08;Pass by Reference&#xff09; 数组作为函数参数&#xff08;Array as Parameter&#xff09; 数组作为函数返回值 什么是函数&#xff…

大语言模型的推理能力

2025年&#xff0c;各种会推理的AI模型如雨后春笋般涌现&#xff0c;比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql&#xff0c;我们可能忍受模型的得到正确答案需要更多…

Redis的安装与使用

网址&#xff1a;Spring Data Redis 安装包&#xff1a;Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务&#xff08;注意&#xff1a;每次客户端连接都有先打开服务&#xff01;&#xff01;&#xff01;&#xff09; 按ctrlC退出服务 客户端连接…

2024年数维杯国际大学生数学建模挑战赛C题时间信号脉冲定时噪声抑制与大气时延抑制模型解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 C题 时间信号脉冲定时噪声抑制与大气时延抑制模型 原题再现&#xff1a; 脉冲星是一种快速旋转的中子星&#xff0c;具有连续稳定的旋转&#xff0c;因此被称为“宇宙灯塔”。脉冲星的空间观测在深空航天器导航和时间标准维护中发挥着至…

C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入

在 C# 控制台程序中实现输入验证并循环重试&#xff0c;可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案&#xff1a; 一、通用输入验证框架 public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Val…

TDengine 运维——巡检工具(安装前检查)

简介 本文档旨在介绍 TDengine 安装部署前后配套的巡检工具。 相关工具的功能简介&#xff1a; 工具名称功能简介安装前检查部署前对 TDengine 安装部署的依赖要素进行安装前检查安装前预配置部署前对 TDengine 安装部署的依赖要素进行安装前预配置安装部署指定环境安装部署…

【Linux】权限chmod命令+Linux终端常用快捷键

目录 linux中权限表示形式 解析标识符 权限的数字序号 添加权限命令chmod 使用数字表示法设置权限 使用符号表示法设置权限 linux终端常用快捷键 &#x1f525;个人主页 &#x1f525; &#x1f608;所属专栏&#x1f608; 在 Linux 系统里&#xff0c;权限管理是保障系…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…