1. CRA에서의 .env
- CRA(Creat React App)에서는 .env를 어떻게 써야할까
- 기본적으로 환경 변수를 사용할 수 있도록 세팅되어있다.
- 변수를 선언해서 사용 가능
- 선언하려는 변수 명에 prefix로 REACT_APP_ 을 붙여줘야하며 그러지 않을 시 모두 무시된다.
- REACT_APP_ 이외에도 NODE_ENV라는 기본적으로 제공되는 환경 변수도 있다.
- NODE_ENV는 현재 서버 환경을 나타낸다.
- NODE_ENV로 서버 환경별 조건부 실행이 가능하다.
- .env 파일을 수정하면 서버를 재실행 시켜야 변경사항이 반영된다.
- .env에서 선언한 변수는 process.env에서 불러온다.
- .gitignore에 .env파일들을 추가해 외부에 노출시키지 않도록한다.
1–1. 사용법
- 기본
//.env
REACT_APP_CLIENT_URL='...'
// file.js
process.env.REACT_APP_CLIENT_URL
- NODE_ENV의 경우
process.env.NODE_ENV // 환경별로 'development', 'production', 'test'
- HTML의 경우
// file.html
<p>%REACT_APP_CLIENT_URL%</p>
1–2. 각 .env 파일 로드 시점
.env: 기본 파일
.env.local : 로컬 설정 오버라이딩. test를 제외한 모든 환경에서 불러와짐
.env.development : 개발 환경에서 불러와짐
.env.test : test 환경에서 불러와짐
.env.production : 빌드된 배포 환경에서 불러와짐
.env.production.local, .env.test.local, .env.production.local : 환경별 로컬 설정 오버라이딩
1–3. 환경별 .env 파일 로드 우선순위
- 왼쪽이 오른쪽보다 우선순위가 높다.
npm start: .env.development.local > .env.local > .env.development > .env
npm run build: .env.production.local > .env.local > .env.production > .env
npm test: .env.test.local > .env.test > .env
1–4. 환경 변수 확장
- dot-env-expand를 사용하면 확장 가능
DOMAIN=www.example.com
REACT_APP_FOO=$DOMAIN/foo
REACT_APP_BAR=$DOMAIN/bar
2. Next.js에서의 .env
- 환경 변수를 기본적으로 사용할 수 있도록 세팅되어 있다.
- .env.local로 환경 변수 로드
- 기본적으로 Node.js 환경에서만 사용 가능하며, 브라우저에 노출이 되지 않지만 GA 추적코드와 같은 외부에 노출되어야 하는 변수의 경우 prefix로 NEXT_PUBLIC_을 붙인다.
2–1. 사용법
- 기본
//.env.local
DB_HOST = "sample-host";
// file.js
process.env.DB_HOST;
- 외부 노출의 경우
// 노출하고 싶으면
NEXT_PUBLIC_GA_ID = "gagaga";
// file.js
process.env.NEXT_PUBLIC_GA_ID;
- process.env는 js 객체가 아니므로 구조 분해 할당 사용 불가
// 불가
const { DB_HOST } = process.env;
- $SOME_VALUE를 통해 확장 가능
// .env
HOSTNAME=localhost
PORT=8080
HOST=http://$HOSTNAME:$PORT
- $의 실제 값을 사용하고 싶으면 \ 이용
NAME='jack'
A=MY_NAME_IS$NAME // result = MY_NAME_ISjack
B=MY_NAME_IS\$NAME // result = MY_NAME_ISNAME
2–2. 환경 변수 로드 순서
- 맞는 환경 변수를 찾으면 중단
- process.env
- .env.production.local, .env.development.local, .env.test.local
- .env.local (test 환경에서는 생략)
- .env.production, .env.development, .env.test
- .env
참조
피드백은 언제나 환영입니다.