Expo 4.0.16移动端运行报AppEntry.js无法解析../../App的问题求助
Expo 4.0.16 报
Unable to resolve "../../App" from "node_modules/expo/AppEntry.js" 解决步骤 报错根因
这个报错没有复杂的底层逻辑,本质是Expo 4.x 内置的node_modules/expo/AppEntry.js写死了导入规则:从自身所在目录往上跳两级到项目根目录,匹配大写A开头的App.js/App.tsx/App.jsx文件做导入。之前尝试的方案没生效,都是因为踩了适配偏差的坑。
可落地排查操作
- 对齐入口文件命名要求
把项目根目录下小写的app.js重命名为大写开头的App.js。注意文件名大小写必须和匹配规则完全一致:Windows系统因为文件系统大小写不敏感可能能正常运行,但安卓真机、CI构建环境是大小写敏感的文件系统,哪怕文件内容完全符合要求,命名不对就会直接触发解析失败。
确认App.js的导出逻辑符合要求:必须使用默认导出的React组件,补全必要的React导入,不要依赖自动导入能力。标准结构参考:import React from 'react'; import { Text, View } from 'react-native'; class App extends React.Component { // 业务逻辑代码 render() { return <View><Text>应用首页</Text></View> } } export default App; - 自定义入口适配(如果不想修改文件名为大写App.js)
如果需要保留小写app.js的命名习惯,直接修改根目录app.json的配置绕开默认的AppEntry.js逻辑:删掉默认的"entryPoint": "node_modules/expo/AppEntry.js"字段,替换为自身的入口路径"entryPoint": "./app.js"。
注意:不要把打包配置写在app.json的packagerOpts字段里——这种写法在Expo 4.x版本里不会被metro读取,这也是之前加了配置完全不生效的原因。正确的做法是在项目根目录单独新建metro.config.js写配置:const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); // 仅当项目实际用到vue-native开发时,才追加vue扩展名到解析规则 config.resolver.sourceExts.push('vue'); module.exports = config; - 清除metro缓存重启服务
所有配置和文件调整完成后,先停掉正在运行的Expo服务,执行带清缓存的启动命令,避免旧的metro缓存残留导致配置不生效:npx expo start -c
常见隐蔽坑位排查
- 确认App.js的文件层级:文件需要和
app.json、package.json放在项目同一级根目录,不要放到src等子文件夹下,否则AppEntry.js按照固定的两级路径往上查找时,会匹配不到文件。 - 不要照搬其他项目的扩展配置:如果项目里没有
.vue格式的业务文件,就不要额外把vue加入metro的解析扩展名列表,多余的匹配规则反而会引发路径解析冲突。
内容的提问来源于stack exchange,提问作者Ted Bed
相关产品推荐
相关产品推荐

