[React] Babel - 깊은 설정

2022. 4. 5. 17:09·React/실험실
반응형

0. 들어가면서

https://bum-developer.tistory.com/entry/React-Babel

 

[React] Babel

0. Babel? Babel은 입력과 출력이 모두 자바스크립트 코드인 컴파일러이다. 일반적인 컴파일러는 고수준의 언어를 저수준의 언어로 변환하는 것과 다른 점이 있다. 초기엔 ES6 코드만 ES5 코드로 변환

bum-developer.tistory.com

정리 이후 내용을 다루고 있다. 

 

해당 내용의 이해가 어려운 경우 먼저 읽기를 추천한다. 

 

1. 확장성과 유연성을 고려한 Babel 설정 방법

Babel 설정에 사용할 수 있는 다양한 속성 중에 extends, env, overrides 속성을 알아보자 

extends 속성을 이용하면 다른 설정 파일을 가져와 확장할 수 있고, env 또는 overrides 속성을 이용하면 

환경별 또는 파일별로 다른 설정을 적용할 수 있다. 

 

npm install @babel/core @babel/cli @babel/plugin-transform-arrow-functions @babel/plugin-transform-template-literals @babel/preset-react babel-preset-minify

준비를 위해 패키지를 먼저 설치한다. 

 

extends 속성으로 다른 설정 파일 가져오기 

common 폴더를 만들고 .babelrc 파일을 만든다. 

{
  "presets": ["@babel/preset-react"],
  "plugins": [                                      --- 1
    [
      "@babel/plugin-transform-template-literals",
      {
        "loose": true
      }
    ]
  ]
}

1 : 플러그인에 옵션을 설정할 때 배열로 만들어서 두 번째 자리에 옵션을 넣는다. 

     템플릿 리터럴 플러그인에 loose 옵션을 주면 문자열을 연결할 때 concat 메서드를 사용하는 대신 + 연산자를 사용

 

src 폴더를 만들고 example-extends 폴더 밑에 .babelrc 파일을 만든다.

{
  "extends": "../../common/.babelrc",           --- 1
  "plugins": [                                  --- 2
    "@babel/plugin-transform-arrow-functions",
    "@babel/plugin-transform-template-literals" --- 3
  ]
}

1 : extends 속성을 이용해서 다른 파일에 있는 설정을 가져온다. 

2 : 가져온 설정에 플러그인을 추가한다. 

3 : 템플릿 리터럴 플러그인은 가져온 설정에 이미 존재한다. 

    이때 플러그인 옵션은 현재 파일의 옵션으로 결정된다. 따라서 기존에 loose옵션은 사라진다. 

 

const element = <div>babel test</div>;
const text = `element type is ${element.type}`;
const add = (a, b) => a + b;

테스트용 코드를 작성하고 Babel을 실행하자. 

npx babel src/example-extends/code.js
const element = /*#__PURE__*/React.createElement("div", null, "babel test");  --- 1
const text = "element type is ".concat(element.type);                         --- 2

const add = function (a, b) {                                                 --- 3
  return a + b;
};

1 : 리액트 프리셋이 적용되었다. 

2 : 템플릿 리터럴 플러그인이 적용됐다. loose 옵션이 적용되지 않았기 때문에 concat 메서드가 보인다. 

3 : 화살표 함수 플러그인 적용되었다. 

 

env 속성으로 환경별로 설정하기 

env 속성을 사용해 환경별로 다른 설정값을 적용하자.  example-env 폴더 아래 .babelrc 파일을 만든다. 

{
  "presets": ["@babel/preset-react"],            --- 1
  "plugins": [
    "@babel/plugin-transform-template-literals",
    "@babel/plugin-transform-arrow-functions"
  ],
  "env": {                                       --- 2
    "production": {                              --- 3
      "presets": ["minify"]
    }
  }
}

1 : 기존과 같이 프리셋과 플러그인을 설정한다. 

2 : env 속성을 이용하면 환경별로 다른 설정을 줄 수 있다. 

3 : 프로덕션 환경에서는 압축 프리셋을 추가로 적용한다. 

 

Babel에서 현재 환경은 다음과 같이 결정된다. 

process.env.BABEL_ENV || process.env.NODE_ENV || "development"

 

프로덕션 환경에서 Babel을 실행해 보자.

  • MAC : NODE_ENV=production npx babel ./src/example-env
  • 윈도우 : set NODE_ENV=production && npx babel ./src/example-env
const element=/*#__PURE__*/React.createElement("div",null,"babel test"),text="element type is ".concat(element.type),add=function(c,a){return c+a};

압축 프리셋이 적용돼서 코드를 읽기 힘들어진다. 

const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is ".concat(element.type);

const add = function (a, b) {
  return a + b;
};

일반 개발 환경으로 실행하면 기본값 development가 사용된다. 

 

overrides 속성으로 파일별로 설정하기 

src 아래 example-overrides 폴더를 만들고 .babelrc 파일을 만든다. 

{
  "presets": ["@babel/preset-react"],                         --- 1
  "plugins": ["@babel/plugin-transform-template-literals"],
  "overrides": [                                              --- 2
    {
      "include": "./service1",                                --- 3
      "exclude": "./service1/code2.js",                       --- 5
      "plugins": ["@babel/plugin-transform-arrow-functions"]  --- 4
    }
  ]
}

1 : 리액트 프리셋과 템플릿 리터럴 플러그인을 설정한다. 

2 : overrides 속성을 이용하면 파일별로 다른 설정을 할 수 있다. 

3 : service1 폴더에는 4번 속성을 적용한다. 

5 : code2.js 파일에는 4번 속성을 적용하지 않는다. 

    즉, service1 폴더 하위에서 code2.js 파일을 제외한 모든 파일에 화살표 함수 플러그인을 적용한다. 

 

