使用EAS构建React Native时环境变量未定义问题排查
问题分析与解决方案
你遇到的核心问题是EAS Build 的环境变量传递机制和本地 expo start 完全不同:本地运行时,终端输入的环境变量会被 Node.js 进程直接继承,babel 插件能顺利读取到 process.env;但 EAS Build 是在远程构建服务器上执行的,终端里的变量并不会自动同步到远程环境,所以你的 babel 插件根本拿不到这些值。
下面是具体的修复方案,按推荐优先级排序:
方案一:使用 EAS Secrets 存储敏感变量(推荐,安全合规)
对于 API Key 这类敏感信息,不应该明文暴露在配置文件里,EAS Secrets 是官方推荐的安全存储方式:
- 逐个推送你的环境变量到 EAS 项目级 Secrets:
eas secret:push --name API_KEY --value api-key --scope project eas secret:push --name AUTH_DOMAIN --value mydomain.com --scope project eas secret:push --name PROJECT_ID --value id --scope project # 剩下的变量以此类推 - 修改你的
eas.json,在preview构建配置中声明需要注入的环境变量:
这里的空值会自动被 EAS Secrets 中对应的变量填充。{ "build": { "preview": { "android": { "buildType": "apk" }, "env": { "API_KEY": "", "AUTH_DOMAIN": "", "PROJECT_ID": "", "STORAGE_BUCKET": "", "MESSAGING_SENDER_ID": "", "APP_ID": "", "MEASUREMENT_ID": "" } } } }
方案二:在 eas.json 中直接配置非敏感变量
如果你的变量没有敏感信息,可以直接在 eas.json 的 env 字段中赋值:
{ "build": { "preview": { "android": { "buildType": "apk" }, "env": { "API_KEY": "api-key", "AUTH_DOMAIN": "mydomain.com", "PROJECT_ID": "id", "STORAGE_BUCKET": "bucket.com", "MESSAGING_SENDER_ID": "123", "APP_ID": "id", "MEASUREMENT_ID": "gg" } } } }
方案三:构建时通过 --env 参数传递(临时测试用)
如果你只是临时测试,可以在构建命令中用 --env 参数逐个传递变量,但不推荐用于生产/正式预览构建:
eas build -p android -e preview --clear-cache --env API_KEY=api-key --env AUTH_DOMAIN=mydomain.com --env PROJECT_ID=id ...
验证你的配置
完成上述配置后,直接运行构建命令即可,不需要在终端前缀一堆环境变量:
eas build -p android -e preview --clear-cache
你的 babel.config.js 和 Firebase 配置代码本身没有问题,只要 EAS Build 能把环境变量注入到构建环境中,babel-plugin-transform-inline-environment-variables 就会正常把 process.env 替换成对应的值。
内容的提问来源于stack exchange,提问作者WhiteAB
相关产品推荐
相关产品推荐

