구성 파일을 저장하고 React를 사용하여 읽는 방법


103

나는 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을 저장하고 싶으므로 테스트 서버 또는 프로덕션에 배포 할 때 js 파일이 아닌 구성 파일의 URL을 변경해야하지만 react.js에서 구성 파일을 사용하는 방법을 모르겠습니다.

누구든지 이것을 어떻게 얻을 수 있습니까?


1
웹팩이나 일부 도구를 사용하여 js 코드를 컴파일합니까?
Petr Bela

해당 값을 보내고 환경 변수에서 웹 페이지로 JavaScript 내에서 사용 가능한 전역 값으로 설정 및 읽는 것이 일반적입니다. 그런 다음이를 사용하여 데이터를 가져옵니다.
WiredPrairie

1
@PetrBela : 예, webpack을 사용하여 bundle.js를 빌드하고 있지만 .net에서 web.config와 같은 구성 파일을 사용하고 있습니다
Dhaval Patel

답변:


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
천만에요. BTW 우리는 구문 오류를 피하기 위해 JSON을 사용하는 것이 더 낫다는 것을 배웠습니다. 그에 따라 코드를 업데이트했습니다.
Petr Bela

2
흠 나는 JSON 파일을 구문 분석해야한다는 것을 깨닫지 못했습니다. 때문에 externals코드가 평가 될 것으로 예상, 당신은 JSON을 캐릭터 라인 화해야합니다.
Petr Bela

21
이것은 나를 위해 작동하지 않습니다.이 오류가 발생합니다. [오류 : require ( 'Config')를 사용할 때 'Config'모듈을 찾을 수 없습니다]
amgohan

4
webpack이 output.bundle.js에 별도의 구성 파일을 번들하지 않게하려면 어떻게해야합니까? 번들과 별 개인 경우에도 ( 'Config')가 필요할 수 있습니까? 감사합니다
Barny

3
이걸 어떻게 작동 시키 셨나요? 제안 된대로 정확히 수행하고 @amgohan과 동일한 '모듈'구성을 찾을 수 없음 '이 표시됩니다.
ceebreenk

70

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_
토마스 Madeyski

React 템플릿으로 만든 ASP.NET Core 앱이 있고 'ClientApp'폴더 아래에 빈 파일을 추가하고 그 REACT_APP_MYSETTING=value안에 넣은 다음 process.env.REACT_APP_MYSETTINGJSX 코드 에서처럼 참조 하면 작동했습니다. 감사!
Neo

.env는 create-react-app 프로젝트에서 전혀 작동하지 않습니다
user8620575

3
.env를 루트 디렉토리에 추가하면 npm에서 프로젝트를 다시 시작해야합니다
foyss

이것은 반 패턴처럼 보입니다. API 엔드 포인트는 환경 변수에 정의되어야하는 비밀이 아닙니다. 이는 앱 정의의 일부입니다.
Rob

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

properties-reader 라는 npm 모듈로 webpack으로 가져올 수 있습니다.

이미 application.properties 파일이있는 Java Spring 프레임 워크와 반응을 통합하고 있기 때문에 이것이 정말 유용하다는 것을 알았습니다. 이렇게하면 모든 구성을 한곳에 보관할 수 있습니다.

  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.