Webpack에서 babel-preset-env로 전환하며 번들 사이즈 줄이기

문제 상황

기존 프로젝트에서 babel-preset-es2015를 사용하고 있었는데, 모든 ES6 기능을 ES5로 변환하다 보니 번들 사이즈가 불필요하게 컸다. Chrome 최신 버전은 대부분의 ES6 기능을 지원하는데, 이를 다시 ES5로 변환하는 건 낭비였다.

babel-preset-env 도입

최근 출시된 babel-preset-env는 타겟 브라우저 환경에 따라 필요한 변환만 수행한다.

// .babelrc
{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "ie >= 11"]
      },
      "modules": false,
      "useBuiltIns": true
    }]
  ]
}

modules: false 옵션은 Webpack의 tree shaking을 위해 ES6 모듈 구문을 유지한다. useBuiltIns는 필요한 polyfill만 포함시킨다.

결과

  • 번들 사이즈: 324KB → 276KB (약 15% 감소)
  • 빌드 시간: 큰 차이 없음
  • IE11 포함 주요 브라우저에서 정상 동작 확인

추가 작업

babel-polyfill을 전역으로 import하던 방식에서, 필요한 polyfill만 자동으로 포함되도록 변경했다. Array.prototype.includes 같은 메서드는 타겟 브라우저에 따라 선택적으로 polyfill이 추가된다.

브라우저 지원 범위를 명시적으로 관리할 수 있게 되어 향후 레거시 브라우저 지원 중단 시에도 설정 변경만으로 대응 가능해졌다.