babel 환경 설정
babel.config.cjs 파일 생성
client 폴더 최상단에 바벨 환경설정 파일 생성
babel.config.cjs 파일 내용 작성
/*
babel is used for frontend unit testing
*/
module.exports = {
presets: [
['@babel/preset-env', { 'targets': { 'node': 'current' } }], //compiling ES2015+ syntax
['@babel/preset-react', { runtime: 'automatic' }],
'@babel/preset-typescript',
],
/*
Babel's code transformations are enabled by applying plugins (or presets) to your configuration file.
*/
plugins: [
'@babel/plugin-transform-runtime',
'babel-plugin-transform-import-meta',
'babel-plugin-transform-vite-meta-env',
'babel-plugin-replace-ts-export-assignment',
[
'babel-plugin-root-import',
{
'rootPathPrefix': '~/',
'rootPathSuffix': './src',
},
],
],
};
Babel 설정 파일인 babel.config.cjs
파일은 JavaScript/TypeScript 코드를 다양한 환경(예: 최신 브라우저, Node.js)에서 호환되도록 변환하는 Babel의 동작 방식을 정의합니다. 주석에서 언급되었듯이, 이 설정은 주로 프론트엔드 유닛 테스트 환경을 위해 사용됩니다.
Babel 설정은 크게 두 가지 핵심 요소로 구성됩니다: presets
와 plugins
.
Babel 설정 파일의 구성 요소 설명
1. presets
(프리셋)
프리셋은 특정 환경에서 필요한 일련의 Babel 플러그인 모음을 미리 정의해둔 것입니다. 개별 플러그인을 하나하나 설정할 필요 없이, 관련된 기능들을 한 번에 적용할 수 있도록 편리하게 묶어 놓은 셋이라고 생각하시면 됩니다.
['@babel/preset-env', { 'targets': { 'node': 'current' } }]
- 용도: 이 프리셋은 ES2015+ (최신 JavaScript) 문법을 현재 Node.js 버전에서 호환되도록 컴파일하는 역할을 합니다.
targets: { 'node': 'current' }
: Babel에게 코드를 현재 실행 중인 Node.js 환경에 맞게 변환하라고 지시합니다. 이는 특히 유닛 테스트 환경에서 유용합니다. 테스트가 Node.js 환경에서 실행되기 때문에, 테스트 코드가 최신 JavaScript 문법을 사용하더라도 Node.js가 이를 이해할 수 있도록 변환해 줍니다.
['@babel/preset-react', { runtime: 'automatic' }]
- 용도: React JSX 문법을 일반 JavaScript로 변환합니다.
runtime: 'automatic'
: React 17부터 도입된 JSX 변환 방식입니다. 이전에는 JSX를 사용하기 위해 모든 파일 상단에import React from 'react';
를 명시적으로 추가해야 했지만,automatic
런타임을 사용하면 이 과정을 자동으로 처리해 줍니다.
@babel/preset-typescript
- 용도: TypeScript 코드를 일반 JavaScript로 변환합니다. Typescript의 타입 관련 구문들을 제거하고, JavaScript 런타임이 이해할 수 있는 코드로 만들어 줍니다.
2. plugins
(플러그인)
플러그인은 Babel이 특정 종류의 코드 변환을 수행하도록 하는 작은 단위의 기능입니다. 프리셋은 여러 플러그인을 묶은 것이고, 플러그인은 그보다 더 세분화된 변환 규칙을 적용합니다.
@babel/plugin-transform-runtime
- 용도: Babel이 코드를 변환할 때 사용하는 헬퍼(helper) 함수나 Polyfill을 중복 없이 효율적으로 관리하도록 돕습니다. 예를 들어, 여러 파일에서
async/await
를 사용한다면, 이 플러퍼그인은 각 파일마다regenerator-runtime
을 포함시키는 대신, 한 번만 임포트하여 사용하도록 최적화해 줍니다.
- 용도: Babel이 코드를 변환할 때 사용하는 헬퍼(helper) 함수나 Polyfill을 중복 없이 효율적으로 관리하도록 돕습니다. 예를 들어, 여러 파일에서
babel-plugin-transform-import-meta
- 용도: 최신 JavaScript의
import.meta
구문을 지원하지 않는 환경에서 이를 변환하여 호환성을 제공합니다.import.meta
는 모듈에 대한 메타데이터(예: 현재 모듈의 URL)를 제공합니다.
- 용도: 최신 JavaScript의
babel-plugin-transform-vite-meta-env
- 용도:
Vite
라는 모던 프론트엔드 빌드 도구에서 사용되는import.meta.env
구문을 변환하는 플러그인입니다. Vite는 이 구문을 통해 환경 변수에 접근하게 합니다. 이 플러그인은 Babel 환경에서도 Vite의 환경 변수 접근 방식을 사용할 수 있도록 돕습니다.
- 용도:
babel-plugin-replace-ts-export-assignment
- 용도: TypeScript에서 사용되는
export =
구문을 일반 JavaScript의module.exports =
또는export default
와 같은 형태로 변환하는 플러그인으로 보입니다. 이는 TypeScript 특정 구문을 다른 환경에서 호환되도록 만듭니다.
- 용도: TypeScript에서 사용되는
['babel-plugin-root-import', { 'rootPathPrefix': '~/', 'rootPathSuffix': './src' }]
- 용도: 모듈 임포트 경로를 간소화하는 플러그인입니다.
rootPathPrefix: '~/'
: 코드에서~/
로 시작하는 경로가 있다면, 이를rootPathSuffix
에 정의된 경로를 기준으로 해석하라는 의미입니다.rootPathSuffix: './src'
: 프로젝트의./src
폴더를 루트 경로로 설정합니다.- 예시: 만약
src/components/Button.tsx
파일이 있고, 다른 파일에서 이 파일을 임포트할 때import Button from '~/components/Button';
와 같이 사용할 수 있도록 해줍니다. 이는import Button from '../../components/Button';
처럼 긴 상대 경로를 쓰는 대신 편리하게 모듈을 가져올 수 있도록 합니다.
요약
이 Babel 설정은 다음을 목표로 합니다:
- 최신 JavaScript (ES2015+) 및 TypeScript 코드를 현재 Node.js 환경에서 실행 가능하도록 변환합니다. (특히 프론트엔드 유닛 테스트를 위해)
- React JSX 문법을 자동으로 처리합니다.
- 개발 및 빌드 도구(특히 Vite)에서 사용되는 특정 환경 변수 및 모듈 메타데이터 구문을 호환되게 변환합니다.
- TypeScript의 특정 내보내기 구문을 처리합니다.
- 모듈 임포트 경로를
~/
접두사를 사용하여./src
폴더를 기준으로 간소화하여 개발 편의성을 높입니다.
전반적으로 이 설정은 Node.js 기반의 테스트 환경에서 최신 프론트엔드 기술 스택 (React, TypeScript, Vite)으로 작성된 코드를 원활하게 실행하고 테스트할 수 있도록 Babel을 구성하는 것입니다.
댓글