metro.runBuild打包失败但npx expo export正常的问题求助
解决Metro runBuild无法解析模块的问题
问题诊断
- metro.config.js路径变量错误:代码中误用
dirname而非Node.js全局变量__dirname,导致Expo默认配置无法正确识别项目目录结构,引发模块解析失败。 - 平台配置可能不一致: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
相关产品推荐
相关产品推荐

