Skip to content
雲里
里雾

RN 新架构验证方法

react native 开发 更新于 2026/4/13

本页说明为何构建层的 newArchEnabled: true 声明不足以证明新架构真正运行,并给出从 RN 0.65 到 0.81 各版本的可靠运行时检测方法及版本对照表。

为什么需要运行时验证

app.json 里的 newArchEnabled: true 只是构建层的声明——告诉 Expo/Metro 按新架构编译。它不能证明运行时真的跑在 Bridgeless 模式下。第三方库兼容性问题或构建配置错误可能导致 Bridge 悄悄 fallback。运行时检测才是证据

各版本可靠的检测方法

RN 0.81 / Expo SDK 54 (当前推荐)

// global.RN$Bridgeless 是 RN 0.81 引入的官方标志位
// 仅在 Bridgeless 模式下由原生侧注入为 true
const isBridgeless = (global as any).RN$Bridgeless === true;

这是目前唯一可靠的 JS 侧检测方式。如果值为 true,说明 Bridge 代码完全未加载。

旧方法:RN 0.68–0.74(已失效于 Bridgeless)

// __turboModuleProxy 在 TurboModules 启用时由原生注入
// 但在 Bridgeless 模式下(RN 0.76+),这个全局变量不再挂载
const hasTurboModules = (global as any).__turboModuleProxy != null;
// ⚠️ 在 Expo SDK 54 上这个检测会返回 false——即使新架构确实开启

更旧的方法(RN 0.65 前的讨论,已完全失效)

// nativeCallSyncHook 曾被用来检测 JSI 是否可用
// 在现代 RN 版本中同样不可靠,不应使用
const hasJSI = (global as any).nativeCallSyncHook != null;

MindGym M0 的实际检测代码

来自 MindGym 项目 M0 Task 6 的验证实现(src/utils/archCheck.ts):

// 检测新架构状态——用于开发期 Debug 信息展示
// RN$Bridgeless 由 RN 0.81 原生侧在启动时注入
// 只检测这一个变量,不依赖已废弃的 __turboModuleProxy
export function getArchInfo(): { bridgeless: boolean } {
  return {
    bridgeless: (global as any).RN$Bridgeless === true,
  };
}

版本对照表

RN 版本Expo SDK推荐检测方式备注
0.65–0.67nativeCallSyncHook仅检测 JSI,不检测 Fabric
0.68–0.7449–50__turboModuleProxy检测 TurboModules
0.75–0.8051–53__turboModuleProxyRN$Bridgeless过渡期,两者共存
0.81+54+RN$Bridgeless唯一可靠方式

参见

参考

版本说明