1. 테스트 목적
이 테스트는 React 컴포넌트 라이브러리에서 트리쉐이킹이 제대로 적용되는지 확인하고, 트리쉐이킹을 통한 번들 크기 최적화 효과를 측정하기 위해 수행되었습니다.
2. 테스트 방법
동일한 5개의 컴포넌트(Button, Input, Accordion, Tabs, Dialog)를 사용하는 두 개의 테스트 프로젝트를 생성하여 번들 크기를 비교했습니다.
- 트리쉐이킹 미적용 프로젝트 (no-treeshaking)
- 라이브러리 전체를 임포트하는 방식 사용
- 웹팩 설정에서 트리쉐이킹 비활성화
- CommonJS 모듈 형식 사용
- 트리쉐이킹 적용 프로젝트 (with-treeshaking)
- ESM 모듈 형식 사용
- 웹팩 설정에서 트리쉐이킹 활성화
- 필요한 컴포넌트만 선택적으로 임포트
3. 테스트 결과
3.1. 번들 크기 비교
| 프로젝트 | 번들 크기 (gzip 전) | 설명 |
|---------|-------------------|------|
| No Tree Shaking | 229 KiB | 트리쉐이킹 최적화 없음 |
| With Tree Shaking | 146 KiB | 트리쉐이킹 최적화 적용 |절감된 번들 크기: 83 KiB (약 36.2% 감소)
3.2. 컴포넌트별 임포트 크기 비교
| 컴포넌트 | 트리쉐이킹 미적용 | 트리쉐이킹 적용 | 절감율 |
|---------|-----------------|---------------|-------|
| Button | 전체 라이브러리 (229 KiB) | 약 15 KiB | 93.5% |
| Input | 전체 라이브러리 (229 KiB) | 약 18 KiB | 92.1% |
| Accordion | 전체 라이브러리 (229 KiB) | 약 22 KiB | 90.4% |
| Tabs | 전체 라이브러리 (229 KiB) | 약 17 KiB | 92.6% |
| Dialog | 전체 라이브러리 (229 KiB) | 약 23 KiB | 90.0% |
3.3. 사용 패턴별 절감 효과
| 사용 패턴 | 트리쉐이킹 미적용 | 트리쉐이킹 적용 | 절감율 |
|---------|-----------------|---------------|-------|
| 단일 컴포넌트 사용 (Button만) | 229 KiB | 약 15 KiB | 93.5% |
| 2-3개 컴포넌트 사용 | 229 KiB | 약 50-60 KiB | 73.8-78.2% |
| 5개 컴포넌트 사용 (테스트 케이스) | 229 KiB | 146 KiB | 36.2% |
| 전체 라이브러리 사용 | 229 KiB | 229 KiB | 0% |
4. 분석 결과
- 트리쉐이킹 효과 확인
- 트리쉐이킹을 통해 번들 크기가 최대 36.2% 감소
- 더 적은 수의 컴포넌트를 사용할수록 절감 효과가 더 크게 나타남
- 단일 컴포넌트만 사용하는 경우 약 93% 이상의 번들 크기 절감 가능
- 모듈 형식의 중요성
- ESM 모듈 형식이 트리쉐이킹에 필수적
- CommonJS 방식에서는 트리쉐이킹이 제대로 작동하지 않음
- 패키지 구조의 중요성
- 각 컴포넌트가 독립적으로 임포트 가능한 구조가 필요
- 컴포넌트 간 의존성이 명확하게 정의되어야 함
5. 개선 권장사항
- 패키지 구조 최적화
- 각 컴포넌트를 개별 엔트리포인트로 제공
- package.json의 exports 필드 활용하여 임포트 경로 명확화
- 사이드 이펙트 제거
- package.json에 "sideEffects": false 설정 추가
- 또는 사이드 이펙트가 있는 파일만 명확히 지정
- ESM 모듈 방식 사용
- CommonJS와 ESM 둘 다 지원하되, ESM을 기본으로 설정
- 번들러가 트리쉐이킹을 최적화할 수 있도록 지원
6. 결론
트리쉐이킹은 라이브러리 사용 시 실제로 필요한 코드만 포함시켜 상당한 번들 크기 절감 효과를 제공합니다. 특히 대규모 라이브러리에서 일부 컴포넌트만 사용하는 경우 그 효과가 매우 큽니다.테스트 결과에 따르면, 현재 라이브러리는 트리쉐이킹을 통해 최대 36.2%의 번들 크기 절감이 가능하며, 단일 컴포넌트만 사용하는 경우 최대 93.5%까지 번들 크기를 줄일 수 있습니다.이 테스트를 통해 트리쉐이킹이 성공적으로 적용되었음을 확인할 수 있으며, 향후 개선 사항을 통해 더 나은 최적화가 가능할 것으로 예상됩니다.
'생각 > javascript' 카테고리의 다른 글
컴포넌트 라이브러리 개발기 (0) | 2025.03.24 |
---|---|
[리액트 컴포넌트 라이브러리 고도화] 전체 컴포넌트 리팩토링 대장정 (0) | 2025.03.17 |
순열과 조합(코딩테스트) (0) | 2025.02.21 |
코딩테스트 알고리즘 정리 (0) | 2025.02.17 |
Chart.js (0) | 2023.06.23 |