Babel 7.29.0 — 10년 역사의 마지막 마이너, 그리고 8 RC1

10 min read
BabelJavaScript빌드 도구마이그레이션Tooling
Babel 7.29.0 — 10년 역사의 마지막 마이너, 그리고 8 RC1

2026년 1월 31일, Babel 팀이 7.29.0을 배포했다. 변경 로그만 보면 작은 업데이트처럼 보이지만, 이 릴리스에는 "Babel 7의 마지막 마이너"라는 선언이 함께 붙었다. 동시에 Babel 8.0.0-rc.1이 공개됐다. 10년 넘게 웹 프론트엔드 빌드의 중추였던 Babel 7이 사실상 마침표를 찍은 순간이다.


Babel 7이 걸어온 길

2018년에 등장한 Babel 7은 ES6+ 문법을 ES5로 내려주는 트랜스파일러로 시작했지만, 역할이 점점 확장됐다. TypeScript, JSX, 데코레이터, Stage 2~3 제안까지 — 브라우저가 지원하기 전의 문법을 먼저 쓸 수 있게 해주는 "시간 여행 머신" 같은 존재가 됐다.

비유하면 Babel은 오래된 공항 면세점 같다. 처음에는 면세 담배와 술만 팔던 가게가 어느새 명품, 화장품, 전자기기까지 취급하게 된 것처럼, Babel도 트랜스파일링 하나에서 출발해 플러그인 생태계의 핵심 인프라로 성장했다.

그 Babel 7이 7.29.0을 끝으로 새 기능 추가를 멈춘다. 이후 7.x에는 보안 패치만 제공될 예정이다.

[💡 잠깐! 이 용어는?] 트랜스파일러(Transpiler): 한 언어(또는 버전)로 쓰인 코드를 다른 언어(또는 버전)로 변환하는 도구. Babel은 최신 JavaScript를 구형 브라우저가 이해할 수 있는 코드로 바꿔준다.


7.29.0 — 마지막 마이너의 변경사항

7.29.0 자체의 변경사항은 크지 않다. 핵심은 @babel/standalone 두 가지 개선이다.

data-targets 속성 지원

기존 @babel/standalone<script type="text/babel">로 브라우저에서 직접 트랜스파일할 때 기본적으로 ES5를 타깃으로 잡았다. 7.29.0부터는 data-targets 속성으로 트랜스파일 대상을 태그 수준에서 직접 지정할 수 있다.

index.html
<!-- 기존: preset-env 기본값(ES5)으로 변환 -->
<script type="text/babel">
  const fn = () => 'hello'
</script>
 
<!-- 7.29.0: 특정 브라우저 타깃을 직접 지정 -->
<script type="text/babel" data-targets="chrome >= 120, firefox >= 120">
  const fn = () => 'hello'
</script>

[💡 잠깐! 이 용어는?] @babel/standalone: 빌드 과정 없이 브라우저에서 바로 Babel을 실행할 수 있게 해주는 번들. CodePen 같은 온라인 에디터나 빠른 프로토타이핑 환경에서 많이 쓴다.

이 변경이 의미 있는 이유는 적용 범위 때문이다. 빌드 파이프라인이 없는 환경 — 교육용 코드 실습, 라이브 데모, 레거시 레거시 페이지의 인라인 스크립트 — 에서 타깃을 세밀하게 제어하는 방법이 생겼다.

@babel/core async API 지원

@babel/standalone@babel/core의 비동기 API가 추가됐다. transformAsync, parseAsync 같은 메서드를 브라우저 환경에서도 쓸 수 있게 됐다. 이전에는 standalone에서 동기 API만 노출했기 때문에, 비동기 플러그인이나 대용량 파일 처리 시나리오에서 한계가 있었다.


Babel 7 vs 8 — 무엇이 달라지나

Babel 8의 변화는 이미 이전 포스트에서 ESM-only 패키징을 중심으로 다룬 바 있다. 여기서는 7과 8을 "전환의 관점"에서 비교한다.

항목Babel 7 (7.29.0)Babel 8 (RC1)
모듈 시스템CJS + ESM 이중 배포ESM 전용
Node.js 최소 버전12+20+
preset-env 기본 타깃ES5Browserslist defaults
설정 파일 권장 형식babel.config.js (CJS)babel.config.mjs (ESM)
향후 지원보안 패치만새 기능 개발
마이그레이션 부담피처 플래그로 최소화

가장 체감이 큰 변화는 preset-env 기본 타깃 변경이다. Babel 7은 기본적으로 ES5를 목표로 삼았다. 즉, 특별히 설정하지 않으면 arrow functionfunction()으로, constvar로 내려갔다. Babel 8은 defaults 쿼리(Browserslist 기준의 최신 주류 브라우저)를 기본값으로 쓴다.

[💡 잠깐! 이 용어는?] Browserslist defaults: 전세계 사용량 기준으로 시장 점유율이 일정 이상인 브라우저들을 자동으로 선택하는 쿼리. 대략 "최신 2개 버전 + 1% 이상 점유율" 수준의 브라우저를 커버한다.

이 변경이 불안하게 느껴질 수 있지만, 실제 프로덕션 설정에서 타깃을 명시하지 않는 프로젝트는 드물다. 명시적 타깃이 있는 프로젝트라면 8로 올라가도 동작이 달라지지 않는다.


