Reactjs 我们如何在cra(createreactapp)中的运行时传递环境或配置变量

Reactjs 我们如何在cra(createreactapp)中的运行时传递环境或配置变量,reactjs,npm,environment-variables,create-react-app,build-tools,Reactjs,Npm,Environment Variables,Create React App,Build Tools,我们如何在应用程序的运行时传递环境或配置变量。我不想为不同的环境生成,但在不同的环境中使用一个具有不同配置的生成您可以将两个环境变量文件添加到项目的根目录中,用于开发和生产版本。他们应该被命名 .env.development-这将使用npm启动开发阶段 .env.production-这将用于构建产品阶段 属性可以添加为以下内容,请注意前缀REACT_APP_ REACT_APP_PROPERTY1=some_value 这个属性可以理解为 <p>{process.env.REA

我们如何在应用程序的运行时传递环境或配置变量。我不想为不同的环境生成,但在不同的环境中使用一个具有不同配置的生成

您可以将两个环境变量文件添加到项目的根目录中,用于开发和生产版本。他们应该被命名

.env.development-这将使用npm启动开发阶段 .env.production-这将用于构建产品阶段

属性可以添加为以下内容,请注意前缀REACT_APP_

REACT_APP_PROPERTY1=some_value
这个属性可以理解为

<p>{process.env.REACT_APP_PROPERTY1}</p>

对于开发和生产版本,可以将2个环境变量文件添加到项目的根目录中。他们应该被命名

.env.development-这将使用npm启动开发阶段 .env.production-这将用于构建产品阶段

属性可以添加为以下内容,请注意前缀REACT_APP_

REACT_APP_PROPERTY1=some_value
这个属性可以理解为

<p>{process.env.REACT_APP_PROPERTY1}</p>

对于开发和生产版本,可以将2个环境变量文件添加到项目的根目录中。他们应该被命名

.env.development-这将使用npm启动开发阶段 .env.production-这将用于构建产品阶段

属性可以添加为以下内容,请注意前缀REACT_APP_

REACT_APP_PROPERTY1=some_value
这个属性可以理解为

<p>{process.env.REACT_APP_PROPERTY1}</p>

我们将CreateReact应用程序构建为静态网站,并将其直接推送到一个简单的web服务器。这就是为什么不能在那里使用env变量。我们找到了一个很好的解决方法,并计划就此写一篇短文:

一,。使用一个环境变量启动应用程序

让我们假设您有一个开发、暂存和生产环境,就像我们做的大多数项目一样

我们在启动脚本中只设置了一个ENV变量REACT\u APP\u ENV。每个环境都有自己的启动和构建脚本

# package.json
# ...
"scripts": {
  "start": "REACT_APP_ENV=development react-scripts start",
  "start:staging": "REACT_APP_ENV=staging react-scripts start",
  "start:prod": "REACT_APP_ENV=production react-scripts start",
  "build:staging": "REACT_APP_ENV=staging react-scripts build",
  "build:prod": "REACT_APP_ENV=production react-scripts build"
},
二,。安装配置文件

在createreact应用程序中,您将配置文件存储在src/config/index.js下。在此配置文件中,您可以根据环境定义值

# src/config/index.js
const env = process.env.REACT_APP_ENV

export const appConfig = {
  api: {
    networkInterface: ({
      development: 'http://localhost:5000/graphql',
      staging: 'https://project-staging.herokuapp.com/graphql',
      production: 'https://project.herokuapp.com/graphql',
    })[env],
    // add more here
  },
}

export default appConfig
三,。用法

在应用程序中,您可以访问以下简单配置:

import config from './src/config'

# usage
config.api.networkInterface 

我们将CreateReact应用程序构建为静态网站,并将其直接推送到一个简单的web服务器。这就是为什么不能在那里使用env变量。我们找到了一个很好的解决方法,并计划就此写一篇短文:

一,。使用一个环境变量启动应用程序

让我们假设您有一个开发、暂存和生产环境,就像我们做的大多数项目一样

我们在启动脚本中只设置了一个ENV变量REACT\u APP\u ENV。每个环境都有自己的启动和构建脚本

# package.json
# ...
"scripts": {
  "start": "REACT_APP_ENV=development react-scripts start",
  "start:staging": "REACT_APP_ENV=staging react-scripts start",
  "start:prod": "REACT_APP_ENV=production react-scripts start",
  "build:staging": "REACT_APP_ENV=staging react-scripts build",
  "build:prod": "REACT_APP_ENV=production react-scripts build"
},
二,。安装配置文件

在createreact应用程序中,您将配置文件存储在src/config/index.js下。在此配置文件中,您可以根据环境定义值

# src/config/index.js
const env = process.env.REACT_APP_ENV

export const appConfig = {
  api: {
    networkInterface: ({
      development: 'http://localhost:5000/graphql',
      staging: 'https://project-staging.herokuapp.com/graphql',
      production: 'https://project.herokuapp.com/graphql',
    })[env],
    // add more here
  },
}

export default appConfig
三,。用法

在应用程序中,您可以访问以下简单配置:

import config from './src/config'

# usage
config.api.networkInterface 

我们将CreateReact应用程序构建为静态网站,并将其直接推送到一个简单的web服务器。这就是为什么不能在那里使用env变量。我们找到了一个很好的解决方法,并计划就此写一篇短文:

一,。使用一个环境变量启动应用程序

让我们假设您有一个开发、暂存和生产环境,就像我们做的大多数项目一样

我们在启动脚本中只设置了一个ENV变量REACT\u APP\u ENV。每个环境都有自己的启动和构建脚本

# package.json
# ...
"scripts": {
  "start": "REACT_APP_ENV=development react-scripts start",
  "start:staging": "REACT_APP_ENV=staging react-scripts start",
  "start:prod": "REACT_APP_ENV=production react-scripts start",
  "build:staging": "REACT_APP_ENV=staging react-scripts build",
  "build:prod": "REACT_APP_ENV=production react-scripts build"
},
二,。安装配置文件

在createreact应用程序中,您将配置文件存储在src/config/index.js下。在此配置文件中,您可以根据环境定义值

# src/config/index.js
const env = process.env.REACT_APP_ENV

export const appConfig = {
  api: {
    networkInterface: ({
      development: 'http://localhost:5000/graphql',
      staging: 'https://project-staging.herokuapp.com/graphql',
      production: 'https://project.herokuapp.com/graphql',
    })[env],
    // add more here
  },
}

export default appConfig
三,。用法

在应用程序中,您可以访问以下简单配置:

import config from './src/config'

# usage
config.api.networkInterface 

几天前我也遇到了同样的问题,我发现了一个很难解决的问题。基本上,在/build/public目录中使用config.js。config.js可以是这样一个简单的代码:-

window.DYNAMIC_PROPERTIES = {
    "ENV": "UAT",
    "API_ENDPOINT": "UAT"
}
您希望此特定文件是基于您的环境动态生成的文件。如果你对我是如何做到这一点感兴趣,请继续读到最后

现在,要在react应用程序中访问此脚本,请将此脚本包含在index.html头标记中

<script src="%PUBLIC_URL%/configs.js"></script>
这里的基本思想是HTML将在构建/公共文件夹中执行脚本。此脚本将属性附加到窗口范围,并使其可用于应用程序

现在,完成所有这些的关键是能够动态地注入环境变量。我是如何做到这一点的:-

我们使用一个nodejs express服务器为UI提供服务,因此我设法在/build/public/文件夹中动态创建了这个简单的js文件。server.js的示例代码:-

const path = require("path");
const express = require("express");
const fs = require('fs');
const app = express(); // create express app

fs.copyFile(`config.${process.env.ENVIRONMENT}.js`, "./build/config.js", (err) => {
  if(err){console.log("Something went wrong while setting env variables", err)}
  else{console.log("Env variables set for ",process.env.ENVIRONMENT )}
}); 

// add middlewares
app.use(express.static(path.join(__dirname, ".", "build")));
app.use(express.static("public"));

app.use((req, res, next) => {
  res.sendFile(path.join(__dirname, ".", "build", "index.html"));
});

// start express server on port 5000
app.listen(5000, () => {
  console.log("server started on port 5000");
});
基本上,我有单独的配置文件,比如config.dev.js、config.uat.js等等。此服务器的start命令将作为dev、uat或prod注入属性环境,并且此节点服务器将在build/public中放置正确的配置文件 在应用程序启动时,请注意fs.copyFile命令


好的,希望这有帮助。如果你找到一个更好的方法,一定要评论你的解决方案。

我几天前也有同样的问题,发现了一个棘手的、但可能的解决方案。基本上,在/build/public目录中使用config.js。config.js可以是这样一个简单的代码:-

window.DYNAMIC_PROPERTIES = {
    "ENV": "UAT",
    "API_ENDPOINT": "UAT"
}
您希望此特定文件是基于您的环境动态生成的文件。如果你对我是如何做到这一点感兴趣,请继续读到最后

现在,要在react应用程序中访问此脚本,请将此脚本包含在index.html头标记中

<script src="%PUBLIC_URL%/configs.js"></script>
这里的基本思想是HTML将在构建/公共文件夹中执行脚本。此脚本将属性附加到窗口范围,并使其可用于应用程序

现在,完成所有这些的关键是能够动态地注入环境变量。我是如何做到这一点的:-

我们使用一个nodejs express服务器为UI提供服务,因此我设法在/build/public/文件夹中动态创建了这个简单的js文件。server.js的示例代码:-

const path = require("path");
const express = require("express");
const fs = require('fs');
const app = express(); // create express app

fs.copyFile(`config.${process.env.ENVIRONMENT}.js`, "./build/config.js", (err) => {
  if(err){console.log("Something went wrong while setting env variables", err)}
  else{console.log("Env variables set for ",process.env.ENVIRONMENT )}
}); 

// add middlewares
app.use(express.static(path.join(__dirname, ".", "build")));
app.use(express.static("public"));

app.use((req, res, next) => {
  res.sendFile(path.join(__dirname, ".", "build", "index.html"));
});

// start express server on port 5000
app.listen(5000, () => {
  console.log("server started on port 5000");
});
基本上,我有单独的配置文件,比如config.dev.js、config.uat.js等等。此服务器的start命令将作为dev、uat或prod注入属性环境,并且此节点服务器将在应用程序启动时将正确的配置文件放入build/public中。请注意fs.copyFile命令


好的,希望这有帮助。如果你找到一个更好的方法,一定要评论你的解决方案。

我几天前也有同样的问题,发现了一个棘手的、但可能的解决方案。基本上,在/build/public目录中使用config.js。config.js可以是这样一个简单的代码:-

window.DYNAMIC_PROPERTIES = {
    "ENV": "UAT",
    "API_ENDPOINT": "UAT"
}
您希望此特定文件是基于您的环境动态生成的文件。如果你对我是如何做到这一点感兴趣,请继续读到最后

现在,要在react应用程序中访问此脚本,请将此脚本包含在index.html头标记中

<script src="%PUBLIC_URL%/configs.js"></script>
这里的基本思想是HTML将在构建/公共文件夹中执行脚本。此脚本将属性附加到窗口范围,并使其可用于应用程序

现在,完成所有这些的关键是能够动态地注入环境变量。我是如何做到这一点的:-

我们使用一个nodejs express服务器为UI提供服务,因此我设法在/build/public/文件夹中动态创建了这个简单的js文件。server.js的示例代码:-

const path = require("path");
const express = require("express");
const fs = require('fs');
const app = express(); // create express app

fs.copyFile(`config.${process.env.ENVIRONMENT}.js`, "./build/config.js", (err) => {
  if(err){console.log("Something went wrong while setting env variables", err)}
  else{console.log("Env variables set for ",process.env.ENVIRONMENT )}
}); 

// add middlewares
app.use(express.static(path.join(__dirname, ".", "build")));
app.use(express.static("public"));

app.use((req, res, next) => {
  res.sendFile(path.join(__dirname, ".", "build", "index.html"));
});

// start express server on port 5000
app.listen(5000, () => {
  console.log("server started on port 5000");
});
基本上,我有单独的配置文件,比如config.dev.js、config.uat.js等等。此服务器的start命令将作为dev、uat或prod注入属性环境,并且此节点服务器将在应用程序启动时将正确的配置文件放入build/public中。请注意fs.copyFile命令


好的,希望这有帮助。如果找到更好的方法,请评论您的解决方案。

为什么不为每个环境变量设置执行一次生成?这可能是最好的解决方法。@Thole-我想这样做是为了避免为每个环境变量重新构建,为什么不为每个环境变量设置一个构建呢?这可能是最好的解决方法。@Thole-我想这样做是为了避免为每个环境变量重新构建,为什么不为每个环境变量设置一个构建呢?这可能是最好的解决方法。@Thole-我想这样做是为了避免为每个人重建env@SAP:谢谢您的解决方案。但是如果我们在云S3中托管,我们不会手动启动。我们将只上传build文件夹,它不会公开env文件或变量。是否可以使用build文件夹+configfiles@DaptalMs是的,这就是我试图在上面解释的。env.development文件用于本地开发。当您运行npm run build生成生产工件时,它将使用.env.production并绑定到main.js文件。拥有2个文件的主要目的是分离开发属性和生产属性。@SAP:谢谢您的解决方案。但是如果我们在云S3中托管,我们不会手动启动。我们将只上传build文件夹,它不会公开env文件或变量。是否可以使用build文件夹+configfiles@DaptalMs是的,这就是我试图在上面解释的。env.development文件用于本地开发。当您运行npm run build生成生产工件时,它将使用.env.production并绑定到main.js文件。拥有2个文件的主要目的是分离开发属性和生产属性。@SAP:谢谢您的解决方案。但是如果我们在云S3中托管,我们不会手动启动。我们将只上传build文件夹,它不会公开env文件或变量。是否可以使用build文件夹+configfiles@DaptalMs是的,这就是我试图在上面解释的。env.development文件用于本地开发。当您运行npm时,请运行build以生成产品
n工件,它将使用.env.production并绑定到main.js文件。拥有两个文件的主要目的是分离开发属性和生产属性。这是个好方法。但是你还是按照环境来构建它,对吗?我希望它只构建一次,并在所有环境中使用相同的配置文件daptal Ms。您有没有针对非环境特定构建的解决方案??我也在寻找动态构建。@DaptalMs您找到解决方案了吗?甚至我也在寻找同样的构建方法。但是你还是按照环境来构建它,对吗?我希望它只构建一次,并在所有环境中使用相同的配置文件daptal Ms。您有没有针对非环境特定构建的解决方案??我也在寻找动态构建。@DaptalMs您找到解决方案了吗?甚至我也在寻找同样的构建方法。但是你还是按照环境来构建它,对吗?我希望它只构建一次,并在所有环境中使用相同的配置文件daptal Ms。您有没有针对非环境特定构建的解决方案??我也在寻找动态构建。@DaptalMs您找到解决方案了吗?甚至我也在寻找同样的构建一次的方法