当前位置: 首页 > article >正文

React-native的新架构

本文总结:

文章主要介绍了 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><Buttontitle="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大伙可以看看文档。

相关文章:

React-native的新架构

本文总结: 文章主要介绍了 React Native 的新架构&#xff0c;包括以下几个方面的内容&#xff1a;&#x1f4f1;✨ 如何抹平 iOS 和 Android 样式差异&#xff0c;提升跨平台一致性&#xff1b; 分析了旧架构中存在的问题&#xff0c;如通信瓶颈、启动慢、维护复杂等&#x…...

【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed

问题描述 WiFi进入Meta异常,出现WiFi_HQA_OpenAdapter failed [ 12.694501] mtk_wmtd_worker: [name:wlan_drv_gen4m_6835&][wlan][710]wlanProbeSuccessForLowLatency:(INIT INFO) LowLatency(ProbeOn) [ 12.699854] ccci_fsm: [name:ccci_md_all&][ccci1/fsm]M…...

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;需以字…...

【vscode】切换英文字母大小写快捷键如何配置

按 ⌘(Command) Shift P 打开命令面板搜索 "Transform to Uppercase" 或 "Transform to Lowercase" 点击Transform to Uppercase 命令后的齿轮图标 进入设置页面 然后就可以进行配置了 比如我是mac电脑&#xff0c; 切换大写可以配置为 shift alt…...

vue笔记-路由

文章目录 createWebHistory的使用router-linkrouter-link颜色是黑色&#xff0c;正常应该是蓝色router-link 跳转了但是不展示 其他 vue这个题目还是太大&#xff0c;路由单独拆出来。 createWebHistory的使用 推荐在vue-router4中使用。 1、导入。 import { createRouter, c…...

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

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

域名解析怎么查询?有哪些域名解析查询方式?

在互联网的世界里&#xff0c;域名就像是我们日常生活中的门牌号&#xff0c;帮助我们快速定位到想要访问的网站。而域名解析则是将这个易记的域名转换为计算机能够识别的IP地址的关键过程。当我们想要了解一个网站的域名解析情况&#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;但没有在博客公…...

通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法

在 Spring 和 MyBatis 集成开发中&#xff0c;ComponentScan 和 MapperScan 是两个核心注解&#xff0c;但它们的用途和工作机制截然不同。本文将通过通俗的语言和示例代码&#xff0c;带您轻松掌握它们的区别和使用方法。 一、基础概念 ComponentScan&#xff1a;Spring 的“通…...

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

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

NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制

✅ 1.1 Node.js 的事件循环原理&#xff1f;如何处理异步操作&#xff1f; 面试官您好&#xff0c;我理解事件循环是 Node.js 的异步非阻塞编程核心。 Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型&#xff0c;但它通过事件循环&#xff08;event loop&a…...

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;我们可能忍受模型的得到正确答案需要更多…...

基于BERT和GPT2的实现来理解Transformer的结构和原理

Transformer 核心就是编码器和解码器&#xff0c;简单理解&#xff1a;编码器就是特征提取&#xff0c;解码器就是特征还原。 Transformer 完整架构 Transformer最初是一个Encoder-Decoder架构&#xff0c;用于机器翻译任务&#xff1a; 输入序列 → [Encoder] → 编码表示…...

.net consul服务注册与发现

.NET中Consul服务注册与发现的技术实践 在微服务架构中&#xff0c;服务的注册与发现是至关重要的环节&#xff0c;它能帮助各个服务之间实现高效的通信和协作。Consul作为一款功能强大的工具&#xff0c;为我们提供了优秀的服务注册与发现解决方案。今天&#xff0c;我们就来…...

WifiEspNow库函数详解

WifiEspNow库 项目地址https://github.com/yoursunny/WifiEspNow WifiEspNow 是 ESP-NOW 的 Arduino 库&#xff0c;ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 工作原理及其限制的更多信息&#xff0c;请参阅 ESP-NOW 参考。 WifiEspNow是 ESP-IDF 中 ESP-N…...

rsync使用守护进程启动服务

rsync 本身通常使用 SSH(Secure Shell)协议来进行数据传输,因此它默认使用 SSH 的端口 22。如果使用 rsync 进行通过 SSH 的数据同步,它会通过端口 22 来建立连接。 然而,如果你使用 rsync 作为一个守护进程进行文件同步(即不通过 SSH),则可以配置它使用 TCP 端口 873…...

React 核心概念与生态系统

1. React 简介 React 是由 Facebook 开发并开源的一个用于构建用户界面的 JavaScript 库。它主要用于构建单页应用&#xff08;SPA&#xff09;&#xff0c;其核心理念是组件化和声明式编程&#xff0c;即 ui render(data)。 2. 核心特点 2.1. 声明式编程 React 使用声明式…...

使用React Native开发新闻资讯类鸿蒙应用的准备工作

以下是一篇关于使用React Native开发新闻资讯类鸿蒙应用的准备工作指南&#xff0c;结合鸿蒙生态特性与React Native技术栈整合要点&#xff1a; ​​一、环境搭建与工具链配置​​ ​​基础依赖安装​​ ​​Node.js 18​​&#xff1a;需支持ES2020语法&#xff08;如可选链操…...

node-sass 报错

背景&#xff1a;一些老项目使用"node-sass": “^4.14.1” &#xff0c;node版本要求 14.x&#xff0c;高版本不兼容 解决方案如下&#xff1a; 方案一&#xff1a;替换安装sass (无须降级Node版本) 卸载node-sass npm uninstall node-sass安装sass&#xff08;Dart…...

Redis的安装与使用

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

Linux服务器运维10个基础命令

结合多篇权威资料&#xff0c;以下是运维工程师必须掌握的10个核心命令&#xff0c;涵盖文件管理、系统监控、网络操作等高频场景 1. "ls" 代码分析 "ls" 用于列出目录内容&#xff0c;通过参数组合可增强展示效果&#xff1a; "-l" 显示文件…...