왜 마이그레이션이 부드러운가 — 피처 플래그 전략

Babel 7에서 8로 올라가는 게 생각보다 덜 무서운 이유가 있다. Babel 팀은 지난 수년간 Babel 8에서 바뀔 동작을 Babel 7 안에 옵션으로 미리 심어뒀다. 비유하면 다음 시즌 규칙을 이번 시즌에 '연습 모드'로 먼저 적용해볼 수 있게 해준 것이다.

babel.config.js — Babel 8 호환 옵션 미리 켜기
module.exports = {
  presets: [
    ['@babel/preset-env', {
      targets: 'defaults',
      bugfixes: true
    }],
    ['@babel/preset-typescript', {
      allowDeclareFields: true
    }]
  ]
}

targets: 'defaults'bugfixes: true는 각각 Babel 8에서 기본값이 될 설정이다. Babel 7에서 이 옵션들을 켜두면, 8로 올라갔을 때 추가로 바꿔야 할 게 없어진다.

[💡 잠깐! 이 용어는?] 피처 플래그(Feature Flag): 코드에 새 동작을 구현해두고, 설정으로 켜고 끌 수 있게 하는 기법. Babel은 7과 8의 변경사항을 하나의 코드베이스에서 관리하며 플래그로 분기해왔다.


@babel/standalone의 현재 위치

7.29.0에서 standalone이 두 번 업데이트를 받은 건 우연이 아니다. 네이티브 ESM이 보편화되고 Vite, SWC 같은 빠른 빌드 도구가 표준 자리를 차지하면서, Babel은 "빌드 없는 환경"에서의 역할을 강화하고 있다.

CodeSandbox, StackBlitz 같은 브라우저 기반 IDE, 교육 플랫폼, 라이브 데모 페이지 — 이런 곳에서 standalone의 수요는 오히려 늘고 있다. data-targets와 async API 지원은 그 방향의 연장선이다.


마무리

  • Babel 7.29.0은 Babel 7 시리즈의 마지막 마이너 릴리스다. 이후 7.x에는 보안 패치만 제공된다
  • 7.29.0에서 @babel/standalone이 두 가지 개선을 받았다. data-targets 속성 지원과 async API 추가
  • Babel 8 RC1에서 가장 큰 변화는 ESM-only 패키징과 preset-env 기본 타깃 변경이다. 자세한 내용은 Babel 8 Beta 포스트 참고
  • 마이그레이션 부담은 크지 않다. Babel 7에서 호환 옵션을 미리 켜두면 전환 비용이 줄어든다
  • 지금 해야 할 일은 7.29.0으로 업데이트하고, targets: 'defaults'bugfixes: true를 켜두는 것이다

Babel이 ES5 시대를 열어주던 도구에서 네이티브 ESM 시대의 플러그인 인프라로 변신하는 중이다. 7.29.0은 그 전환의 출발점을 공식적으로 표시한 버전이다.


참고:

관심 있을 만한 포스트

Babel 8 Beta — CJS를 버리고 ESM 전용으로 간다

2년간의 알파를 거쳐 베타에 진입한 Babel 8의 핵심 변경사항과 마이그레이션 전략을 정리한다.

BabelESM

jQuery 4.0 — 10년 만의 메이저 릴리스, 무엇이 바뀌었나

jQuery가 20주년을 맞아 10년 만에 메이저 버전을 출시했다. IE 지원 축소, ES 모듈 전환, Trusted Types 등 핵심 변경 사항을 정리한다.

jQueryJavaScript

Native JSON Modules — 번들러 없이 JSON을 import하는 시대

Import Attributes와 함께 표준이 된 native JSON module. 어떻게 동작하고, 기존 번들러 방식과 뭐가 다른지 정리했다.

JavaScriptESM

Error.isError() — realm을 넘나드는 안전한 에러 검사 API

instanceof Error가 iframe과 worker에서 실패하는 이유, 그리고 이를 근본적으로 해결하는 Error.isError()의 동작 원리를 정리한다.

JavaScriptError.isError

V8의 Sea of Nodes 탈출기 — 왜 우아한 이론이 실전에서 무너졌는가

V8 팀이 10년간 사용한 Sea of Nodes IR을 포기하고 Turboshaft로 전환한 7가지 이유와 그 교훈을 정리한다.

V8컴파일러

달리는 차의 엔진을 바꾸다 — Nx 모노레포에서 Bun 도입까지의 여정

Nx 18에서 21까지 버전 업그레이드와 Bun 패키지 매니저 도입을 동시에 진행한 컬리의 마이그레이션 전략과 실전 이슈를 정리한다.

NxBun

V8 Mutable Heap Numbers — 숫자 하나 바꿀 때마다 새 객체를 만들던 비효율을 잡다

V8 엔진이 스크립트 컨텍스트의 숫자 변수를 매번 새 HeapNumber로 할당하던 방식을 제자리 수정(mutable)으로 바꿔 최대 2.5배 성능 향상을 달성했다.

V8JavaScript

V8 Explicit Compile Hints — 주석 한 줄로 JavaScript 시작 속도를 630ms 줄이는 법

Chrome 136에 도입된 V8의 Explicit Compile Hints 기능으로 JavaScript 초기 로딩 성능을 개선하는 원리와 사용법을 분석한다.

V8성능 최적화