本页说明为何构建层的 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.67 | — | nativeCallSyncHook | 仅检测 JSI,不检测 Fabric |
| 0.68–0.74 | 49–50 | __turboModuleProxy | 检测 TurboModules |
| 0.75–0.80 | 51–53 | __turboModuleProxy 或 RN$Bridgeless | 过渡期,两者共存 |
| 0.81+ | 54+ | RN$Bridgeless | 唯一可靠方式 |
参见
- RN 旧架构 Bridge 详解
- RN 新架构组件详解
参考
版本说明
- 本页基于 2026-04-13 调研结果整理,适用范围以当前工具版本为准。