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 #41699:
ComponentDescriptor::adopt签名调整导致生态库 break,后续采用缓冲兼容策略给库作者迁移时间
5. 延伸问答(高频)
Q:为什么 RN 强推“三件套一起开”(Fabric/Turbo/Bridgeless)?
A:因为这三者共同定义了统一运行时假设。只开其中一个会产生“数据通路、调度模型、模块装配方式”不一致,框架与生态都要维护组合爆炸。源码里 deprecated 重载和强校验正是为消除这种组合复杂度。