React Native JSI模块注册时报”undefined is not an object”
在用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都没解决,有没有遇到过类似情况?
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来获取模块实例。比如这样写:还有一点容易忽略,确保你的
my-module-jsi文件是通过react-native的codegen工具生成的。如果手动写的,可能会有不匹配的地方。可以在package.json里加上codegenConfig字段,让工具自动生成绑定代码。最后提醒一下,调试JSI模块的时候,尽量打开日志输出,看看原生层有没有报错。有时候问题并不在JavaScript这边,而是C++代码没正确链接到React Native的运行时环境里。
按照这些步骤调整,应该能解决问题。别走弯路,尤其是不要盲目尝试各种版本组合,先把基础配置搞对再说。
NativeModules或直接通过 JSI 导出。试试这个:如果还报错,检查 metro.config.js 是否配置了 jsiEnabled: true,就这样。