트리 쉐이킹

번들에 포함되지만 실제로는 쓰이지 않는 코드를 정적 분석으로 찾아내 제거함으로써 최종 번들 크기를 줄이는 최적화 기법입니다.

동작 원리

나무를 흔들어 죽은 잎을 떨어뜨리는 데서 온 이름입니다. 번들러는 모듈 간의 import/export 관계를 그래프로 만든 뒤, 진입점에서 도달할 수 없는 export를 데드 코드로 판단해 제거합니다.

// utils.js
export function used() { return 'used'; }
export function unused() { return 'unused'; }

// main.js
import { used } from './utils';
console.log(used());

// → 번들 결과에서 unused()는 제거된다

전제 조건

1. ES 모듈을 써야 합니다

ES Module은 import/export가 최상위에만 올 수 있는 정적 구조라, 코드를 실행하지 않고도 무엇이 쓰이는지 판단할 수 있습니다. 반면 CommonJs는 조건에 따라 동적으로 require()할 수 있어 정확한 분석이 어렵습니다.

// CommonJS — 실행해봐야 알 수 있어 트리 쉐이킹이 어렵다
const mod = require(condition ? './a' : './b');

2. 사이드 이펙트가 없어야 합니다

모듈이 로드되는 것만으로 전역 상태를 바꾼다면, 번들러는 그 코드를 지워도 안전한지 확신할 수 없어 그대로 남깁니다.

// package.json — 이 패키지엔 사이드 이펙트가 없다고 선언
{
  "sideEffects": false
}

CSS import처럼 실제로 사이드 이펙트가 있는 파일은 배열로 예외를 지정합니다.

{
  "sideEffects": ["*.css"]
}

적용 방법

webpack, Rollup, esbuild 등 대부분의 번들러가 지원하며 설정은 조금씩 다릅니다. 최신 webpack은 mode: 'production'만 설정해도 기본 트리 쉐이킹이 켜지고, TerserPlugin 같은 플러그인을 더하면 더 강하게 최적화할 수 있습니다.

효과 측정

주의사항

핵심 정리

→ 트리 쉐이킹에 대해 설명해주세요

CSLOG에서 보기