NX monorepo集成Expo后React Native构建报错:无法解析./src/main
解决方法
1. 调整Metro配置适配NX Monorepo
在你的React Native应用目录下创建/修改metro.config.js,明确指定项目根目录并适配monorepo结构,同时映射自定义模块名:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const path = require('path'); const customConfig = { // 把Metro的项目根设为当前RN应用目录 projectRoot: __dirname, // 监听NX工作区根目录,确保能解析跨包依赖 watchFolders: [path.resolve(__dirname, '../../')], resolver: { // 指定node_modules的查找路径,覆盖默认的根目录查找 nodeModulesPaths: [ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, '../../node_modules') ], // 映射自定义模块名到实际入口文件 resolveRequest: (context, moduleName) => { if (moduleName === 'myappname') { return { filePath: path.resolve(__dirname, './src/main.tsx'), // 替换为你的实际入口文件路径 type: 'sourceFile' }; } return context.resolveRequest(context, moduleName); } } }; module.exports = mergeConfig(getDefaultConfig(__dirname), customConfig);
2. 同步Expo配置与模块名
在RN应用的app.json(或app.config.js)中,同步模块名并明确入口路径:
{ "name": "myappname", "displayName": "My App Name", "entryPoint": "./src/main.tsx" }
3. 修正NX启动配置
打开RN应用目录下的project.json,修改start命令的Metro配置路径:
{ "targets": { "start": { "executor": "@nrwl/react-native:start", "options": { "port": 8081, "metroConfig": "apps/myappname/metro.config.js" // 替换为你的RN应用相对路径 } } } }
4. 清除缓存重启服务
执行以下命令彻底清理缓存,避免旧配置干扰:
# 重置Metro缓存 npx react-native start --reset-cache # 重置iOS依赖(可选) cd apps/myappname/ios && pod deintegrate && pod install
问题根源
Expo集成会改变Metro的默认解析逻辑,而NX的monorepo结构要求Metro必须明确项目根目录。你修改了iOS端的moduleName但未同步配置Metro的入口映射,导致Metro错误地从NX工作区根目录查找./src/main,而非RN应用目录。
内容的提问来源于stack exchange,提问作者DxW
相关产品推荐
相关产品推荐

