構成ファイルを保存し、Reactを使用して読み取る方法


101

私はreact.jsの初心者です。サーバーからデータをフェッチして次のように使用する1つのコンポーネントを実装しました。

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を構成ファイルに保存したいので、これをテストサーバーまたはプロダクションに展開したときに、jsファイルではなく構成ファイルのURLを変更する必要がありますが、react.jsで構成ファイルを使用する方法がわかりません

誰でも私にこれをどのように達成できるかを教えてくれますか?


1
あなたはjspackをコンパイルするためにwebpackまたは何らかのツールを使用していますか?
Petr Bela

JavaScript内で利用可能なグローバル値として、その値を送信し、環境変数からWebページに設定して読み取るのが一般的です。次に、それを使用してデータをフェッチします。
WiredPrairie 2015年

1
@PetrBela:はい、私はbundle.jsを構築するためにwebpackを使用していますが、.netのweb.configのような構成ファイルを使用しています
Dhaval Patel

回答:


123

webpackを使用すると、環境固有の設定を次のexternalsフィールドに入力できますwebpack.config.js

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/...')

Reactの場合:

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

それがあなたのユースケースをカバーしているかどうかはわかりませんが、私たちにとってはうまく機能しています。


2
どういたしまして。ところで、シンタックスエラーを回避するにはJSONを使用する方がよいことを知ってからです。私はそれに応じてコードを更新しました。
Petr Bela

2
うーん、JSONファイルを解析する必要があることに気付いていません。externalsはコードが評価されることを想定しているため、JSONを文字列化する必要があります。
Petr Bela 2016年

21
これは私にとってはうまくいきません、私はこのエラーを受け取ります:require( 'Config')を使用するときに[エラー:モジュール 'Config'が見つかりません]
amgohan

4
webpackが個別の設定ファイルをoutput.bundle.jsにバンドルしないようにするにはどうすればよいですか?バンドルとは別の場合でも、私は必要です( 'Config')?おかげで
バーニー

3
どのようにしてこれを機能させたのですか?私はそれを提案どおりに行い、@ amgohanと同じ「モジュールが見つかりません」を取得しています。
ceebreenk

67

Create React Appを使用した場合は、.envファイルを使用して環境変数を設定できます。ドキュメントはここにあります:

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

基本的には、プロジェクトルートの.envファイルで次のようにします。

REACT_APP_NOT_SECRET_CODE=abcdef

あなたはあなたのコンポーネントからそれにアクセスすることができます

process.env.REACT_APP_NOT_SECRET_CODE

24
変数名は次で始まる必要があることを覚えておいてくださいREACT_APP_
Tomasz Madeyski 2017

Reactテンプレートを使用して作成されたASP.NET Coreアプリがあります。「ClientApp」フォルダーの下に空のファイルを追加REACT_APP_MYSETTING=valueしてそこに配置process.env.REACT_APP_MYSETTINGし、JSXコードのように参照するだけで動作しました。ありがとう!
ネオ

.envがcreate-react-appプロジェクトでまったく機能しません
user8620575

1
ルートディレクトリに.envを追加したら、npmでプロジェクトを再起動する必要があります
foyss

2

使用する設定に関係なく、dotenvパッケージを使用できます。プロジェクトのルートに.envを作成し、そのようにキーを指定できます

REACT_APP_SERVER_PORT=8000

アプリケーションエントリファイルで、dotenv();を呼び出すだけです。そのようなキーにアクセスする前に

process.env.REACT_APP_SERVER_PORT

1
キーを指定する必要があると思いますがREACT_APP_
HenryM '29年

1

.propertiesファイルまたは.iniファイルがある場合

実際に、次のようなキーと値のペアを持つファイルがある場合:

someKey=someValue
someOtherKey=someOtherValue

プロパティリーダーと呼ばれるnpmモジュールによってそれをwebpackにインポートできます。

すでにapplication.propertiesファイルがあるJava Springフレームワークと統合して反応しているので、これは本当に役に立ちました。これにより、すべての構成を1か所にまとめることができます。

  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/...')


3
webpack.config.jsに関するステップ2。create-react-appを使用している場合、webpack構成はありません(または非表示になっています)。その場合の進め方は?
joedotnot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.