React Native 0.76版本发布
关于 React Native 的 New Architecture 概念,最早应该是从 2018 年 RN 团队决定重写大量底层实现开始,因为那时候 React Native 面临各种结构问题和性能瓶颈,最终迫使 RN 团队开始进行重构。
而从 React Native 0.68 开始,New Architecture 被作为实验性选择加入项目,之后 2022 年 RN 团队正式发布了 JSI、Fabric、 Turbo Modules、Codegen 的 New Architecture,同时发布的还有 Hermes JS 引擎,在同年 React Native 0.70 版本发布的时候,Hermes 成为了 RN 的默认 Engine 。
但是由于新架构的重构导致了大量的 break change,所以在此之后 RN 团队开始努力推进和解决各种社区新框架问题,而直到 2024 年,新框架模式在 React Native 已经过大规模验证,并为 Meta 的生产应用提供了大量支持,所以从 0.76 开始,整套 New Architecture 实现将成为 React Native 的默认配置。
图片
正如 RN 团队所说:2024 年是向所有 React Native 用户推出新架构的一年,事实上这也证明了,一个项目只要发展时间够长,用户基数够大,最终都会通过重新自研某些能力来解决问题,RN 是这样,Flutter 也是这样。
前情提要
在 RN 上最早 New Architecture 主要围绕四个核心和一个引擎来展开:JSI(JavaScript Interface)、Fabric 、Turbo Modules、CodeGen 和 Hermes Engine,这里我们简单回顾一下他们的作用。
JSI
JSI 属于 JavaScript 接口,它是一个统一的轻量级通用 API,理论上适用于任何 JavaScript 虚拟机,并且它采用 C++ 实现,让 JS 可以使用它直接执行或者调用 Native 代码,所以它的作用就是让 JavaScript 接口与 Engine 分离。
❝ 所以 JSI 的出现让 RN 可以切换 JS 引擎,比如 Chakra、v8、Hermes ,同时允许 JS 和 Native 线程之间的同步相互执行,
JSI 作为接口,它允许 JS 保存对 C++ 对象的引用,反之亦然,例如使用内存引用时,可以直接调用方法而无需序列化成本,例如在实时处理帧数据时,JSI 可以轻松处理更大的帧速率数据,所以 JSI 将最大限度地减少 JS 和原生内存之间的开销。
Fabric
简单理解它就是 RN 在 UI 层的重新实现,类似取代了原本的 UI Manager,主要是为了以充分利用 React 的并发渲染能力,特别是现在的新架构支持 React 18 及更高版本中提供的并发渲染功能。
而得益于前面的 JSI, JS 可以直接调用 Native 方法,其实就包括了 UI 方法,所以 JS 和 UI 线程可以同步执行从而提高列表、跳转、手势处理等的性能。
❝ 在此之前,JS 和 UI 线程不同步,因此在某些情况下 App 可能会因为丢帧而显得卡顿
Turbo Modules
在之前的架构中 JS 使用的所有 Native Modules(例如蓝牙、地理位置、文件存储等)都必须在应用打开之前进行初始化,这意味着即使用户不需要某些模块,但是它仍然必须在启动时进行初始化。
Turbo Modules 基本上是对这些旧的 Native 模块的增强,现在 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间。
Codegen
Codegen 主要是用于保证 JS 代码和 C++ 的 JSI 可以正常通信的静态类型检查器,通过使用类型化的 JS 作为参考来源,CodeGen 将定义可以被 Turbo 模块和 Fabric 使用的接口,另外 Codegen 会在构建时生成 Native 代码,减少运行时的开支。
Hermes
Hermes 是 RN 研发的全新 JS 引擎,而之所以有 Hermes ,是因为它是专为资源受限的设备而设计的存在,并针对启动、应用大小和内存消耗进行了相应优化,Hermes 和其他 JS 引擎之间的一个关键区别是:它能够提前将 JavaScript 源代码编译为字节码。
Hermes 支持提前执行编译的能力,意味着启用了 Hermes 的 React Native 应用会带有预编译的优化字节码,而不是纯 JavaScript 源代码。
Hermes 的存在大大减少了为用户启动的时间,官方曾表示启用 Hermes 通常会将产品的 TTI 指标缩短近一半。
此外 Hermes 还优化了 GC 实现, 采用了 Hades 的全新并发 GC,在 64 位设备上,Hades 在 p99.9 处仅暂停 48 毫秒,比默认的 GenGC 快 34 倍,这也为 React Fiber 启用并发渲染,通过将渲染工作拆分为块来避免调度长 JavaScript 任务提供了良好基础支持。
Interop Layers
所以可以看到,基于 Hermes 引擎的加持,配合 JSI、Fabric 、Turbo Modules、CodeGen 的实现, React Native 像是换了「五脏六腑」,但是这也给它的老旧适配带来了挑战。
随着新架构的推出,社区适配成了它推进的最大阻力,这也是为什么 New Architecture 在 2022 发布之后“落地放缓”的原因,而对于 RN 团队给出的答案是:Interop Layers。
❝ 我的项目也基本停滞在 New Architecture 之前。
在互操作层( Interop Layers )出现之前,当你尝试在新架构上使用 Legacy Component 时,你会看到如下内容:
图片
而 React Native 在 0.72 添加了互操作层(Interop Layers),它的作用是让老旧项目「无需调整」即可运行到 New Architecture,而 React Native 0.74 默认启用:
❝ Interop layer 在 New Architecture 里会重用旧版的原生组件,它属于一个平台层,允许开发者将旧组件注册到 New Renderer(Fabric)里,并将旧函数调用(例如特定属性的 setter)映射到 New Renderer 中的等效 updateProps 函数。
对于新架构,兼容升级最大的成本就是将原生组件迁移到 New Renderer ,因为需要大量时间,并且通常无法自动化,因为范式完全不同,所以现在 Interop layer 实际上是作为一个 wrapper 存在,从而允许旧组件与 New Renderer 一起使用,例如:
❝ 在后台,每当 prop 更新或发送命令时,它都会转发到 New Renderer 的 UIManager ,UIManager 会将消息发送到 wrapper , wrapper 会“小心地”将其转换为传统架构可以理解的格式,并让传统组件处理它,然后它将消息反向传递到 JS,从而更新 UI。
现在互操作层这个 wrapper 会帮助大家解决大部分问题,虽然它并不是完全兼容,而对于 RN 团队的目标来说,它也不是为了 100% 兼容而存在,它更多是为了过渡适配而存在,可以看到,现在在官方统计里,1465 个 package 里已经有 851 支持新架构,所以 0.76 default 也可以说归功于 Interop Layers。
图片
Bridgeless Mode 是在 0.73 被引入,然后 React Native 0.74 默认启用,这也新架构的一个关键功能,在新架构之前,React Native 需要桥(bridge)用于 JS 和原生之间进行通信。
❝ 桥相当于是一个消息队列,会被用于渲染视图、调用本机可调用对象或注册事件处理程序等指令,而桥的存在限制了 React Native 的异步设计、消息批处理和序列化成本。
New Architecture 的很大一部分工作是消除 React Native 对 bridge 的依赖,例如:
-
TurboModules 将本地调用移出了桥接
-
Fabric 将组件渲染从 Bridge 移除
而 Bridgeless Mode 下,会将剩下的 React Native 运行时内容,如错误处理、全局事件发射器、计时器等从桥接中移出,并且不再初始化桥接,也就是 React Native 0.74 将不在有桥接调用的存在。
而由于完全移除了 bridge,所以这个 break change 同样需要 Interop Layers 这个 Wrapper 来充当旧版的兼容实现。
通过 Interop Layers ,大多数注册到 React Native 的遗留模块将受到新的原生模块系统 (TurboModules) 的支持。
此外,Bridgeless Mode 使用 Static ViewConfig 优化了组件渲染,ViewConfig 会告诉 React 原生组件支持哪些 props 和事件。
以前 ViewConfig 是在运行时通过分析原生组件的 ViewManager 生成的,而现在使用 Static ViewConfigs,RN 可以通过分析原生组件的 Flow 或 TypeScript spec 文件,将这项工作转移到构建时完成,如果原生组件没有 spec 文件,那么 Bridgeless 将回退到运行时 ViewConfig 生成。
Suspense & Transitions
一直以来,React Native 会执行与 React for web 相同的 React 框架代码,但是 React Native 需要渲染为通用平台视图(Native 视图)而不是 DOM 节点,这在新架构之前让 RN 很难发挥出 React 的“全力”。
而随着 Fabric 的实现,RN 渲染到 Native 视图是通过 Fabric Renderer 实现,Fabric 允许 React 与每个平台通信并管理其 Native 视图实例,核心原则是在 C++ 中统一更多的渲染逻辑,提高与 Native 平台的可互操作能力。
所以新框架下“同步调用”的能力,让渲染器能够同步测量和渲染 React ,这也让 React 本身的一些概念可以被运用到 RN 上,例如:
-
与 React Suspense 集成,可以在 React 应用中更直观地设计数据获取
-
在 React Native 上启用 React 并发功能,如 Transitions
❝ 这也是新框架的优势,新架构支持 React 18 及更高版本中提供的并发渲染和功能,现在开发者可以在 React Native 代码中使用 Suspense 等功能来获取数据,从而进一步让 Web 和原生 React 开发之间的代码库和概念保持一致。
也就是使用 New Architecture,开发者即可获得 React 18 渲染器的自动批处理,同时并发渲染器还带来了开箱即用的改进,这减少了 React 中的重新渲染。
例如在官方示例中,通过滑块指定要渲染的图块数,将滑块从 0 拖动到 1000 将触发一系列快速的状态更新和重新渲染:
❝ 在使用相同代码时,可以直观地注意到新架构的渲染器提供了更流畅的 UI,中间 UI 更新较少,来自 Native 事件处理程序的状态更新(如顶部 Slider )现在是批处理的模式。
![]()
图片
同时使用新的并发功能(如 Transitions)可以定义 UI 更新的优先级,例如将更新标记为较低优先级,告诉 React 它可以 “中断” 渲染更新以处理更高优先级的更新,以确保在重要的地方提供响应式用户体验。
例如使用startTransition配置可以中断红色方块的渲染,同时startTransition还提供了一个isPending标志来告诉过渡何时完成。
图片
你会注意到,随着 transition 中的频繁更新,React 渲染的中间状态更少,因为它会在 state 过时后立即退出渲染,相比之下,如果没 transition ,则会渲染更多的中间状态。
DevTools
同时随着 0.76 宣布的还有 React Native DevTools,这是为了下一代重写的 React Native 调试器堆栈,它其实从 0.73 就开始存在相应支持。
图片
例如 React Native 0.73 附带的一键调试流程 ,只需在终端中按 J 即可完成调试,而在 0.76 中它默认可用:
图片
可以看到 React Native 的内在已经变得“面目全非”,可以说的是,虽然 RN 当时那一步踩的很大,甚至扯着,但是两年过去终于是开始缓过来了,正如开头官方所说:2024 年是向所有 React Native 用户推出新架构的一年。
同时 New Architecture 还在解锁其他新功能,例如 Web 对齐是也是 Meta 的一个积极探索领域,这也是 RN 开发多年的官方期盼,需要解决的例如:
-
事件循环模型的更新
-
APIs 节点和布局 API
-
样式和布局一致性
虽然已经许久没跟进 React Native ,但是还是很开心 RN 能够持续迭代推进新的能力,这样代表着项目具备旺盛的生命力,同时 RN 在鸿蒙 Next 适配上,类似 Flutter 也有 Software Mansion 和华为的同步社区支持,所以至少现在看来,RN 的未来依然可观。
图片
参考链接:GitHub - reactwg/react-native-new-architecture: Workgroup for the New React Native Architecture
相关文章:

