如何在运行create-react-app构建脚本时设置构建.env变量?

sig*_*mus 49 frontend reactjs webpack react-scripts create-react-app

我在create-react-app中使用以下环境变量:

console.log(process.env.REACT_APP_API_URL) // http://localhost:5555
Run Code Online (Sandbox Code Playgroud)

当我npm start通过读取.env文件运行时它可以工作:

REACT_APP_API_URL=http://localhost:5555
Run Code Online (Sandbox Code Playgroud)

如何设置不同的值,如http://localhost:1234执行npm run build

这是我的package.json档案:

{
  "name": "webapp",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "react-scripts": "0.9.0"
  },
  "dependencies": {
    "react": "^15.4.2",
    "react-dom": "^15.4.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*eep 98

我想你现在已经开始工作了,但是对于其他找到这个的人来说,你可以在.env"create-react-app"项目的根目录下的文件中设置默认环境变量.

要分离出使用时使用的变量npm start,npm run build你可以再创建两个env文件 - .env.development.env.production.

npm start将设置REACT_APP_NODE_ENVdevelopment,因此它将自动使用该.env.development文件,并npm run build设置REACT_APP_NODE_ENVproduction,因此它将自动使用.env.production.在这些中设置的值将覆盖您的值.env.

如果你与其他人一起工作,并具有特定值到你的机器而已,你可以在覆盖原有的数值.env.development.env.production-通过将这些值到一个新的文件.env.development.local,并.env.production.local分别.

编辑:我应该指出你设置的环境变量必须以"REACT_APP_"开头,例如."REACT_APP_MY_ENV_VALUE".

编辑2:如果您需要的不仅仅是开发和生产,请使用此评论指定的env-cmd.

  • 感谢您需要以REACT_APP_开头的信息; 我遇到了一个问题. (7认同)
  • 你如何在代码中访问env变量? (3认同)
  • @SebastianBean它使用来自节点process.env.REACT_APP_API_URI的process.env。参见[CRA文档](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables) (2认同)
  • @caffeinescript 目前没有办法拥有除“开发”和“生产”之外的任何环境。我的一个真正迂回的解决方法是在 package.json 中添加一个脚本,该脚本设置一个环境变量来表示它的测试模式,即 `build_testing": "set REACT_APP_ENV=test & react-scripts build`,然后有一个 settings.js 文件其中每个环境变量都有自己的函数,并使用 if 语句检查“process.env.REACT_APP_ENV”的内容,并返回测试环境的硬编码值或真实环境变量。 (2认同)
  • 另外,不要忘记从终端重新启动应用程序。 (2认同)

And*_*y_D 39

你可以这样使用process.env.NODE_ENV:

const apiUrl = process.env.NODE_ENV === 'production' ? process.env.REACT_APP_PROD_API_URL : process.env.REACT_APP_DEV_API_URL;
Run Code Online (Sandbox Code Playgroud)

你需要拥有REACT_APP_PROD_API_URLREACT_APP_DEV_API_URL设置.

或者,如果生产URL始终相同,则可以简化它:

const apiUrl = process.env.NODE_ENV === 'production' ? 'https://example.com' : process.env.REACT_APP_DEV_API_URL;
Run Code Online (Sandbox Code Playgroud)

创建React App NODE_ENV会在构建时为您设置"生产",因此您无需担心何时将其设置为生产.

注意:您必须重新启动服务器(例如,npm start再次运行)以检测环境变量更改.

  • 我们还考虑在将来添加对特定于环境的.env文件的支持. (3认同)
  • 如果您"手动"执行webpack配置,则会有很多方法可以执行此操作.我真的不知道它是否是"规范的",但这种方式有效,而且没有从CRA中弹出,所以我喜欢它. (2认同)
  • 我不知道但有些可能帮助其他缺乏经验的开发人员的东西很愚蠢,`package.json`文件中设置的环境变量需要定义_before_`alaction-scripts build`命令才能被检测到,例如, `REACT_APP_YOUR_VARIABLE = here react-scripts build`. (2认同)

chr*_*and 14

如果您想使用单独的dotenv文件来构建和/或部署到单独的环境(stage,prod),则可以使用env-cmd,如下所示:

npm install --save-dev env-cmd
./node_modules/.bin/env-cmd -f ./stage.env npm build
Run Code Online (Sandbox Code Playgroud)

然后只需相应地更新package.json

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "build:stage": "env-cmd -f ./.env.stage npm run-script build"
  },
Run Code Online (Sandbox Code Playgroud)

然后要构建,只需运行以下shell命令:

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "build:stage": "env-cmd -f ./.env.stage npm run-script build"
  },
Run Code Online (Sandbox Code Playgroud)

  • 这些都是需要明确了解的权衡。但我不认为它们是*每个*用例中最重要的因素。对于某些人来说,每次提交有多个工件可能是可以接受的。替代解决方案也有其自身的缺点:额外的基础设施要求(例如,node.js 服务器),或者容器启动时间明显变慢。IMO,这是一个什么最适合你的问题。 (3认同)
  • 好吧,如果我在构建过程中烘焙配置,我必须为每个部署/环境单独构建应用程序。我无法将一个构建移植到另一个环境,这会让事情在我们不希望的时候变得复杂(墨菲定律)。另外,如果 CI 必须为了替换环境变量而多次构建,那么这对于 CI 来说是相当大的开销。基本上,我偶然发现了[so thread](/sf/ask/3498301481/),这是大致是我的用例。 (2认同)
  • 这是我能看到的唯一可行的解​​决方案。我不明白如何(使用默认的 create-react-app 环境变量设置)实际创建可以部署到测试或开发的构建文件。npm run build 创建用于生产的构建文件,但据我所知,仅此而已(我错过了什么,我一定错过了什么?) (2认同)

Vig*_*ran 13

安装“env-cmd”包

"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "deploy": "gh-pages -d build",
    "start:qa": "env-cmd -f .env.qa react-scripts start",
    "build:qa": "env-cmd -f .env.qa react-scripts build"
  },
Run Code Online (Sandbox Code Playgroud)

在本地如果我们想运行 qa 环境使用 npm run start:qa


Art*_*nko 7

此外,它可以在没有额外依赖的情况下完成:

"scripts": {
  "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'",
  "build:staging": "REACT_APP_ENV=staging npm run build",
  "build:production": "REACT_APP_ENV=production npm run build"
},
Run Code Online (Sandbox Code Playgroud)

而拥有.env.staging.env.production因此文件

  • `"build:生产": "REACT_APP_ENV=生产纱线构建"` 也可以工作 (4认同)
  • 在 Windows 中,您需要使用 `"build:product": "set REACT_APP_ENV=product & npm run build"` (2认同)