TurboModule在Android上打包后调用报错,但开发模式正常?

长孙梓宸 阅读 49

我在React Native项目里用TurboModule封装了一个原生模块,开发模式下运行完全没问题。但打包成apk后调用就报错”Cannot read property ‘myTurboModule’ of undefined”,这是为什么呢?

已经按官方文档配置了metro.config.js,添加了module.exports = {
resolver: {
extraNodeModules: require(‘dextrous-react-native-extra-node-modules’)(),
platforms: [‘android’, ‘ios’, ‘native’]
}
}; 也确认模块路径没问题。原生代码在Android Studio里能正确编译,但JS调用始终找不到模块。

错误堆栈显示:TypeError: Cannot read properties of undefined (reading 'MyTurboModule')。试过清除node_modules、重新链接、甚至升级到RN0.72.3都没用,求大佬指点!

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
 ___素香
当时我也卡在这,这个问题折腾了我好几天。主要是因为TurboModule在打包后的行为和开发模式不一样,原因是 metro bundler没有正确地把你的原生模块打包进去。

解决方法其实很简单,但很容易被忽略。你需要检查两个地方:

1. 确保你的TurboModule注册对了
在Android端,你的MyTurboModule必须通过ReactPackage正确注册到MainApplication.java里。比如:
public class MyReactPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Collections.singletonList(new MyTurboModule(reactContext));
}

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

然后在MainApplication.javaPackages列表中加入它:
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new MyReactPackage() // 这个别忘了!
);
}


2. 修改metro.config.js,确保JS端能正确解析路径
默认的配置可能不够,你需要手动添加一个getTransformOptions方法:
const { getDefaultConfig } = require('metro-config');

module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: true,
},
}),
},
resolver: {
extraNodeModules: require('dextrous-react-native-extra-node-modules')(),
assetExts: assetExts.filter(ext => ext !== 'svg'), // 如果用了SVG记得加回来
sourceExts: [...sourceExts, 'cjs'], // 兼容CommonJS模块
},
};
})();


最后一步也是最容易忽视的:清理所有缓存并重新打包。
cd android && ./gradlew clean
rm -rf node_modules/ && npm install
npx react-native start --reset-cache
npx react-native run-android


我当时就因为漏掉了metro.config.js的修改,导致打包一直报这个错误。希望你不会再掉进这个坑里!
点赞 10
2026-01-31 13:02