为何jest-haste-map会上报父目录中的错误?
问题原因与解决办法
为什么会扫描父目录的文件?
React Native 用的 Metro Bundler(就是npx react-native start启动的打包工具)默认会从你执行命令的目录向上递归查找,直到找到包含package.json的“根目录”,然后把这个根目录及所有子目录都纳入模块扫描范围。你在Bar或Bar/App下启动命令时,Metro 会一路往上找到Development目录(如果它下面有package.json,或者到系统根目录),所以父目录里username和username2下的Foo模块也会被扫描到。Haste 模块系统靠文件名识别模块,重名的package.json自然触发冲突。
另外,你同时在Bar和Bar/App两个目录启动 Metro,相当于两个进程在扫描重叠的目录范围,会进一步放大这个冲突问题。
解决办法
1. 限定Metro的扫描范围
在Bar目录下创建(或修改)metro.config.js,手动指定监听目录并排除无关的父目录项目:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const customConfig = { // 只监听当前Bar目录,不向上扩展 watchFolders: [__dirname], resolver: { // 排除父目录里的两个Foo备份目录 blockList: [ /..\/username\/.*/, /..\/username2\/.*/, ], }, }; module.exports = mergeConfig(getDefaultConfig(__dirname), customConfig);
2. 只保留一个Metro进程
关掉Bar/App下的react-native start进程,只在Bar目录启动一个即可——多进程不仅会重复扫描,还可能导致缓存混乱,反而拖慢打包速度。
3. 临时重命名冲突目录(可选)
如果实验允许临时修改目录名,把其中一个Foo改成Foo-backup之类的,也能快速解决冲突,但不如配置方法灵活。
内容的提问来源于stack exchange,提问作者Reagankm
相关产品推荐
相关产品推荐

