
该错误源于 react native 0.70 版本中 metro 解析器对 haste 包路径的严格校验机制,导致 turbomodule 的 js 接口文件(如 `nativecalculator.js`)无法被正确识别;升级至 0.71+ 可彻底解决。
在采用 React Native 新架构(New Architecture)开发原生模块(如 TurboModule)时,开发者常遇到如下构建错误:
Error: While resolving module `rtn-calculator/js/NativeCalculator.js`, the Haste package `rtn-calculator` was found. However the module `js/NativeCalculator.js` could not be found within the package.
此错误仅出现在 Android 平台(iOS 不受影响),根本原因在于:React Native v0.70 引入了更严格的 Haste 模块解析逻辑,要求 TurboModule 对应的 JS 接口文件必须位于与原生包名完全匹配的 Haste 包路径下,且 Metro 会主动尝试按 package.json#name 字段查找对应 haste 名称(即 rtn-calculator),但若该目录未被显式注册为 haste root,或文件路径不符合 Metro 的默认解析规则(如缺少 index.js 入口、扩展名不匹配、大小写敏感等),就会触发上述“module not found”报错。
✅ 官方已确认并修复:该问题是 v0.70 的已知回归(regression),并在 v0.71 正式版中彻底修复(详见 GitHub Issue #35832)。因此,最直接、最可靠的解决方案是升级 React Native 至 ≥ 0.71.0:
# 升级 CLI(如使用) npx react-native upgrade # 或手动更新 package.json 后重装 npm install react-native@0.71.0 cd ios && pod install && cd .. npx react-native run-android
⚠️ 若因项目约束暂无法升级,可临时规避(不推荐长期使用):
- 确保 TurboModule 的 JS 文件(如 NativeCalculator.ts)导出路径与 haste name 严格一致,例如将文件置于 ./rtn-calculator/js/NativeCalculator.ts,且 rtn-calculator/package.json 中 "name": "rtn-calculator";
- 在 metro.config.js 中显式添加 haste root(需配合 hasteImpl 配置):
const path = require('path'); module.exports = { resolver: { extraNodeModules: { 'rtn-calculator': path.resolve(__dirname, 'rtn-calculator'), }, // ⚠️ 注意:v0.70 中 haste 支持已弱化,此配置效果有限 }, }; - 将 .ts 文件编译为 .js 并确保存在 .js 后缀版本(Metro 默认不处理 .ts,除非配置 TypeScript transformer)。
? 关键注意事项:
- 新架构项目务必使用 react-native@0.71+ + @react-native-community/cli@10.2+ 组合;
- JS 接口文件命名建议统一为 Native
.ts(如 NativeCalculator.ts),并确保 TurboModuleRegistry.get ('RTNCalculator') 中的模块名与 Android CalculatorModule.NAME 和 iOS RCT_EXPORT_MODULE() 注册名完全一致(大小写敏感); - 所有 TurboModule 必须继承自 NativeModuleSpec(Android)或 NativeCalculatorSpec(由 Codegen 生成),不可直接继承 ReactContextBaseJavaModule。
总结:该错误本质是 v0.70 的 Metro 解析缺陷,非项目配置错误。强烈建议升级至 v0.71 或更高版本,既可一劳永逸解决问题,又能获得新架构稳定性增强、TypeScript 支持优化及 Codegen 性能提升等关键改进。










