Как сохранить файл конфигурации и прочитать его с помощью React


104

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

Может ли кто-нибудь помочь мне, как я могу этого добиться?


1
Вы используете веб-пакет или какой-либо инструмент для компиляции js-кода?
Петр Бела

Обычно это значение отправляется, устанавливается и считывается из переменной среды на веб-страницу как глобальное значение, доступное в вашем JavaScript. Затем используйте его для получения данных.
WiredPrairie 01

1
@PetrBela: да, я использую webpack для создания bundle.js, но я говорю о файле конфигурации, таком как web.config в .net
Дхавал Патель

Ответы:


126

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

2
Хм, я не понял, что требуется анализировать файл JSON. Поскольку externalsожидается, что код будет оценен, вам необходимо преобразовать JSON в строку.
Петр Бела

21
у меня это не работает, я получаю такую ​​ошибку: [Ошибка: не удается найти модуль «Конфигурация»] при использовании require («Конфигурация»)
amgohan

4
Что делать, если я хочу, чтобы webpack не объединял отдельный файл конфигурации в output.bundle.js? Если это будет отдельно от пакета, могу ли я потребовать («Конфигурация»)? Спасибо
Барни

3
Как кто-нибудь из вас заставил это работать? Я делаю именно так, как было предложено, и получаю сообщение «Не могу найти модуль« Конфигурация »», то же самое, что и @amgohan.
ceebreenk

71

Если вы использовали приложение Create React, вы можете установить переменную среды с помощью файла .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

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

.env для меня вообще не работает в проекте
create-react

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

Это похоже на антипаттерн. Конечные точки API не являются секретами, которые следует определять в переменной среды. Они являются частью определения приложения.
Роб

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

Вы можете импортировать это в webpack с помощью модуля 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 06
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.