example-overrides 폴더 밑에 code.js 파일을 만들고 service1 폴더를 만든 다음 code1.js와 code2.js 파일을 만든다. 

// code.js
const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is ".concat(element.type);

const add = (a, b) => a + b;

//code1.js
const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is ".concat(element.type);

const add = function (a, b) {
  return a + b;
};

// code2.js
const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is ".concat(element.type);

const add = (a, b) => a + b;

code.js와 code2.js는 화살표 함수 플러그인이 적용되지 않았다. 하지만 code1.js는 화살표 함수 플러그인이 적용되었다. 

 

2. 전체 설정 파일과 지역 설정 파일

바벨 설정 파일은 크게 두 가지 종류로 나눌 수 있다. 

첫 번째는 모든 자바스크립트 파일에 적용되는 전체(project-wide) 설정 파일이다.

babel.config.js 파일이 전체 설정 파일이다. 

두 번째로 자바스크립트 파일의 경로에 따라 결정되는 지역(file-relative) 설정 파일이다.

.baberc, .babelrc.js 파일과 설정이 있는 package.json 파일이 지역 설정 파일이다.

 

바벨 7 이후 부터는 전체 설정 파일인 babel.config.js 형식으로 구성하는 것을 추천하고 있다. 

 

전체 설정 파일과 지역 설정 파일의 차이점을 한번 확인해보자면, 

const presets = ["@babel/preset-react"];
const plugins = [
  [
    "@babel/plugin-transform-template-literals",
    {
      loose: true,
    },
  ],
];

module.exports = { presets, plugins };

babel.config.js 파일을 만들었다. 리액트 프리셋과 loose 옵션을 갖는 템플릿 리터럴 플러그인을 설정했다. 

 

{
  "plugins": [
    "@babel/plugin-transform-arrow-functions",
    "@babel/plugin-transform-template-literals"
  ]
}

화살표 함수와 템플릿 리터럴 플러그인을 설정했다. 

 

service1 폴더 밑에 code.js 파일을 만들고 Babel을 실행해본다. 

npx babel src
const element = /*#__PURE__*/React.createElement("div", null, "babel test");  --- 1
const text = "element type is ".concat(element.type);                         --- 2

const add = function (a, b) {                                                 --- 3
  return a + b;
};

1 : 전체 설정 파일의 리액트 프리셋이 적용되었다. 

2 : 지역 설정 파일의 템플릿 리터럴 플러그인이 적용되었다. 

    하지만 전체 설정 파일의 loose 옵션이 적용되지 않은 것을 확인할 수 있다. 이는 지역 설정이 전체 설정을 덮기 때문

3 : 지역 설정 파일의 화살표 함수 플러그인이 적용되었다. 

 

src/service1/code.js 파일의 설정을 알아보자면 

  • package.json, .babelrc, .babelrc.js 파일을 만날 때까지 부모 폴더로 이동한다. 
    src/service1/.babelrc 파일을 만났고, 그 파일이 지역 설정 파일이다. 
  • 프로젝트 루트의 babel.config.js 파일이 전체 설정 파일이다. 
  • 전체 설정 파일과 지역 설정 파일을 병합한다. 

 

src 폴더 아래 service2 폴더를 만들고 .babelrc와 code.js를 service1 폴더에서 그대로 복사해온다. 

그리고 package.json 파일을 npm init으로 새롭게 만들어준다. 

 

정리하자면 

test-babel-config-file

- babel.config.js

- package.json

- src 

   - service1 

      - .babelrc

      - code.js

   - service2

      - .babelrc

      - folder1

         - code.js

         - package.json

 

위와 같이 설정되어 있다.

 

npx babel src
// service1
const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is ".concat(element.type);

const add = function (a, b) {
  return a + b;
};

// service2
const element = /*#__PURE__*/React.createElement("div", null, "babel test");
const text = "element type is " + element.type;

const add = (a, b) => a + b;

src/service2/folder1/code.js 파일의 설정을 알아보자면 

 

  • package.json 파일을 만났고 package.json 파일에 babel 속성이 없으므로 지역 설정 파일은 없다. 
  • 프로젝트 루트의 babel.config.js 파일이 전체 설정 파일이다. 

깃허브

https://github.com/SeoJaeWan/test-babel-config

 

GitHub - SeoJaeWan/test-babel-config

Contribute to SeoJaeWan/test-babel-config development by creating an account on GitHub.

github.com

https://github.com/SeoJaeWan/test-babel-config-file

 

GitHub - SeoJaeWan/test-babel-config-file

Contribute to SeoJaeWan/test-babel-config-file development by creating an account on GitHub.

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] Webpack  (1) 2022.04.12
[React] Babel과 Polyfill  (0) 2022.04.06
[React] Babel  (2) 2022.04.04
[React] Webpack 환경에서 환경변수 사용  (1) 2022.03.29
[React] Code Splitting  (1) 2022.03.24
'React/실험실' 카테고리의 다른 글
  • [React] Webpack
  • [React] Babel과 Polyfill
  • [React] Babel
  • [React] Webpack 환경에서 환경변수 사용
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    ChatGPT
    프로그래머스
    리얼학습일기
    redux
    Babel
    typescript
    바질 키우기
    타일러영어
    react
    next.js
    CCNA
    자바스크립트
    리액트
    webpack
    리얼클래스
    Docker
    식물
    타입스크립트
    Node.js
    영어독학
    CSS
    덤프
    영어회화
    네트워크
    네이버 부스트캠프
    javascript
    ReactNative
    알고리즘
    다이소
    바질
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] Babel - 깊은 설정
상단으로

티스토리툴바