菜单

React Native

相关源文件

本文档描述了React仓库中React Native渲染器的实现。它解释了React如何通过React Native渲染器与原生移动平台交互,重点介绍了使React能够渲染到原生移动视图的内部架构和关键组件。

有关React DOM在网络浏览器中的渲染信息,请参阅React DOM

概述

React Native渲染器充当React虚拟DOM与原生移动平台(iOS和Android)之间的桥梁。它将React组件转换为原生UI元素并高效管理更新。React仓库包含核心渲染器实现,而React Native框架仓库则包含原生平台特定的代码。

此代码库中的React Native渲染器有两种形式:

  1. 传统渲染器(Paper)
  2. 现代Fabric渲染器

两种渲染器都服务于相同的目的,但具有不同的架构和性能特点。

来源

架构

React Native渲染器架构

React Native渲染器架构由多个层组成,它们协同工作,将React组件渲染到原生视图。核心React协调器生成更新,这些更新由传统(Paper)或Fabric渲染器处理,然后这些渲染器通过各自的UI管理器与原生平台通信。

来源

渲染过程

渲染过程始于React应用程序调用render()。渲染器通过协调器创建容器,该容器管理组件树。更新通过协调器流向原生平台,而事件则流回React组件。

来源

关键组件

ReactNativeTypes(React Native类型)

ReactNativeTypes.js文件定义了React与React Native之间的接口。它包含各种React Native概念的Flow类型定义,包括:

  • ViewConfig - 定义原生组件的属性和方法
  • AttributeConfiguration - 指定可在组件上设置的属性
  • ReactNativeTypeReactFabricType - 定义两个渲染器的公共API
  • 事件类型和处理程序
  • 布局动画类型和配置

这些类型定义在整个React Native渲染器中广泛使用,以确保类型安全,并为React与原生平台之间提供清晰的契约。

来源

原生组件注册和视图配置

原生组件使用视图配置系统进行注册。每个原生组件都有一个对应的视图配置,用于指定:

  1. 组件的UI视图类名
  2. 可在此组件上设置的有效属性
  3. 组件可以发出的事件类型
  4. 可以发送到组件的命令

视图配置系统是React与原生平台之间的契约,定义了React props如何映射到原生视图属性。

来源

传统渲染器 (ReactNativeRenderer.js)

传统渲染器,通常被称为"Paper"渲染器,是React Native渲染的原始实现。它采用JavaScript驱动的方法,包含以下关键组件:

  1. render - 创建或更新组件树
  2. unmountComponentAtNode - 移除组件树
  3. findNodeHandle - 从React组件获取原生节点句柄
  4. dispatchCommand - 向原生组件发送命令
  5. sendAccessibilityEvent - 向原生组件发送可访问性事件

传统渲染器通过React Native提供的UIManager模块与原生组件通信。

来源

Fabric渲染器 (ReactFabric.js)

Fabric渲染器是一种更新的实现,它通过JavaScript和原生代码之间的直接内存共享来提高性能。其关键组件包括:

  1. render - 创建或更新组件树
  2. stopSurface(以前是unmountComponentAtNode) - 移除组件树
  3. findNodeHandle - 从React组件获取原生节点句柄
  4. dispatchCommand - 向原生组件发送命令
  5. sendAccessibilityEvent - 向原生组件发送可访问性事件
  6. getNodeFromInternalInstanceHandle - 从内部实例句柄获取原生节点
  7. getPublicInstanceFromInternalInstanceHandle - 从内部实例句柄获取公共实例

Fabric渲染器通过nativeFabricUIManager模块与原生组件通信。

来源

通信模式

组件更新和渲染

渲染器通过以下方式管理组件的更新:

  1. 为新组件创建新节点
  2. 更新已更改组件的现有节点
  3. 删除已移除组件的节点

Fabric通过使用持久节点和批量更新来优化此过程,从而最大程度地减少更新UI所需的工作量。

来源

命令分发

React Native组件可以接收来自JavaScript的命令。命令分发过程在两种渲染器中工作方式不同:

传统渲染器(Paper)Fabric渲染器
使用UIManager.dispatchViewManagerCommand使用nativeFabricUIManager.dispatchCommand
需要一个数字标签直接对节点对象操作
同步桥接调用更直接的通信

两种渲染器都暴露了一个dispatchCommand方法,该方法接受组件引用、命令名称和参数。

来源

事件处理

React Native有两种事件类型:

  1. 直接事件 - 直接分发到目标组件
  2. 冒泡事件 - 可以在组件层级结构中向上冒泡

事件系统将原生平台事件桥接到React事件处理程序,由渲染器处理原生事件与React合成事件之间的映射。

来源

错误处理

React Native处理渲染或事件处理过程中发生的错误。两种渲染器都通过以下方式实现错误处理:

  1. nativeOnUncaughtError - 处理渲染过程中未捕获的错误
  2. nativeOnCaughtError - 处理错误边界捕获的错误
  3. ReactFiberErrorDialog集成 - 向用户显示错误对话框

错误处理允许React Native应用程序从错误中恢复,并在出现问题时向用户提供反馈。

来源

传统渲染器与Fabric渲染器对比

下表总结了传统(Paper)和Fabric渲染器之间的主要区别:

功能传统渲染器(Paper)Fabric渲染器
根标签使用LegacyRoot使用ConcurrentRoot
节点表示数字标签对象引用
更新机制通过UIManager更新通过nativeFabricUIManager更直接地更新
性能JavaScript驱动通过共享内存更多地由原生驱动
线程模型单线程支持多线程
同步需要JS与原生之间的同步通过共享内存实现更好的同步
未来支持正在弃用积极的开发重点

Fabric代表着对传统渲染器的重大架构改进,通过与原生平台更直接的集成,带来了更好的性能。

来源

工具和开发者工具

React Native提供了与原生组件交互的实用工具,包括:

  1. findHostInstance_DEPRECATED - 查找组件的主机实例
  2. findNodeHandle - 获取组件的原生节点句柄
  3. measure - 测量组件的布局
  4. measureInWindow - 测量组件在窗口中的位置
  5. measureLayout - 测量组件相对于另一个组件的布局
  6. 用于开发者调试的检查工具

这些实用工具帮助弥合React组件与原生UI元素之间的差距,从而实现高级交互和布局管理。

来源

与React协调器的集成

React Native渲染器通过主机配置与React协调器集成,该配置实现了特定于平台的操作,例如:

  1. 创建和更新实例
  2. 管理文本内容
  3. 处理属性和事件
  4. 管理主机环境

这种集成允许React的核心协调算法与原生移动平台配合工作,从而在移动设备上实现React的组件模型和协调优势。

来源

结论

React仓库中的React Native渲染器在React的虚拟DOM与原生移动平台之间架起了一座关键桥梁。通过其两种实现——传统渲染器(Paper)和Fabric渲染器,它使React组件能够渲染到原生视图,同时保持React的声明式编程模型和高效更新。

Fabric代表了React Native渲染的未来方向,通过与原生平台更直接的集成,性能得到了提升。两种渲染器共享相似的API,但在内部实现和性能特点上有所不同。

了解React Native渲染器架构对于开发高性能React Native应用程序以及为React Native生态系统做出贡献至关重要。