Expo TypeScript项目Android构建失败:模块解析错误
Expo + TypeScript EAS Build Android 模块解析失败排查方案
核心矛盾
eas build --platform android 时Metro报错无法解析模块,但yarn tsc --noEmit完全正常——说明TypeScript的路径解析逻辑和Metro的打包解析逻辑存在差异,从以下几个方向逐一排查:
1. 文件名大小写不匹配(最常见原因)
TypeScript默认不区分文件名大小写,但EAS构建服务器用的是Linux系统,文件系统严格区分大小写。
- 对比导入路径的大小写和本地实际文件的文件名(比如导入写的
BlocklistScreen.tsx,实际文件是不是blocklistScreen.tsx?) - 修正导入语句的路径,确保和文件系统的文件名完全一致
2. Metro与TS的路径别名配置不同步
如果项目用了路径别名(比如@/screens/xxx),TS能识别但Metro可能没配置:
- 打开
tsconfig.json,复制compilerOptions.paths里的配置 - 在
metro.config.js(或metro.config.ts)中同步别名映射,示例配置:const { getDefaultConfig } = require('expo/metro-config'); const path = require('path'); const config = getDefaultConfig(__dirname); config.resolver.alias = { '@': path.resolve(__dirname, './src'), // 其他别名按tsconfig里的配置补全 }; module.exports = config;
3. Metro缓存残留导致解析异常
本地或构建服务器的Metro缓存可能保留了旧的路径信息:
- 本地先清理缓存:
npx expo start --clear - 构建时强制清理缓存:
eas build --platform android --clear-cache
4. Metro未正确配置TSX扩展名解析
虽然TS允许省略扩展名,但Metro在某些场景下需要明确声明支持TSX:
- 在
metro.config.js中检查resolver.sourceExts,确保包含tsx:config.resolver.sourceExts = [...config.resolver.sourceExts, 'tsx'];
5. 构建代码缺失目标文件
EAS构建基于Git仓库代码,检查:
.gitignore是否误屏蔽了BlocklistScreen.tsx所在目录- 确认该文件已经提交到Git仓库,没有被忽略
6. 依赖版本兼容性问题
如果最近升级过Expo/Metro,可能存在版本冲突:
- 回退到之前能正常构建的依赖版本,或者升级到最新稳定版
- 执行
yarn install重新安装依赖,确保版本一致
补充检查点
- 查看
tsconfig.json的include数组,确认包含目标文件所在目录 - 确认
tsconfig.json的compilerOptions.moduleResolution设置为node或bundler
内容的提问来源于stack exchange,提问作者A Mehmeto
相关产品推荐
相关产品推荐

