Come memorizzare il file di configurazione e leggerlo usando React


101

Sono nuovo su react.js, ho implementato un componente in cui sto recuperando i dati dal server e lo uso come,

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'
        //});
    });
},

Voglio memorizzare l'URL nel file di configurazione, quindi quando l'ho distribuito sul server di test o sulla produzione devo solo cambiare l'URL sul file di configurazione non nel file js ma non so come utilizzare il file di configurazione in react.js

Qualcuno può guidarmi per favore come posso raggiungere questo obiettivo?


1
Usi webpack o qualche strumento per compilare il codice js?
Petr Bela

Sarebbe comune inviare quel valore, impostato e letto da una variabile di ambiente alla pagina web come valore globale disponibile all'interno del tuo JavaScript. Quindi, usalo per recuperare i dati.
WiredPrairie

1
@PetrBela: sì, sto usando webpack per creare bundle.js ma mi sto occupando di file di configurazione come web.config in .net
Dhaval Patel

Risposte:


124

Con webpack puoi inserire la configurazione specifica di env nel externalscampo inwebpack.config.js

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

Se vuoi memorizzare le configurazioni in un file JSON separato, anche questo è possibile, puoi richiedere quel file e assegnarlo a Config:

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

Quindi nei tuoi moduli, puoi usare la configurazione:

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

Per React:

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

Non sono sicuro che copra il tuo caso d'uso, ma ha funzionato abbastanza bene per noi.


2
Prego. A proposito, da allora abbiamo imparato che è meglio usare JSON per evitare errori di sintassi. Ho aggiornato il codice di conseguenza.
Petr Bela

2
Hmm non mi sono reso conto che richiede l'analisi del file JSON. Poiché si externalsaspetta che un codice venga valutato, è necessario stringere il JSON.
Petr Bela

21
questo non funziona per me, ricevo questo errore: [Errore: Impossibile trovare il modulo 'Config'] quando utilizzo require ('Config')
amgohan

4
E se volessi che webpack non raggruppasse un file di configurazione separato in output.bundle.js? Se fosse separato dal bundle, posso comunque richiedere ('Config')? Grazie
Barny

3
Come avete fatto a farlo funzionare? Lo faccio esattamente come suggerito e ricevo "Impossibile trovare il modulo" Config ", come @amgohan.
ceebreenk

67

Se hai utilizzato Crea app React, puoi impostare una variabile di ambiente utilizzando un file .env. La documentazione è qui:

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

Fondamentalmente fai qualcosa di simile nel file .env alla radice del progetto.

REACT_APP_NOT_SECRET_CODE=abcdef

Puoi accedervi dal tuo componente con

process.env.REACT_APP_NOT_SECRET_CODE

24
ricorda solo che il nome della tua variabile deve iniziare conREACT_APP_
Tomasz Madeyski

Ho un'app ASP.NET Core creata con il modello React e tutto ciò che ho fatto è stato aggiungere un file vuoto nella cartella "ClientApp" e REACT_APP_MYSETTING=valueinserirlo, quindi fare riferimento ad esso come process.env.REACT_APP_MYSETTINGnel mio codice JSX e ha funzionato. Grazie!
Neo

.env non funziona affatto nel progetto create-react-app
user8620575

1
Dovrai riavviare il tuo progetto su npm dopo aver aggiunto .env alla tua directory principale
foyss

2

Puoi usare il pacchetto dotenv indipendentemente dalla configurazione che usi. Ti permette di creare un .env nella radice del tuo progetto e di specificare le tue chiavi in ​​questo modo

REACT_APP_SERVER_PORT=8000

Nel file di ingresso delle applicazioni è sufficiente chiamare dotenv (); prima di accedere alle chiavi in ​​questo modo

process.env.REACT_APP_SERVER_PORT

1
anche se penso che sia necessario specificare le chiavi che iniziano conREACT_APP_
HenryM

1

Nel caso tu abbia un file .properties o un file .ini

In realtà nel caso in cui tu abbia un file con coppie di valori chiave come questa:

someKey=someValue
someOtherKey=someOtherValue

Puoi importarlo nel webpack da un modulo npm chiamato properties-reader

L'ho trovato molto utile poiché sto integrando React con il framework Java Spring dove è già presente un file application.properties. Questo mi aiuta a mantenere tutte le configurazioni insieme in un unico posto.

  1. Importalo dalla sezione delle dipendenze in package.json

"properties-reader": "0.0.16"

  1. Importa questo modulo in webpack.config.js in alto

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

  1. Leggi il file delle proprietà

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

  1. Importa questa costante come config

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

  1. Usalo nello stesso modo indicato nella risposta accettata

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


3
Il tuo passaggio 2 su webpack.config.js, se si usa create-react-app, non c'è configurazione webpack (o è nascosto). Come procedere in quel caso?
joedotnot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.