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

React项目使用webpack构建部署到S3后dotenv配置的环境变量不生效

问题根源

你当前的配置仅读取了.env文件内的变量,没有合并Codebuild注入到系统环境中的变量,同时你的赋值逻辑存在顺序错误:

  • 你的webpack配置中写的const env = {} || dotenv.config().parsed逻辑有误:JS中空对象{}为真值,||运算符会直接返回左侧的空对象,dotenv.config().parsed的内容根本不会被赋值给env(本地能运行大概率是你实际本地代码写反了顺序,或者是本地调试时手动注入了变量)
  • dotenv默认只会读取.env文件的变量,不会自动读取process.env下的系统环境变量,AWS Codebuild中配置的环境变量会注入到process.env中,自然不会被你当前的逻辑捕获
修复方案

1. 修正webpack配置的环境变量读取逻辑

调整逻辑,优先读取系统环境变量,再兜底.env文件的变量,合并后传入DefinePlugin:

const dotenv = require("dotenv")
const webpack = require('webpack')

module.exports = () => {
    // 先加载.env文件变量
    const dotenvParsed = dotenv.config().parsed || {}
    // 合并系统环境变量,系统变量优先级更高,覆盖.env同名变量
    const env = {...dotenvParsed, ...process.env}
    const envKeys = Object.keys(env).reduce((prev, next) => {
        prev[`${next}`] = JSON.stringify(env[next])
        return prev
    }, {})
    
    // 其余原有配置保持不变
    plugins: [
        new webpack.DefinePlugin(envKeys),
        new HtmlWebpackPlugin({
            template: "./public/index.html",
        }),
    ]
}

如果你担心系统变量太多污染全局,可以指定只提取需要的变量:

const env = {
  API_BASE_URL: process.env.API_BASE_URL || dotenvParsed.API_BASE_URL
}

2. 检查Codebuild配置

  • 如果你的API_BASE_URL是通过Codebuild的密钥管理配置的敏感变量,需要在buildspec.yml的env块中显式声明该变量,才会在构建过程中生效
  • 可以在buildspec.yml的build命令前加一行echo $API_BASE_URL,查看构建日志确认变量是否正常注入到了构建环境中

3. 验证构建产物

本地或者Codebuild构建完成后,打开dist目录下的打包后的JS文件,搜索API_BASE_URL,可以看到它已经被静态替换成了你配置的具体值,确认替换正确后再部署到S3即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:45:02