앱 크기는 다운로드 전환율에 직접 영향을 미칩니다. 100MB를 넘으면 Wi-Fi가 아닌 환경에서 다운로드가 차단됩니다.


번들 크기 분석

BASH
# 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 활성화 (필수)

PLAINTEXT
바이트코드 프리컴파일로 번들 크기 감소:
JSC 번들: ~15MB → Hermes 바이트코드: ~8MB (약 50% 감소)

2. ProGuard / R8 활성화 (Android)

GRADLE
// android/app/build.gradle
def enableProguardInReleaseBuilds = true

android {
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            shrinkResources true
        }
    }
}

3. 불필요한 의존성 제거

BASH
# 사용하지 않는 패키지 찾기
npx depcheck

# 번들에 큰 영향을 미치는 패키지 확인
# moment.js → day.js로 교체 (70KB → 2KB)
# lodash → lodash-es 또는 개별 함수 import
TSX
// 나쁜 예: lodash 전체 import → ~70KB
import _ from 'lodash';
_.debounce(fn, 300);

// 좋은 예: 개별 함수만 import → ~1KB
import debounce from 'lodash/debounce';
debounce(fn, 300);

4. 이미지 에셋 최적화

BASH
# PNG → WebP 변환 (60-80% 크기 감소)
# 큰 이미지는 CDN에서 로드 (번들에 포함하지 않음)

# 앱 아이콘과 스플래시만 번들에 포함
# 나머지 이미지는 네트워크에서 로드 + 캐싱

5. 네이티브 라이브러리 크기 확인

PLAINTEXT
주요 라이브러리별 크기 기여:
react-native-maps     : ~5MB
react-native-firebase  : ~3-10MB (모듈별)
lottie-react-native    : ~3MB
react-native-svg       : ~1MB

6. AAB(Android App Bundle) 사용

PLAINTEXT
APK: 모든 아키텍처, 해상도 포함 → 큰 크기
AAB: 디바이스에 맞는 것만 다운로드 → 작은 크기

APK: 30MB → AAB: 15MB (약 50% 감소)

Inline Requires (지연 로딩)

TSX
// 기존: 모든 모듈을 앱 시작 시 로드
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 형식 으로 배포하면 사용자가 받는 크기가 줄어듭니다
댓글 로딩 중...