React Native Codegen生成后模块找不到怎么办?

夏侯东景 阅读 14

我在给React Native项目添加新原生模块时,按照文档用codegen生成了桥梁代码,但运行时提示”Cannot find module ‘./generated/Specs/MyModule'”。

已经执行过react-native generate-specs命令,生成的文件确实在android/app/src/main/java/…路径下。但是在JS文件里这样引用:


import { NativeModules } from 'react-native';
const { MyModule } = NativeModules;

还是报同样的错误。尝试过清理node_modules、重新链接、检查package.json配置都没用,搞不懂模块路径应该指向哪里?是不是需要手动配置metro打包路径?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
小殿薇
小殿薇 Lv1
这个问题主要是因为React Native的Codegen生成的模块路径和实际引用方式不匹配导致的,我们来一步步分析和解决。

首先需要明确的是,Codegen生成的模块代码默认会被放置在特定的目录下,而JS层引用这些模块的方式是有严格约定的。你遇到的问题很典型,就是因为引用路径不正确。

第一步,检查Codegen生成的具体位置。虽然你说文件已经生成了,但我们需要确认下具体的生成路径。正常情况下,Codegen会在项目根目录下的 generated 文件夹中生成对应的JS接口文件。具体路径类似这样:
your_project/generated/Specs/MyModule.js

如果你发现生成的文件不在这个目录下,那可能是codegen配置有问题。检查下 package.json 里是否有正确的codegen配置,像这样:

{
"codegenConfig": {
"libraries": [
{
"name": "MyModule",
"type": "modules",
"jsSrcsDir": "src",
"android": {
"javaPackageName": "com.example.mymodule"
}
}
]
}
}


第二步,修改JS层的引用方式。Codegen生成的模块并不是直接通过 NativeModules 来引用的,而是会生成一个专门的封装类。你需要改成类似这样的引用方式:

import MyModule from './generated/Specs/MyModule';

// 然后可以直接使用
MyModule.someMethod();


注意这里的关键点是,Codegen生成的模块是一个独立的JS模块,而不是挂载在 NativeModules 下的属性。

第三步,如果还是提示找不到模块,那就需要调整Metro的打包配置。打开 metro.config.js 文件,确保它包含了对 generated 目录的支持。可以参考以下配置:

const path = require('path');

module.exports = {
resolver: {
extraNodeModules: {
// 其他模块...
},
sourceExts: ['js', 'jsx', 'ts', 'tsx', 'json'], // 确保支持js文件
blacklistRE: /.*/__tests__/.*/,
includes: [
path.resolve(__dirname, './generated'), // 添加generated目录
path.resolve(__dirname, './node_modules'),
path.resolve(__dirname, './src'),
],
},
};


需要注意的是,Metro默认不会包含非标准路径的文件夹,所以必须手动添加 generated 目录到它的搜索范围。

第四步,清理缓存并重新启动项目。执行以下命令确保所有缓存被清除:

rm -rf node_modules/
rm -rf generated/
yarn install
react-native generate-specs
react-native start --reset-cache


最后总结一下,这个问题的核心在于:
1. Codegen生成的模块路径和引用方式有严格约定;
2. Metro打包工具默认不会处理非标准路径;
3. 必须确保生成的文件和引用方式一致,并且打包工具能识别到。

按照上面的步骤操作,应该可以解决问题。如果还有问题,建议仔细检查每一步的输出日志,看看是不是某个环节遗漏了。
点赞 2
2026-02-18 21:34
志鸽
志鸽 Lv1
你得告诉metro怎么找到生成的代码,我一般直接改metro.config.js。加上这段配置:

const path = require('path');

module.exports = {
resolver: {
extraNodeModules: {
'generated': path.resolve(__dirname, 'path/to/generated')
},
},
};


把path/to/generated换成你实际生成代码的路径,比如android/app/src/main/java/com/yourproject/generated。这样metro就能正确解析generated模块了。别忘了重启metro服务,光改配置不重启可不行。
点赞 1
2026-02-18 08:00