React Native Expo项目Babel转译报错:ESM配置文件仅支持异步运行
错误原因
这个报错的核心问题是:项目里存在ES模块(ESM)格式的配置文件,但Expo/Metro运行Babel时采用同步模式,而Babel的同步模式不支持ESM格式的配置文件。
你的babel.config.js用的是CommonJS的module.exports,问题大概率出在其他地方:
- 项目根目录的
package.json里可能添加了"type": "module",导致所有.js文件被默认当作ESM处理 - 项目中存在其他ESM格式的Babel配置文件,比如
babel.config.mjs、.babelrc.mjs
另外,你的Babel预设存在重复项:@babel/preset-react-native已经被包含在module:metro-react-native-babel-preset中,重复添加反而可能引发冲突。
解决步骤
修正package.json配置
打开项目根目录的package.json,如果存在"type": "module"这一行,直接删除;如果需要保留ESM全局配置,就把babel.config.js重命名为babel.config.cjs(明确告知Node这是CommonJS文件)。清理重复的Babel预设
修改babel.config.js,简化为以下内容即可:module.exports = { presets: ['module:metro-react-native-babel-preset'], };该预设已包含React Native所需的全部转译规则,无需额外添加
@babel/preset-env或@babel/preset-react-native。检查其他Babel配置文件
若项目中存在babel.config.mjs、.babelrc.mjs这类ESM格式的配置文件,要么直接删除,要么改为CommonJS格式(比如改为.babelrc或重命名为.cjs后缀)。重启Expo服务
执行命令expo start --clear,清除缓存后重新启动服务,确保配置生效。
内容的提问来源于stack exchange,提问作者Rytis Jokubas

