升级Expo 52后Android Release构建无法解析expo-router/entry.js模块
Expo 52 Android Release构建失败:无法解析expo-router/entry.js
问题详情
将Expo从51升级到52后,npx expo start在Expo Go中测试完全正常,但执行npx expo run:android --variant release构建本地Release包时,触发以下错误:
npx expo run:android --variant release › Opening emulator Pixel_3a_API_35 › Building app... Starting Metro Bundler warning: Bundler cache is empty, rebuilding (this may take a minute) Error: Unable to resolve module ./D:/Repositorios/listtendance/node_modules/expo-router/entry.js from D:\Repositorios\listtendance/.: None of these files exist: * D:\Repositorios\listtendance\node_modules\expo-router\entry.js(.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.mjs|.native.mjs|.mjs|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json|.android.cjs|.native.cjs|.cjs|.android.scss|.native.scss|.scss|.android.sass|.native.sass|.sass|.android.css|.native.css|.css|.android.css|.native.css|.css) * D:\Repositorios\listtendance\node_modules\expo-router\entry.js Error: Unable to resolve module ./D:/Repositorios/listtendance/node_modules/expo-router/entry.js from D:\Repositorios\listtendance/.: None of these files exist: * D:\Repositorios\listtendance\node_modules\expo-router\entry.js(.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.mjs|.native.mjs|.mjs|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json|.android.cjs|.native.cjs|.cjs|.android.scss|.native.scss|.scss|.android.sass|.native.sass|.sass|.android.css|.native.css|.css|.android.css|.native.css|.css) * D:\Repositorios\listtendance\node_modules\expo-router\entry.js at ModuleResolver.resolveDependency (D:\Repositorios\listtendance\node_modules\metro\src\node-haste\DependencyGraph\ModuleResolution.js:112:15) at DependencyGraph.resolveDependency (D:\Repositorios\listtendance\node_modules\metro\src\node-haste\DependencyGraph.js:235:43) at D:\Repositorios\listtendance\node_modules\metro\src\lib\transformHelpers.js:160:21 at Server._resolveRelativePath (D:\Repositorios\listtendance\node_modules\metro\src\Server.js:1104:12) at processTicksAndRejections (node:internal/process/task_queues:95:5) at MetroBundlerDevServer.resolveRelativePathAsync (D:\Repositorios\listtendance\node_modules\@expo\cli\src\start\server\metro\MetroBundlerDevServer.ts:1677:12) at MetroBundlerDevServer.metroLoadModuleContents (D:\Repositorios\listtendance\node_modules\@expo\cli\src\start\server\metro\MetroBundlerDevServer.ts:506:35) at MetroBundlerDevServer.legacySinglePageExportBundleAsync (D:\Repositorios\listtendance\node_modules\@expo\cli\src\start\server\metro\MetroBundlerDevServer.ts:809:20) at exportEmbedBundleAndAssetsAsync (D:\Repositorios\listtendance\node_modules\@expo\cli\src\export\embed\exportEmbedAsync.ts:193:21) at exportEmbedInternalAsync (D:\Repositorios\listtendance\node_modules\@expo\cli\src\export\embed\exportEmbedAsync.ts:125:37)
已尝试以下操作但均无效:
- 删除node_modules并执行
npm install - 运行
npx expo install --fix - 执行
npx expo-doctor检查依赖 - 运行
npx expo start --clear清除缓存 - 清理node_modules缓存
- 修改
package.json尝试降级Expo,但项目仍使用Expo 52
当前配置文件
metro.config.js
const { getDefaultConfig } = require("expo/metro-config"); const { withNativeWind } = require("nativewind/metro"); const config = getDefaultConfig(__dirname); module.exports = withNativeWind(config, { input: "./global.css" });
babel.config.js
module.exports = function (api) { api.cache(true); return { presets: [ ["babel-preset-expo", { jsxImportSource: "nativewind" }], "nativewind/babel" ], }; };
解决方案
1. 匹配expo-router与Expo 52的版本
Expo 52对expo-router有版本适配要求,执行以下命令安装兼容版本:
npm install expo-router@latest
安装完成后重新执行构建命令。
2. 修复Windows路径解析问题
错误日志显示路径混用了/和\,在metro.config.js中添加路径规范化配置:
const { getDefaultConfig } = require("expo/metro-config"); const { withNativeWind } = require("nativewind/metro"); const config = getDefaultConfig(__dirname); // 统一路径分隔符,修复Windows下解析bug config.resolver.resolveRequest = (context, moduleName, platform) => { const normalizedModuleName = moduleName.replace(/\\/g, '/').replace(/\/+/g, '/'); return context.resolveRequest(context, normalizedModuleName, platform); }; module.exports = withNativeWind(config, { input: "./global.css" });
3. 彻底清除所有缓存
除常规缓存外,清除Android本地构建缓存:
# 清除Metro缓存 npx expo start --clear # 清除Android Gradle缓存 cd android && ./gradlew clean && cd .. # 删除依赖文件并重新安装 rm -rf node_modules package-lock.json npm install
4. 重新安装expo-router
若node_modules/expo-router目录下无entry.js文件,说明安装不完整,执行:
npm uninstall expo-router npm install expo-router
5. 修复Expo版本降级问题
若降级Expo 51无效,删除lock文件强制更新依赖:
rm -rf node_modules package-lock.json # 修改package.json中的expo版本为51后执行 npm install npx expo install --fix
内容的提问来源于stack exchange,提问作者Daniel Salazar Rodriguez




