React Native Codegen生成后模块找不到怎么办?
我在给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打包路径?
首先需要明确的是,Codegen生成的模块代码默认会被放置在特定的目录下,而JS层引用这些模块的方式是有严格约定的。你遇到的问题很典型,就是因为引用路径不正确。
第一步,检查Codegen生成的具体位置。虽然你说文件已经生成了,但我们需要确认下具体的生成路径。正常情况下,Codegen会在项目根目录下的
generated文件夹中生成对应的JS接口文件。具体路径类似这样:your_project/generated/Specs/MyModule.js如果你发现生成的文件不在这个目录下,那可能是codegen配置有问题。检查下
package.json里是否有正确的codegen配置,像这样:第二步,修改JS层的引用方式。Codegen生成的模块并不是直接通过
NativeModules来引用的,而是会生成一个专门的封装类。你需要改成类似这样的引用方式:注意这里的关键点是,Codegen生成的模块是一个独立的JS模块,而不是挂载在
NativeModules下的属性。第三步,如果还是提示找不到模块,那就需要调整Metro的打包配置。打开
metro.config.js文件,确保它包含了对generated目录的支持。可以参考以下配置:需要注意的是,Metro默认不会包含非标准路径的文件夹,所以必须手动添加
generated目录到它的搜索范围。第四步,清理缓存并重新启动项目。执行以下命令确保所有缓存被清除:
最后总结一下,这个问题的核心在于:
1. Codegen生成的模块路径和引用方式有严格约定;
2. Metro打包工具默认不会处理非标准路径;
3. 必须确保生成的文件和引用方式一致,并且打包工具能识别到。
按照上面的步骤操作,应该可以解决问题。如果还有问题,建议仔细检查每一步的输出日志,看看是不是某个环节遗漏了。
把path/to/generated换成你实际生成代码的路径,比如android/app/src/main/java/com/yourproject/generated。这样metro就能正确解析generated模块了。别忘了重启metro服务,光改配置不重启可不行。