Expo CLI项目无法解析@react-navigation/native模块,常规排查仍报错
按照从易到难的顺序逐次排查即可解决问题:
- 核实依赖安装的匹配性
首先执行ls node_modules/@react-navigation/确认目录下是否存在native子目录。手动执行yarn install安装的@react-navigation/native版本可能和当前Expo SDK不兼容,甚至没有正确安装到项目本地。
直接使用Expo内置的安装命令重新安装,会自动匹配和当前项目Expo SDK版本兼容的包:npx expo install @react-navigation/native @react-navigation/native-stack @react-navigation/bottom-tabs
安装完成后再次确认node_modules下的@react-navigation目录结构,确保native包的package.json存在,main入口文件可正常读取。 - 排查启动目录与路径异常
报错日志里提到Metro会去../../../node_modules/@react-navigation搜索模块,说明Metro的模块搜索路径出现了异常上跳。正常情况下Metro会优先从项目同级的node_modules查找,只有同级路径找不到时才会向上遍历父目录。
需要确认:- 执行Expo启动命令的当前目录,是否和存在package.json、App.js的项目根目录完全一致,禁止在项目的子目录下启动服务
- 打开App.js第5行的引入语句,确认引入路径是直接写的
import * from '@react-navigation/native',没有多加多余的相对路径跳转前缀
- 校验Metro配置文件
打开项目根目录下的metro.config.js,检查是否存在自定义的nodeModulesPaths、extraNodeModules配置,是否把@react-navigation的路径指向了不存在的目录。如果存在过自定义路径配置,临时还原为Expo默认配置:默认配置内容参考:
const { getDefaultConfig } = require('expo/metro-config'); module.exports = getDefaultConfig(__dirname); - 清除残留的环境缓存与进程
基础的缓存清除操作执行完成后,还需要补充清理残留状态:- 单独清除目标包的yarn缓存:
yarn cache clean @react-navigation/native,避免安装时拉取到损坏的缓存包 - 杀掉所有残留的Metro、watchman进程:先执行
ps aux | grep -E 'metro|watchman'找到残留进程的PID,执行kill -9 <PID>强制终止,再重新执行watchman watch-del-all /home/jonteyh/React_Native/projects/MealsToGo针对性清除当前项目的监听状态,无需全局清除所有watchman监听 - 启动时强制重置缓存,执行
npx expo start --clear,避免和之前占用8081端口的旧Metro服务冲突
- 单独清除目标包的yarn缓存:
- 检查目录文件权限
项目运行在Linux环境下,很多时候之前用sudo权限安装依赖会导致node_modules目录的所有者是root用户,当前普通用户没有读取权限,Metro扫描时会直接判定模块不存在。
执行命令把node_modules目录的权限调整为当前用户所有:sudo chown -R $USER:$USER node_modules
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

