在Yarn Monorepo中配置React Native时遭遇打包器错误求助
解决Yarn Workspaces Monorepo中React Native无法解析根node_modules依赖的问题
我之前在Yarn Workspaces的Monorepo里配置React Native项目时,也碰到过几乎一模一样的问题。结合你的配置和报错信息,咱们来拆解下问题原因和解决办法:
问题原因
- Nohoist规则的干扰:你在根目录
package.json里把**/react-native/**加入了nohoist列表,这会强制React Native及其关联依赖安装在子项目(mobile-app)的node_modules中,但bugsnag-react-native被hoist到了根目录的node_modules。Metro打包器默认优先查找当前项目的node_modules,nohoist规则打乱了它的向上遍历逻辑,导致找不到根目录的依赖。 - Metro的解析逻辑限制:React Native的Metro打包器和Node.js的模块解析逻辑不同,它不会自动把根目录的
node_modules纳入查找路径,在Monorepo场景下需要手动配置。 - Yarn 1.x版本的已知bug:你使用的Yarn 1.19.0存在一些Workspaces相关的路径解析问题,可能加剧了这个报错。
解决办法
1. 调整Nohoist配置,兼容bugsnag-react-native
修改根目录package.json的nohoist规则,给bugsnag-react-native添加例外,让它能被正确识别:
{ "name": "mono-repo", "workspaces": { "packages": [ "web-app", "utils", "mobile-app" ], "nohoist": [ "**/jest", "**/jest/**", "**/mocha", "**/mocha/**", "**/react-native", "**/react-native/**", "!**/bugsnag-react-native", "!**/bugsnag-react-native/**" ] } }
修改后执行yarn install重新安装依赖。
2. 配置Metro打包器,添加根目录依赖路径
在mobile-app项目根目录创建或修改metro.config.js,让Metro明确去根目录的node_modules查找依赖:
const path = require('path'); module.exports = { resolver: { // 代理所有模块请求到根目录node_modules extraNodeModules: new Proxy({}, { get: (target, moduleName) => path.join(__dirname, '../node_modules', moduleName), }), }, // 指定当前项目根目录 projectRoot: path.resolve(__dirname), // 让Metro监听根目录文件变化,适配Monorepo依赖更新 watchFolders: [path.resolve(__dirname, '../')], };
3. 确保子项目声明了依赖
检查mobile-app/package.json的dependencies里是否包含bugsnag-react-native,即使根目录已经安装,子项目也需要明确声明依赖,Yarn Workspaces会自动关联根目录的包,避免解析异常。
4. 升级Yarn到1.x最新稳定版
Yarn 1.19.0存在一些Workspaces的已知问题,建议升级到1.x分支的最新版本(比如1.22.19),执行命令:
yarn set version 1.22.19
升级后重新执行yarn install,很多路径解析的小问题会被修复。
做完这些步骤后,重新运行yarn run-ios,应该就能正常解析bugsnag-react-native了。
内容的提问来源于stack exchange,提问作者john_ryan
相关产品推荐
相关产品推荐