React Native 0.76版本发布
关于 React Native 的 New Architecture 概念,最早应该是从 2018 年 RN 团队决定重写大量底层实现开始,因为那时候 React Native 面临各种结构问题和性能瓶颈,最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始,New A…...

yolo自动化项目实例解析(一)日志格式输出、并发异步多线程、websocket、循环截图、yolo推理、3d寻路
本系列是为了学习自动化操作相关知识点,对开源项目原神ai的技术理解,开源地址如下,拉取版本号为1.78 https://gitee.com/LanRenZhiNeng/lanren-genshin-impact-ai 一、main入口主要函数说明 vi main.py 封装的函数较多,我们拆分…...

获取无人机经纬度是否在指定禁飞区内
1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd...

解读:以RTC为基,AI为脑的“超拟人”AI实时互动解决方案
我们打造了一款满足想象与应用的智能体——AI实时互动。 谈谈AI智能体 当AI变得足够聪明时,用户与AI的交互将变得真实自然。于是,构建高拟真AI与用户的实时交互,已经成为企业提升数智化生产力的新思路。 在这个交互过程中,存在一…...

软件测试学习笔记丨Postman基础使用
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32096 一、Postman基础使用 1.1 简介 Postman是一款流行的API测试工具和开发环境,旨在简化API开发过程、测试和文档编制。优势: Postman可以快速构建请求,…...

