React Native JSI模块注册时报”undefined is not an object”

Top丶喜静 阅读 65

在用JSI开发自定义模块时,初始化总报错”undefined is not an object (evaluating ‘_TurboModuleRegistry.getEnforcing’)”

代码结构是这样的:


import { TurboModule } from 'react-native';
import { MyModule } from './my-module-jsi';

TurboModuleRegistry.register('MyTurboModule', () => MyModule);
export default TurboModule.getEnforcing('MyTurboModule');

已经确认C++部分编译正常,但调用时TurboModuleRegistry一直是undefined。尝试过不同版本的react-native@next都没解决,有没有遇到过类似情况?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
柚溪 Dev
这个问题我之前踩过坑,说白了就是JSI模块注册的时机不对,或者依赖没配好。你遇到的“undefined is not an object”大概率是因为TurboModuleRegistry在运行时没有正确加载。

先确认一下React Native的版本,JSI和TurboModules在0.70及以上才算是比较稳定。如果你用的是react-native@next,建议换成正式版,比如0.71或0.72,避免一些实验性改动带来的问题。

接下来重点检查两件事:

第一,C++部分的初始化代码有没有正确执行。确保你在原生层已经把模块注册到JSI环境中了。比如在Android上,你需要在OnLoad.cpp里调用jsi::Runtime相关的注册逻辑。如果这部分没做好,TurboModuleRegistry压根不会被注入到JavaScript环境里。

第二,别直接用TurboModuleRegistry这个东西。它并不是公开的API,React Native团队也不推荐直接使用。你可以换一种方式,通过requireNativeModule来获取模块实例。比如这样写:

import { requireNativeModule } from 'react-native';
const MyTurboModule = requireNativeModule('MyTurboModule');
export default MyTurboModule;


还有一点容易忽略,确保你的my-module-jsi文件是通过react-nativecodegen工具生成的。如果手动写的,可能会有不匹配的地方。可以在package.json里加上codegenConfig字段,让工具自动生成绑定代码。

最后提醒一下,调试JSI模块的时候,尽量打开日志输出,看看原生层有没有报错。有时候问题并不在JavaScript这边,而是C++代码没正确链接到React Native的运行时环境里。

按照这些步骤调整,应该能解决问题。别走弯路,尤其是不要盲目尝试各种版本组合,先把基础配置搞对再说。
点赞
2026-02-18 13:18
统赫🍀
问题出在 TurboModuleRegistry 的用法,React Native 0.64+ 需要用 NativeModules 或直接通过 JSI 导出。试试这个:

import { TurboModuleRegistry } from 'turbo_modules_registry';
import MyModule from './my-module-jsi';

TurboModuleRegistry.register('MyTurboModule', () => MyModule);
export default TurboModuleRegistry.getEnforcing('MyTurboModule');


如果还报错,检查 metro.config.js 是否配置了 jsiEnabled: true,就这样。
点赞 5
2026-01-28 21:05