Як зберігати файл конфігурації та читати його за допомогою React


101

Я новачок у реагуванні .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, але я не знаю, як використовувати файл конфігурації у React.js

Хто-небудь може підказати мені, як я можу цього досягти?


1
Чи використовуєте ви веб-пакет або якийсь інструмент для компіляції js-коду?
Петр Бела

Загальноприйнятим було б надсилати це значення, встановлювати та читати із змінної середовища на веб-сторінку як глобальне значення, доступне у вашому JavaScript. Потім використовуйте його для отримання даних.
WiredPrairie

1
@PetrBela: так, я використовую webpack для створення bundle.js, але я беру про конфігураційний файл, такий як web.config у .net
Dhaval Patel,

Відповіді:


123

За допомогою webpack ви можете додати в externalsполе конфігурацію, що стосується envwebpack.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, щоб уникнути синтаксичних помилок. Я оновив код відповідно.
Петро Бела

2
Хм, я не зрозумів, що потрібно аналізувати файл JSON. Оскільки externalsочікується, що код буде обчислюватися, вам потрібно стригіфікувати JSON.
Петро Бела

21
у мене це не працює, я отримую таку помилку: [Помилка: Не вдається знайти модуль 'Config'] при використанні require ('Config')
amgohan

4
Що робити, якщо я хочу, щоб webpack не поєднував окремий конфігураційний файл у output.bundle.js? Якщо це буде окремий пакет, чи можу я все-таки вимагати ('Налаштувати')? Дякую
Барні

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_
Томаш Мадейський

У мене є програма ASP.NET Core, створена за допомогою шаблону React, і все, що я зробив, - це додати порожній файл у папку 'ClientApp' і помістити REACT_APP_MYSETTING=valueв нього, а потім звернутися до нього як process.env.REACT_APP_MYSETTINGдо мого коду JSX, і це спрацювало. Дякую!
Нео,

.env мені взагалі не працює в проекті
create-response

1
Вам доведеться перезапустити свій проект в npm, як тільки ви додасте .env у свій кореневий каталог
foyss,

2

Ви можете використовувати пакет dotenv незалежно від того, яку установку ви використовуєте. Це дозволяє створити .env у корені проекту та вказати ключі так

REACT_APP_SERVER_PORT=8000

У файлі входу у ваші програми просто зателефонуйте dotenv (); перед тим, як отримати доступ до клавіш так

process.env.REACT_APP_SERVER_PORT

1
хоча я думаю, що вам потрібно вказати свої ключі, починаючи зREACT_APP_
HenryM

1

Якщо у вас є файл .properties або файл .ini

Насправді у випадку, якщо у вас є якийсь файл, який має пари значень ключа, як це:

someKey=someValue
someOtherKey=someOtherValue

Ви можете імпортувати це у веб-пакет за допомогою модуля npm, який називається properties-reader

Я знайшов це дійсно корисним, оскільки інтегрую реакцію з фреймворком 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. Імпортуйте цю константу як config

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

  1. Використовуйте його так само, як зазначено у прийнятій відповіді

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


3
Ваш крок 2 щодо webpack.config.js, якщо хтось використовує create-response-app, тоді немає конфігурації webpack (або він прихований). Як діяти в такому випадку?
joedotnot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.