使用pnpm创建的Expo应用提示文件缺失,但文件实际存在
修复Expo + pnpm运行Android时的模块解析错误
问题描述
使用pnpm create expo-app创建项目并完成依赖安装后,执行yarn android(等价于expo start --android)时触发模块解析错误,提示找不到./node_modules\expo\AppEntry,但手动核查后确认该文件实际存在。已尝试启用shamefully-hoisting、将项目迁移至无空格路径,问题仍未解决。
报错信息:
Error: Unable to resolve module ./node_modules\expo\AppEntry from C:\Users\HariC\AndroidStudioProjects\chat/.:
None of these files exist:
- node_modules\expo\AppEntry(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
- node_modules\expo\AppEntry\index(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
at ModuleResolver.resolveDependency (C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\node-haste\DependencyGraph\ModuleResolution.js:152:15)
at DependencyGraph.resolveDependency (C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\node-haste\DependencyGraph.js:264:43)
at C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\lib\transformHelpers.js:170:21
at Server._resolveRelativePath (C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\Server.js:1196:12)
at async Server.requestProcessor [as _processBundleRequest] (C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\Server.js:484:37)
at async Server._processRequest (C:\Users\HariC\AndroidStudioProjects\chat\node_modules.pnpm\metro@0.72.3\node_modules\metro\src\Server.js:435:9)
解决方法
1. 修正package.json入口配置
打开项目根目录的package.json,确认main字段指向正确路径。默认Expo项目的main应设置为:
"main": "node_modules/expo/AppEntry.js"
如果路径混用了/和\,手动统一为正斜杠格式。
2. 清除Metro缓存重启服务
Metro缓存可能导致路径解析异常,执行以下命令清除缓存后重新启动:
pnpm expo start --clear
3. 配置pnpm的依赖提升规则
在项目根目录创建或编辑.npmrc文件,添加以下配置确保Metro能正确识别pnpm的依赖结构:
public-hoist-pattern[]=*metro* public-hoist-pattern[]=*expo* shamefully-hoisting=true
保存后删除现有依赖和锁文件,重新安装:
rm -rf node_modules pnpm-lock.yaml pnpm install
4. 手动配置Metro解析路径
在项目根目录创建或编辑metro.config.js,添加自定义解析路径:
const path = require('path'); const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); config.resolver.nodeModulesPaths = [ path.resolve(__dirname, './node_modules'), path.resolve(__dirname, './node_modules/expo/node_modules'), ]; module.exports = config;
5. 统一使用pnpm执行启动命令
避免混用yarn和pnpm,直接用pnpm启动Android服务:
pnpm expo start --android
内容的提问来源于stack exchange,提问作者Mayank Kumar Chaudhari
相关产品推荐
相关产品推荐

