RN 新架构全量落地半年了,聊聊 Fabric、TurboModules 和那个消失的 Bridge

RN 新架构全量落地半年了,聊聊 Fabric、TurboModules 和那消失的 Bridge

React Native 的新架构喊了好几年,之前一直觉得是”未来可期”。但到了 2026 年中回头看,这件事已经彻底变了——RN 从 0.82 开始,旧架构连根拔了。如果你还在用 Bridge 那一套写 RN,是时候认真看看这个新架构到底长什么样了。

新架构到底多了什么

先别被 Fabric、TurboModules、JSI、Bridgeless 这一串名词吓到,其实新架构就干了三件事:

第一件事:把 Bridge 拆了。 旧架构里 JS 和 Native 通信全靠 Bridge——异步、序列化 JSON、丢来丢去。每次调用走一套”JS 序列化 → C++ 桥 → Native 反序列化 → 执行 → 再反序列化回来”的流程,单次延迟 5-15ms。

JSI(JavaScript Interface)直接把这条链路变成了 JS 和 Native 共享内存指针,Native 方法像调用本地函数一样直接。可以理解成原来两家中间有个翻译官,现在两边直接对话了。

// 旧 Bridge 模式:异步回调
NativeModules.CalcModule.add(2, 3, (result) => {
  console.log(result);
});

// JSI 模式:直接调
const result = await TurboModuleRegistry
  .get<CalcSpec>('CalcModule')
  .add(2, 3);

第二件事:重新做了渲染层。 Fabric 不是新的渲染引擎,它是新架构里 UI 渲染管线的代号。以前 Shadow Thread 算完布局往 UI Thread 丢也是一套 JSON 序列化,Fabric 直接拿 C++ 结构体跨线程传,Props 用扁平对象,计算量少了一个数量级。

第三件事:原生模块按需加载。 旧架构里所有 Native Modules 在 App 启动时全量注册,不管用不用都占内存。TurboModules 改成懒加载——用到哪个模块才真正初始化哪个。

三个改进合在一起,效果用一句人话总结就是:RN 终于不是”优雅但卡”了。

RN 0.82 是个分水岭

去年 10 月发布的 RN 0.82 是第一个完全砍掉旧架构的版本。官方拿 Expensify 测试的数据挺实在的:

指标 提升幅度
模块加载时间(Android) +3.2%
模块加载时间(iOS) +9%
总可交互时间(TTI Android) +7.6%
总可交互时间(TTI iOS) +2.5%
内容可交互时间(Content TTI Android) +7.2%
内容可交互时间(Content TTI iOS) +7.5%

这些数据看着不算夸张,但要知道 0.82 之前很多项目就已经跑在新架构上了。等于是把”兼容模式”删掉后,纯新架构的基准性能。

另外 0.82 同步推了 Hermes V1 编译器,结合 AOT 字节码预编译,冷启动时间能砍 30-50%。

但最有意思的数字不是基准测试——我在团队的实际项目里做了对比,一个带长列表和交互动画的页面:

  • 旧架构(RN 0.66 + Bridge): 平均帧率 45-50fps,列表快速滑动偶发掉到 30fps
  • 新架构(RN 0.82 + JSI + Fabric): 平均帧率 55-60fps,快速滑动基本不掉

说起来只有 10fps 的差距,但实际体感是”能用了”和”还挺丝滑”的区别。

迁移不是一键搞定,但有套路

如果你的项目还在 RN 0.70 以下,迁移到新架构确实要费点功夫。我踩过几个坑,直接记下来:

1. Native Modules 全部要写 Spec

Codegen 会根据 TypeScript 的 Spec 文件自动生成跨语言的胶水代码。参数类型必须限制在 string、number、boolean 和扁平对象,Date、Map、Set 这些没法直接映射到 C++ 的类型得自己转。

// RepoDetailModule.spec.tsx
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export interface RepoDetailResult {
  readonly fullName: string;
  readonly description: string | null;
  readonly stars: number;
  readonly forks: number;
  readonly language: string | null;
}

export interface RepoDetailSpec extends TurboModule {
  getCachedDetail(fullName: string): Promise<RepoDetailResult | null>;
  fetchDetail(fullName: string): Promise<RepoDetailResult>;
}

export default TurboModuleRegistry.register<RepoDetailSpec>(
  'RepoDetailModule',
  (rawModule) => rawModule,
);

2. Fabric 组件的 Props 不能传函数

这是 Fabric 的硬约束——Props 必须可序列化成 C++ 结构体。以前喜欢把 onPress 当 prop 传的做法要改成收事件系统。

// ❌ 旧写法:Prop 传函数
<MyButton onPress={() => handleClick()} />

// ✅ 新写法:通过事件系统
<MyButton
  onPress={event => handleClick(event.nativeEvent)}
/>

3. 第三方库的适配状态

到 2026 年中,主流社区库基本都适配了新架构。react-native-gesture-handler、react-native-reanimated、react-native-fast-image 这些大库在 2.0+ 版本都原生支持 Fabric。少数小众库如果还没适配,可以检查它们的 package.json 里有没有 codegenConfig

4. 渐进式迁移的坑

如果你的 App 既有 New Architecture 模块又有旧 Bridge 模块,RN 0.76+ 提供了一个兼容层来自动降级。但注意:Bridge 代理层有额外开销,混合使用的时候新架构的性能优势会打折扣。最好定一个截止时间,集中把旧模块清掉。

值得关注的其他变化

新架构落地后,RN 生态还有几个趋势值得留意:

React Native Web + 新架构 RNGH(React Native Gesture Handler)全面支持 Fabric 后,Web 端的手势体验也提升了一大截。跨端项目用同一套手势逻辑不再是做梦。

热更新依然是杀手锏 跟 Flutter 那种编译成机器码的方案不同,RN 的 JS Bundle 热更新机制在新架构下依然完好。国内互联网场景下,CodePush 或自建热更新服务仍然是对抗审核周期的利器。

Expo 的门槛持续降低 Expo SDK 52-54 的迭代对新架构的支持越来越完整。如果你的项目是绿场启动,从 Expo 起步基本把原生配置的痛全避开了。

所以要不要升

如果你是新项目:直接上 RN 0.82+,新架构默认开启,没理由回头。

如果你是老项目:分两种情况—— – 如果还在 RN 0.66 以下,先升级到 0.72 左右,把社区库适配好后,再跳到 0.82 启用新架构,一步到位容易炸。 – 如果已经在 0.74-0.78 区间,可以直接冲 0.82,社区库适配度已经很高了。

总体来说,RN 新架构不是噱头,它是实打实的底层重写。2015 年生的 React Native,十一岁的时候终于把”慢”这个标签撕掉了。

评论区

0 条评论

登录后可评论。

查看完整榜单
查看完整榜单
查看完整榜单