Skip to content
目录

New Architecture:Fabric / TurboModules / Bridgeless

1. 默认入口与开关语义

Android 侧关键入口:ReactAndroid/.../DefaultNewArchitectureEntryPoint.kt

核心事实:

  • load() 默认开启 turboModulesEnabled=true, fabricEnabled=true, bridgelessEnabled=true
  • 旧式“分别开关三者”的重载方法已标记 @Deprecated
  • isConfigurationValid 明确要求三者同时开启,否则抛错

设计意图:避免出现“半新架构”组合,减少行为不一致与生态适配成本。

关键代码(节选):

kotlin
/**
 * By default it also enables both TurboModules, Fabric and Concurrent React (aka React 18), and
 * Bridgeless
 */
@JvmStatic
public fun load() {
  load(turboModulesEnabled = true, fabricEnabled = true, bridgelessEnabled = true)
}

2. Bridgeless 不是孤立特性,而是新架构组合的一部分

在 Android 默认 Host:DefaultReactNativeHost.kt

  • isNewArchEnabled=false 路径直接报错(0.82+)
  • toReactHost() 默认 JS runtime 工厂使用 HermesInstance()
  • UIManager 通过 FabricUIManagerProviderImpl 建立 Fabric 流程

在 iOS 默认工厂代理:Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm

  • newArchEnabled/bridgelessEnabled/fabricEnabled/turboModuleEnabled 全部返回 YES

在 iOS RootView 工厂:Libraries/AppDelegate/RCTRootViewFactory.mm

  • 初始化中显式开启 TurboModule interop:
    • RCTEnableTurboModuleInterop(YES)
    • RCTEnableTurboModuleInteropBridgeProxy(YES)

关键代码(节选):

objc
// Enable TurboModule interop by default in Bridgeless mode
RCTEnableTurboModuleInterop(YES);
RCTEnableTurboModuleInteropBridgeProxy(YES);

3. Feature Flags 在新架构中的角色

src/private/featureflags/__docs__/README.md 给出的系统设计:

  • Flag 源定义在 JS 配置文件
  • 自动 codegen 到 C++ / Kotlin / JS
  • 多层缓存(避免 JNI/JSI 热路径重复开销)
  • 可在应用级 override,但必须在首次读取前完成

表述重点:RN 新架构不是硬编码,而是“可演进开关系统 + 代码生成 + 多语言一致语义”。

4. 生态兼容与历史包袱处理

Bridgeless 迁移中的典型问题与修复:

  • PR #38202:修复 interop 层对 legacy 模块附着 bridge/bridgeless 抽象能力的问题

Fabric 迁移中的兼容策略:

  • Issue #41699ComponentDescriptor::adopt 签名调整导致生态库 break,后续采用缓冲兼容策略给库作者迁移时间

5. 延伸问答(高频)

Q:为什么 RN 强推“三件套一起开”(Fabric/Turbo/Bridgeless)?

A:因为这三者共同定义了统一运行时假设。只开其中一个会产生“数据通路、调度模型、模块装配方式”不一致,框架与生态都要维护组合爆炸。源码里 deprecated 重载和强校验正是为消除这种组合复杂度。

MIT License.