【问题标题】:How to store Configuration file and read it using React如何存储配置文件并使用 React 读取它
【发布时间】:2015-08-14 15:14:27
【问题描述】:

我是 react.js 的新手,我已经实现了一个组件,我在其中从服务器获取数据并像使用它一样,

CallEnterprise:function(TenantId){


    fetchData('http://xxx.xxx.xx.xx:8090/Enterprises?TenantId='+TenantId+' &format=json').then(function(enterprises) 
    {
        EnterprisePerspectiveActions.getEnterprise(enterprises);
    }).catch(function()
    {
        alert("There was some issue in API Call please contact Admin");
        //ComponentAppDispatcher.handleViewAction({
        //    actionType: MetaItemConstants.RECEIVE_ERROR,
        //    error: 'There was a problem getting the enterprises'
        //});
    });
},

我想将 Url 存储在配置文件中,因此当我在测试服务器或生产服务器上部署它时,我只需要更改配置文件上的 url 而不是 js 文件,但我不知道如何在反应中使用配置文件。 js

谁能指导我如何做到这一点?

【问题讨论】:

  • 你是用webpack还是其他工具编译js代码?
  • 通常会将该值发送、设置并从环境变量读取到网页,作为 JavaScript 中可用的全局值。然后,用它来获取数据。
  • @PetrBela :是的,我正在使用 webpack 构建 bundle.js,但我正在使用 .net 中的 web.config 之类的配置文件

标签: javascript reactjs configuration webpack flux


【解决方案1】:

使用 webpack,您可以将特定于 env 的配置放入 webpack.config.jsexternals 字段中

externals: {
  'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? {
    serverUrl: "https://myserver.com"
  } : {
    serverUrl: "http://localhost:8090"
  })
}

如果您想将配置存储在单独的 JSON 文件中,这也是可能的,您可以要求该文件并分配给 Config

externals: {
  'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? require('./config.prod.json') : require('./config.dev.json'))
}

然后在你的模块中,你可以使用配置:

var Config = require('Config')
fetchData(Config.serverUrl + '/Enterprises/...')

对于反应:

import Config from 'Config';
axios.get(this.app_url, {
        'headers': Config.headers
        }).then(...);

不确定它是否涵盖您的用例,但对我们来说效果很好。

【讨论】:

  • 不客气。顺便说一句,我们已经知道最好使用 JSON 来避免语法错误。我已经相应地更新了代码。
  • 嗯,我还没有意识到 require 会解析 JSON 文件。因为externals 需要对代码进行评估,所以您需要对 JSON 进行字符串化。
  • 这对我不起作用,我收到此错误:[Error: Cannot find module 'Config'] when using require('Config')
  • 如果我不希望 webpack 将单独的配置文件捆绑到 output.bundle.js 中怎么办?如果它与捆绑包分开,我还需要('Config')吗?谢谢
  • 你们是怎么做到的?我完全按照建议做,我得到'找不到模块'配置'',与@amgohan 相同。
【解决方案2】:

如果您使用 Create React App,您可以使用 .env 文件设置环境变量。文档在这里:

https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables

基本上在项目根目录的 .env 文件中做这样的事情。

REACT_APP_NOT_SECRET_CODE=abcdef

注意变量名必须以REACT_APP_

开头

你可以从你的组件访问它

process.env.REACT_APP_NOT_SECRET_CODE

【讨论】:

  • 记住你的变量名必须REACT_APP_开头
  • 我有一个使用 React 模板创建的 ASP.NET Core 应用程序,我所做的只是在“ClientApp”文件夹下添加一个空文件并将REACT_APP_MYSETTING=value 放入其中,然后将其称为@987654326 @ 在我的 JSX 代码中,它起作用了。谢谢!
  • .env 在 create-react-app 项目中对我完全不起作用
  • 将 .env 添加到根目录后,您必须在 npm 上重新启动项目
  • @Rob 重点不是它是秘密,而是它会因环境而变化。我有一个应用程序部署到全国四个数据中心的 1200 台服务器上,每个数据中心最多有 8 个集群,每个集群都应用本地 API 端点。你不想硬编码这样的东西......
【解决方案3】:

无论您使用什么设置,都可以使用 dotenv 包。它允许您在项目根目录中创建一个 .env 并像这样指定您的密钥

REACT_APP_SERVER_PORT=8000

在您的应用程序入口文件中,您只需调用 dotenv();在像这样访问密钥之前

process.env.REACT_APP_SERVER_PORT

【讨论】:

  • 虽然我认为您需要指定以REACT_APP_开头的密钥
【解决方案4】:

如果您有 .properties 文件或 .ini 文件

实际上,如果您有任何文件具有这样的键值对:

someKey=someValue
someOtherKey=someOtherValue

您可以通过名为 properties-reader 的 npm 模块将其导入到 webpack 中

我发现这非常有用,因为我正在将 react 与 Java Spring 框架集成,其中已经有一个 application.properties 文件。这有助于我将所有配置集中在一个地方。

  1. 从 package.json 中的依赖项部分导入

"properties-reader": "0.0.16"

  1. 将此模块导入到 webpack.config.js 上

const PropertiesReader = require('properties-reader');

  1. 读取属性文件

const appProperties = PropertiesReader('Path/to/your/properties.file')._properties;

  1. 将此常量作为配置导入

externals: { 'Config': JSON.stringify(appProperties) }

  1. 按照接受的答案中提到的相同方式使用它

var Config = require('Config') fetchData(Config.serverUrl + '/Enterprises/...')

【讨论】:

  • 关于 webpack.config.js 的第 2 步,如果使用的是 create-react-app 则没有 webpack 配置(或者它是隐藏的)。这种情况下怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多