You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

metro.runBuild打包失败但npx expo export正常的问题求助

解决Metro runBuild无法解析模块的问题

问题诊断

  1. metro.config.js路径变量错误:代码中误用dirname而非Node.js全局变量__dirname,导致Expo默认配置无法正确识别项目目录结构,引发模块解析失败。
  2. 平台配置可能不一致:runBuild中指定platform: 'web'但输出文件名包含android,存在平台混淆风险;需确保Metro构建配置与Expo export的配置对齐。

解决方案

1. 修复metro.config.js中的路径变量

将dirname替换为__dirname,确保配置读取正确的项目目录:

// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require("expo/metro-config");
const { mergeConfig } = require("metro-config");

/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname); // 修正为__dirname

const ALIASES = {
  components: __dirname + "/src/components", // 统一使用__dirname
  navigation: __dirname + "/src/navigation",
  contexts: __dirname + "/src/contexts",
  hooks: __dirname + "/src/hooks",
  helpers: __dirname + "/src/helpers",
  mocked: __dirname + "/src/mocked",
  constants: __dirname + "/src/constants",
  services: __dirname + "/src/services",
  generalTypes: __dirname + "/src/generalTypes",
  styles: __dirname + "/src/styles",
  assets: __dirname + "/src/assets",
};

config.resolver.resolveRequest = (context, moduleName, platform) => {
  let path = undefined;

  if (ALIASES[moduleName.split("/")[0]]) {
    const remainingPath = moduleName.split("/").slice(1).join("/");
    path = ALIASES[moduleName.split("/")[0]] + "/" + remainingPath;
  }

  // 调用默认解析器处理非别名模块
  return context.resolveRequest(
    context,
    path ?? moduleName,
    platform
  );
};

module.exports = mergeConfig(config, {
  resetCache: true,
});

2. 对齐runBuild的平台配置

根据目标平台调整配置,确保平台参数与输出文件名匹配:

const Metro = require('metro');

(async () => {
    const config = await Metro.loadConfig();
    await Metro.runBuild(config, {
        entry: './index.tsx', // 明确指定入口文件相对路径
        platform: 'android', // 与目标平台一致(如需打包Web则改为'web')
        minify: true,
        out: './test/metro-android.js'
    });
})();

3. 清除Metro缓存

执行命令清除旧缓存,避免缓存导致的解析异常:

npx metro cache clean

验证

修改完成后重新运行runBuild脚本,即可正常生成指定目录的打包文件。

内容的提问来源于stack exchange,提问作者Juan Herrera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:23:12