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


73

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

console.log(process.env.REACT_APP_API_URL) // http://localhost:5555

当我npm start通过读取.env文件运行时它起作用:

REACT_APP_API_URL=http://localhost:5555

我如何像http://localhost:1234执行a一样设置其他值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"
  }
}

Answers:


51

您可以这样使用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;

你需要有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;

Create React AppNODE_ENV在构建时会为您设置为“生产”,因此您无需担心何时将其设置为生产。

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


谢谢。我知道这种方法。您是否认为这是针对这种情况的规范解决方案?
sigmus

2
如果您“手动”执行webpack配置,将有很多方法可以做到这一点。我不诚实地知道它是否是“规范的”,但是这种方法可以正常工作,并且不会从CRA中退出,所以我喜欢它。
Andy_D

4
我们还考虑在将来增加对特定于环境的.env文件的支持。
Dan Abramov

1
以为我可能会解决这个问题,但在这里是github.com/facebookincubator/create-react-app/pull/1344
Andy_D

2
我不知道但希望能对其他经验不足的开发人员有所帮助的愚蠢事情,例如,package.json需要在命令之前定义文件内部设置的环境变量react-scripts build,以便对其进行检测REACT_APP_YOUR_VARIABLE=here react-scripts build
安迪

136

我想您现在可以正常工作了,但是对于其他发现此问题的人,您可以在.env“ create-react-app”项目根目录下的文件中设置默认环境变量。

要分离使用时使用的变量npm startnpm run build可以再创建两个环境文件-.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,如本注释所述


2
@SebastianBean它使用来自节点:的process.env process.env.REACT_APP_API_URI。见CRA文档
阿迪Unnithan

如果构建脚本始终将环境设置为'production'。如何将我的环境='test'部署到测试服务器?
caffeinescript

1
@caffeinescript除了“开发”和“生产”以外,目前没有其他环境。我真正绕过的方法是在package.json中添加一个脚本,该脚本设置一个表示其测试模式的环境变量,即build_testing": "set REACT_APP_ENV=test & react-scripts build,然后有一个settings.js文件,其中每个环境变量都有其自己的功能,并带有一条if语句来检查的内容,process.env.REACT_APP_ENV或者返回测试环境的硬编码值或实际环境变量。
Baldeep

9
感谢您提供有关以REACT_APP_开头的信息;我遇到了一个问题。
DylanSp

1
另外,不要忘记从TERMINAL重新启动应用程序。
Animesh Singh,

26

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

npm install --save-dev env-cmd
./node_modules/.bin/env-cmd -f ./stage.env npm build

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

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "build:stage": "env-cmd -f ./.stage.env npm run-script build"
  },

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

npm run build:stage

它有帮助的链接env-cmd在这里,但国际海事组织是很危险的有不同的构建针对不同deplozments
helt

@helt您能详细说明吗?您担心的风险因素是什么?
chrishiestand19年

好吧,如果我在构建过程中烘烤了配置,则必须针对每个部署/环境分别构建应用程序。我不能将一个构建移植到另一个环境,这会使我们不想要的事情变得很复杂(墨菲定律)。另外,如果必须多次构建以替换环境变量,则CI的开销很大。基本上,我偶然发现了这样的线程,这大概是我的用例。
helt

2
这些是必须要知道的折衷方案。但是我不认为它们是每个用例中最重要的因素。对于某些对象,每个提交都可以有多个工件可能是可以接受的。替代解决方案也有其自身的缺点:额外的基础架构要求(例如,node.js服务器),或者容器启动时间明显变慢。IMO,这是一个最适合您的问题。
chrishiestand19年

这是我看到的唯一可行的解​​决方案。我不了解如何(使用默认的create-react-app环境变量设置)实际创建可部署以测试或开发的构建文件。npm run build创建用于生产的构建文件,就我所知(就是我所缺少的,我一定要缺少什么?)
blomster

5

安装'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"
  },

在本地,如果我们要运行QA环境,请使用 npm run start:qa


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.