HTML5+CSS3面试题:(第一天)
目录 1.HTML5有哪些新特性,移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5? 2.谈谈iframe标签的优缺点? iframe的优点: iframe的缺点: 3.CSS3有哪些新特性? 4.让chrome支持小于12px的…...

微信小程序中的模块化、组件化开发:完整指南
文章目录 前言一、模块化与组件化开发的优势1.1模块化开发的优势1.2 组件化开发的优势 二、组件的抽离标准及规范2.1 抽离组件的标准2.2 组件化开发规范 三、模块化规范的种类及优劣比较3.1 CommonJS3.2 ES6 Modules3.3 优劣对比 四、组件封装:全局组件、分包组件、…...

9.第二阶段x86游戏实战2-初识易语言
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Cortex-A7:__disable_irq和GIC_DisableIRQ、__enable_irq和GIC_EnableIRQ的区别(1)API介绍
0 相关资料 ARM Generic Interrupt Controller Architecture version 2.0.pdf 1 API介绍 1.1 __disable_irq __disable_irq函数的作用是失能IRQ,也就是不响应中断。实现代码如下: /**\brief Disable IRQ Interrupts\details Disables IRQ interrupt…...

MATLAB在嵌入式系统设计中的最佳实践
嵌入式系统设计是一个复杂的过程,涉及硬件和软件的紧密集成。MATLAB提供了一套全面的解决方案,从算法开发到代码生成,再到硬件验证,极大地简化了这一过程。本文将探讨使用MATLAB进行嵌入式系统设计的最佳实践,包括模型…...

wpf 使用Oxyplot 库制作图表示例
方法: InitTable 方法:负责初始化图表模型,包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用,表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法:当前未实现,但预留了子…...

CSS3中的@media查询
CSS3的media查询是一种强大的功能,允许我们根据不同的媒体类型和设备特性来应用不同的样式规则。这使得我们能够创建响应式设计,确保网站或应用在各种设备和屏幕尺寸上都能提供良好的用户体验。本文将详细探讨media查询的定义、语法、使用场景及常见问题…...

fly专享
要逐步熟悉实验中的各个步骤,下面是详细的说明,包括如何下载软件以及相关操作步骤。 1. 熟悉VMware 15虚拟机的使用 步骤说明: 下载VMware Workstation 15: 打开浏览器,访问VMware官方网站:VMware Workst…...

初识Linux · 进程(3)
目录 前言: 进程的创建 前言: 继上文介绍了着重介绍了进程的内部属性,以及在操作系统层面进程如何被组织起来的,如何调用系统接口,有关task_struct,进程的部分理解等,今天,我们就…...

【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么
【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么 DefaultListableBeanFactory开始 spring 容器 DefaultListableBeanFactory DefaultListableBeanFactory是Spring的核心BeanFactory实现,它负责Bean的创…...

基于51单片机的电饭锅控制系统proteus仿真
地址: https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

创建dataSource错误
说明:记录一次启动项目时的异常,如下: Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-09-14 23:27:27.338 ERROR 42260 --- [ main] o.s.boot.SpringA…...

为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器
问题描述 一方面组内的服务器的带宽比较小,另一方面使用bypy方式进行大文件(大于15G)上传时会报错(虽然有时可以成功上传,但是不稳定): 解决方式 总体思路: 获得云盘需要下载文件的直链复制直链到服务器中使用自带…...

53.9k star 提升命令行效率的模糊搜索神器--fzf
fzf简介 作为Linux/Unix命令行的重度用户,你是否还在使用繁琐的管道命令与复杂选项组合来过滤文件和数据?其实我们有一个更简单高效的选择 - fzf。 fzf是一个开源的通用模糊搜索工具,可以大幅度提升命令行的使用体验。它的查询运行速度极快,支持预览选中的文件内容,还能与各…...

项目需求 | MySQL增量备份与恢复的完整操作指南
目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1:启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2:执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…...

判断当前环境是否为docker容器下
判断当前环境是否为docker容器下 webshell后或登录到系统后台,判断是否为docker容器可使用如下方法: 方式一:使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件,所…...

深入理解FastAPI中的root_path:提升API部署灵活性的关键配置
在Web开发领域,FastAPI因其高性能、易于使用和类型提示功能而备受开发者喜爱。然而,当涉及到在生产环境中部署FastAPI应用程序时,我们常常需要面对一些挑战,比如如何正确处理代理服务器添加的路径前缀。这时,root_path…...

QLORA:高效微调量化大型语言模型
人工智能咨询培训老师叶梓 转载标明出处 传统的16位精度微调需要超过780GB的GPU内存,对于参数量极大的模型,如65B(即650亿参数)的模型,在资源有限的情况下大模型的微调几乎是不可能的。华盛顿大学的研究者团队提出了一…...

CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制
版本简介: cesium:1.99;Supermap3D:SuperMap iClient JavaScript 11i(2023); 官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考:support.supermap.com.cn:8090/w…...

Fish-Speech 部署安装指南
Fish Speech 是由 Fish Audio 团队开发的一款开源文本转语音(TTS)模型,它在多语言支持和性能方面取得了显著的突破。根据证据显示,Fish Speech 最新版本为 1.4 版本,该版本不仅提升了对多种语言的支持,还大…...

Excel 国产化替换新方案
前言 在当前数字化转型和信创(信息技术应用创新)战略背景下,企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件,SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…...

在职研生活学习--20240908
文章目录 九月八日清晨,我们在鸟鸣声中醒来,精神饱满地迎接大汇演的挑战。上午,我们被分成舞龙队、旗手队、拳队、鼓队四个特色团队进行练习。阳光下,我们挥汗如雨,却乐此不疲。鼓声隆隆,龙舞飞扬ÿ…...

chattr:修改文件的特殊属性
chattr 命令用于改变文件的特殊属性,也称为"chattr 属性"。这些属性可以提供额外的安全性和控制,如设置文件为不可修改、只允许在文件末尾添加数据等。 一、Linux 文件属性 文件属性是指与文件相关联的元数据,这些属性决…...

vue-router 在新的标签页打开链接/路由
前言 vue-router 在新的标签页打开链接/路由,由于官方没有提供对链接target属性的配置,要实现这个需求,需要自行实现,这里提供几个方案供参考。 调用 API vue-router 的路由实例除了常见的 push, replace, go 等接口࿰…...

Ansys HFSS的边界条件与激励端口
本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…...