React Native TurboModule初始化失败,native模块未注册?

皇甫喧丹 阅读 114

我在用TurboModule写个原生模块时,JS调用时报错说模块未找到。按照官方文档初始化了Java类并加了@ReactModule注解,但应用启动就崩溃了。错误提示是:TurboModuleRegistry.getEnforcing('MyModule') was not found

尝试过检查模块类名和导出名称是否一致,确认package路径正确。原生代码里这样注册的:


@ReactModule(name = MyModule.NAME)
public class MyModule extends TurboModule {
  public static final String NAME = "MyModule";
  // ...
}

JS端这样引入:NativeModules.MyModule.doSomething()。但就是识别不到模块,是不是需要额外配置metro?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
UI世鹏
UI世鹏 Lv1
遇到这种问题,通常是因为TurboModule的注册没有正确完成。首先确认一下,你在Java类中使用的是@ReactModule注解,但TurboModule应该是用@TurboModule注解,并且需要继承TurboModule接口。不过,看你的描述,可能还需要确保你已经正确地在CatalystInstanceImpl中注册了这个模块,或者使用了TurboModule的自动注册机制。

检查一下你的react-native.config.js文件,确保你的模块被正确地列出来,这样Metro才能知道需要打包你的原生模块。通常看起来像这样:
module.exports = {
dependencies: {
MyModule: {},
},
};


其次,确认一下你的原生模块在Android的MainApplication.java中被正确地注册了。你需要确保getPackages()方法返回的列表包含了你的TurboModule。如果是自动注册,确保你的模块类名符合自动注册的命名规则。

最后,确保你的Metro配置支持TurboModule。你可能需要在metro.config.js中添加一些配置,比如:
const { getDefaultConfig } = require('@expo/metro-config');

module.exports = (async () => {
const {
resolver: { sourceExts, assetExts },
} = await getDefaultConfig(__dirname);
return {
transformer: {
babelTransformerPath: require.resolve('react-native-turbomodule-transformer'),
},
resolver: {
assetExts: assetExts.filter(ext => ext !== 'svg'),
sourceExts: [...sourceExts, 'svg'],
},
};
})();


不过,这段代码假设你使用的是Expo,如果你不是,可能需要根据实际情况调整。

希望这些信息能帮助你解决这个问题。这样更清晰
点赞
2026-03-23 22:24
司徒子荧
我也被这问题折腾了一整晚,后来发现光加@ReactModule注解完全不够。你得在原生工程里手动创建一个ReactPackage类,里面要返回你的模块类。举个例子:

public class MyPackage implements ReactPackage {
@Override
public List> createJSModules() {
return Collections.emptyList();
}

@Override
public @NonNull List createViewManagers(@NonNull ReactApplicationContext reactContext) {
return Collections.emptyList();
}

@Override
public @NonNull List createNativeModules(@NonNull ReactApplicationContext reactContext) {
List modules = new ArrayList<>();
modules.add(new MyModule(reactContext));
return modules;
}
}

然后在MainApplication.java里注册这个package,注意不是addPackage而是靠getPackages()方法返回的列表。如果你用的是expo那种封装过的结构,可能得通过ExpoModulesProvider去注册。metro配置一般不需要动,但记得在babel里加上react-native-turbo的插件。

最后别忘了原生模块的构造函数要带ReactApplicationContext参数,我刚开始就写了个无参构造函数,导致初始化失败还报错信息完全对不上。
点赞 18
2026-02-07 08:02