환경 변수에 대한 총결

4288 단어
프로젝트를 많이 하면 여러 종류의 프로세스를 접할 수 있다.env의 설정 방식은 때때로 흐리멍덩할 수 있으니, 여기에 총결산을 하겠습니다.

준비 작업


환경 변수는 우리가 코드에서 처리하고 싶지 않은 변수로 우리가 쓴 코드가 실행 중인 환경과 연결될 수 있다.우리는 업무 중에 종종 환경 변수를 사용하지만, 특히 그 역할 영역 문제에 있어서는 그렇게 적절하지 않을 때가 많다.
가장 흔히 볼 수 있는 환경 변수의 설정은 .bash_profile 파일에서 export가 나오는 것입니다
export AWS_SECRET_ACCESS_KEY=foo
export AWS_ACCESS_KEY_ID=bar

그리고 노드 프로그램(다른 프로그램에서 가져오는 방법이 있음)에서 직접 사용할 수 있습니다.
var secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
var accessKeyId = process.env.AWS_ACCESS_KEY_ID;

이런 방식의 가장 큰 단점은 두 프로그램이 있으면 서로 다른accessKeyId와secretAccessKey가 필요하다는 것이다. 그러면 우리는 변수의 이름을 수정해야 한다. 예를 들어 접두사proA 를 붙여야 한다.accessKeyId 등 세 개, 심지어 더 많으면 이런 처리 방식은 우리가 원하는 것이 아닐 것이다
가장 이상적인 것은 모든 프로그램이 자신의 환경 변수 설정을 가지고 있다는 것이다. 다음은node,npm,webpack에서 환경 변수를 어떻게 사용하는지 살펴보자.

1. node에서 환경 변수 사용


우리가 흔히 볼 수 있는 방식은 이런 방식이다
NODE_ENV=production node index.js

이런 방식의 가장 큰 문제는 변수가 많아서 쓰기에 좀 길고 유지하기에 불편하다는 것이다.그래서 노드 프로그램을 쓰면 프로젝트 루트 디렉터리를 통해dotenv가 필요할 수도 있습니다.환경 변수를 유지하기 위한 env 파일
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

그리고 이렇게 사용할 수 있어요.
require('dotenv').config()
var db = require('db')
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})
dotenv preload 기능도 지원됩니다.코드에 이 문장require('dotenv').config()을 남기고 싶지 않다는 것이다. 결벽증이 있는 사람에게는 참기 힘들기 때문에 노드의--require(-r) 옵션을 사용할 수 있다.
node -r dotenv/config your_script.js

물론 웹 패키지의 프로젝트에서도dotenv를 사용할 수 있지만 가끔webpack.DefinePlugin만 기본적으로 사용할 수 있다

2.npm에서 환경 변수 사용


npm가 환경 변수에 가장 많이 사용되는 것은 패키지입니다.json의scripts 모듈 중
  • package.json 파일의 변수
  • package.json vars The package.json fields are tacked onto the npm_package_ prefix. So, for instance, if you had {"name":"foo", "version":"1.2.5"} in your package.json file, then your package scripts would have the npm_package_name environment variable set to "foo", and the npm_package_version set to "1.2.5"
    위의 이 단락은 공식 문서에서 떼어낸 것이다. 바로 우리에게 패키지를 알려주는 것이다.json 파일의 키 값은 npm 로 설정됩니다package_예를 들어 패키지를 접두사로 하는 환경 변수.json 파일에 이런 단락{"name":"foo", "version":"1.2.5"}이 있으면 패키지 스크립트에서 $npm_package_name 변수를 사용할 수 있습니다. 그 값은 foo입니다. 물론 js 코드에서도 사용할 수 있습니다process.env.npm_package_name. , ,
    예외가 있습니다. config 모듈의 값은 npm_config_ 접두사로 설정된 환경 변수로 위와 일치합니다.
    물론 만약 우리가 js 코드에서 패키지의 정보를 사용하기만 한다면, 리퀘스트를 통해 얻는 것이 더욱 편리할 것이다
    const package = require('./package.json')
    console.log(package.version)
    
  • package.json 파일에서scripts 모듈의 환경 변수는 $xxx와 ${xxx} 두 가지 방식으로 사용할 수 있습니다
  • {
      scripts:{
        "argv": "echo $npm_package_version",    
        "argv": "echo ${npm_package_version}",  
      }
    }
    

    우리는 또한 환경 변수를 설정할 수 있다. 우리가 흔히 보는 것은 바로 이렇다
    // NODE_ENV           ,  process.env.NODE_ENV      
    {
      scripts:{
        "build": "NODE_ENV=production webpack --config config/webpack/production.config.js"
      }
    }
    

    물론 이것은 사실 모두 bash와 node의 지식 범주이다

    3. 웹팩에서 환경 변수 사용


    위의 node와 npm에서 설정한 환경 변수는 웹 패키지에서 모두 사용할 수 있지만 웹 패키지에서 우리는 DefinePlugin을 통해 정의하는 방식을 볼 수 있다
      new webpack.DefinePlugin({
        'process.env': {
          NODE_ENV: "production"
        },
        PRODUCTION: JSON.stringify(true),
        RELEASE: JSON.stringify(process.env.RELEASE)
      })
    

    이런 정의 방식은 본질적으로 약간 유사하다process.env.NODE_ENV = "production". 이런 js 코드가 직접 값을 부여하는 방식은 왜 유사한가. 왜냐하면 이것은 여전히 차이가 있기 때문이다. 차이점은build에서 나온 코드에서 process.env.NODE_ENV가 직접 production 문자열로 바뀌는 것을 볼 수 있기 때문이다( : , AST .환경 변수에 실제로 설정된 것이 아니기 때문에 우리는 환경 변수가 필요한 곳을 그것에 의존해서는 안 된다. 그렇지 않으면 효과가 없다

    4. 요약


    사실 여기는 모두 node에 속하는 환경 변수에 속해야 한다. npm와 웹 패키지는 모두 node로 뛰기 때문에 node의 환경 변수의 설정 방식은 세 가지 모두 유효하다. 단지 npm와 웹 패키지 중 일부는 자신이 봉한 설정 방식이고 그 설정은 자신에게만 유효할 뿐이다.

    좋은 웹페이지 즐겨찾기