번들 최적화 — 앱 크기를 줄이는 전략
앱 크기는 다운로드 전환율에 직접 영향을 미칩니다. 100MB를 넘으면 Wi-Fi가 아닌 환경에서 다운로드가 차단됩니다.
번들 크기 분석
# Metro 번들 시각화
npx react-native-bundle-visualizer
# 번들 크기 확인
npx react-native bundle --platform ios --dev false --entry-file index.js --bundle-output /tmp/ios.bundle
ls -lh /tmp/ios.bundle
크기 최적화 전략
1. Hermes 활성화 (필수)
바이트코드 프리컴파일로 번들 크기 감소:
JSC 번들: ~15MB → Hermes 바이트코드: ~8MB (약 50% 감소)
2. ProGuard / R8 활성화 (Android)
// android/app/build.gradle
def enableProguardInReleaseBuilds = true
android {
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
shrinkResources true
}
}
}
3. 불필요한 의존성 제거
# 사용하지 않는 패키지 찾기
npx depcheck
# 번들에 큰 영향을 미치는 패키지 확인
# moment.js → day.js로 교체 (70KB → 2KB)
# lodash → lodash-es 또는 개별 함수 import
// 나쁜 예: lodash 전체 import → ~70KB
import _ from 'lodash';
_.debounce(fn, 300);
// 좋은 예: 개별 함수만 import → ~1KB
import debounce from 'lodash/debounce';
debounce(fn, 300);
4. 이미지 에셋 최적화
# PNG → WebP 변환 (60-80% 크기 감소)
# 큰 이미지는 CDN에서 로드 (번들에 포함하지 않음)
# 앱 아이콘과 스플래시만 번들에 포함
# 나머지 이미지는 네트워크에서 로드 + 캐싱
5. 네이티브 라이브러리 크기 확인
주요 라이브러리별 크기 기여:
react-native-maps : ~5MB
react-native-firebase : ~3-10MB (모듈별)
lottie-react-native : ~3MB
react-native-svg : ~1MB
6. AAB(Android App Bundle) 사용
APK: 모든 아키텍처, 해상도 포함 → 큰 크기
AAB: 디바이스에 맞는 것만 다운로드 → 작은 크기
APK: 30MB → AAB: 15MB (약 50% 감소)
Inline Requires (지연 로딩)
// 기존: 모든 모듈을 앱 시작 시 로드
import HeavyModule from './HeavyModule';
// Inline Require: 실제 사용 시점에 로드
const HeavyModule = require('./HeavyModule').default;
// metro.config.js에서 전역 설정
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: true, // 자동 인라인 require
},
}),
},
};
정리
- Hermes 활성화 만으로도 번들 크기가 약 50% 줄어듭니다
- ProGuard/R8 로 Android 네이티브 코드를 최소화하세요
- 큰 라이브러리는 경량 대안 으로 교체하세요 (moment→day.js, lodash→개별 import)
- 이미지는 WebP 포맷 과 CDN 로딩 을 활용하세요
- Android는 AAB 형식 으로 배포하면 사용자가 받는 크기가 줄어듭니다
댓글 로딩 중...