You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

升级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

火山引擎 最新活动