React Native运行报错:Metro Bundler提示路径需相对项目根目录
我来帮你搞定这个React Native打包时遇到的报错问题!这个错误的核心原因是Metro打包器要求模块的导入路径必须是相对于项目根目录的相对路径,而你代码里用了/Users/jgallaso/Projects/aerogear/aerogear-react-native-core/index.js这种绝对路径,超出了Metro的解析范围。
下面是具体的解决步骤:
1. 替换绝对导入路径为相对路径
先找到项目中导入aerogear-react-native-core的代码位置,把绝对路径改成符合项目层级的相对路径。
比如你的React Native项目在/Users/jgallaso/Projects/aerogear/aerogear-js-sdk/example/react-native/,目标模块在上级目录的aerogear-react-native-core文件夹下,那导入语句可以改成:
import AeroGearCore from '../aerogear-react-native-core'; // 或者指定index.js的话: import AeroGearCore from '../aerogear-react-native-core/index.js';
2. 配置Metro添加额外监视目录(本地开发模块时适用)
如果你是在本地开发aerogear-react-native-core这个模块,不想每次都调整相对路径,可以修改RN项目根目录下的metro.config.js,把外部模块的目录加入Metro的监视列表:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const customConfig = { watchFolders: [ // 填入外部模块的绝对路径 '/Users/jgallaso/Projects/aerogear/aerogear-react-native-core' ] }; module.exports = mergeConfig(getDefaultConfig(__dirname), customConfig);
这样Metro就会把这个外部目录当作项目根的一部分,就能正确解析路径了。
3. 清除Metro缓存并重启打包器
不管是改了导入路径还是Metro配置,都需要清除缓存后重启打包服务,避免缓存导致的问题:
npx react-native start --reset-cache
补充说明
Metro的Node Haste模块解析系统是基于项目根目录来工作的,它只会识别项目根目录内(或配置的额外监视目录内)的相对路径,绝对路径不在它的合法解析范围内,所以要么调整路径为相对形式,要么把外部目录纳入它的解析范围。
内容的提问来源于stack exchange,提问作者josemigallas

