Metro Bundler: React Native의 핵심 번들러
Metro Bundler는 React Native 앱의 JavaScript 코드를 번들링하고, 효율적으로 네이티브 환경과 연결하는 데 사용되는 도구입니다. Metro는 React Native의 기본 번들러로, 빠른 개발 및 디버깅을 지원하며 모바일 환경에 최적화되어 있습니다.
Metro Bundler의 주요 역할
- JavaScript 코드 번들링
- Metro는 React Native 프로젝트의 JavaScript 코드를 **하나의 파일(bundle)**로 압축하여 네이티브 환경(Android, iOS)에서 실행할 수 있도록 준비합니다.
- 코드 스플리팅 없이 단일 번들 파일로 구성하여 모바일 환경에서 로드 시간을 줄이는 데 집중합니다.
- Code Transformation (트랜스파일링)
- 최신 JavaScript (ES6+) 코드를 Babel을 통해 트랜스파일링하여 모든 환경에서 실행 가능한 코드로 변환합니다.
- JSX 및 TypeScript를 일반 JavaScript로 변환.
- Asset Handling
- 이미지, 폰트 등의 정적 자산을 네이티브 앱에서 접근 가능한 형식으로 처리합니다.
- 예: 이미지 파일을 require하거나 import하면 Metro가 이를 번들에 포함시킵니다.
- Hot Module Reloading (HMR)
- 코드 변경 시, 앱 전체를 재시작하지 않고 변경된 모듈만 즉시 업데이트하여 생산성을 높입니다.
- 이를 통해 앱 상태를 유지하면서 UI와 기능의 수정 사항을 확인 가능.
- Dependency Graph 관리
- 프로젝트 내 모든 모듈의 의존성을 추적하고 최적화된 방식으로 번들을 생성합니다.
- 의존성 그래프는 효율적인 캐싱 메커니즘을 사용해 빠르게 업데이트됩니다.
- Development Server
- Metro는 React Native 앱 실행 시 로컬 개발 서버로 동작하며, 모바일 에뮬레이터 또는 물리적 장치에 번들을 전송합니다.
Metro Bundler의 특징
1. 빠른 빌드 속도
- Metro는 React Native 앱을 위한 모바일 전용 번들러로 설계되어, 크고 복잡한 프로젝트에서도 빠른 빌드 속도를 제공합니다.
- 효율적인 캐싱 메커니즘 덕분에 변경된 파일만 다시 번들링.
2. Platform-Specific Bundles
- Metro는 iOS와 Android 플랫폼에 따라 플랫폼별 번들을 생성합니다.
- 예를 들어, index.ios.js와 index.android.js 파일을 기반으로 각각의 플랫폼에 최적화된 코드를 생성.
3. Custom Transformers
- Metro는 플러그인을 사용해 사용자 정의 트랜스포머를 설정할 수 있습니다.
- 예: TypeScript를 지원하기 위한 설정 추가.
4. Custom Resolver
- 특정 모듈의 경로를 사용자 정의 규칙으로 해석 가능.
- 예를 들어, ~를 프로젝트 루트로 매핑하거나 특정 파일 확장자를 우선적으로 로드.
5. Tree Shaking
- 사용되지 않는 코드를 제거하여 번들 크기를 최소화합니다.
- React Native는 초기에는 모든 코드를 포함하지만, production 모드에서는 필요한 코드만 포함.
Metro의 구성 요소
- Server
- 개발 중 앱과 연결하여 번들을 제공하고 디버깅 기능을 제공합니다.
- localhost:8081에서 실행.
- Graph
- 의존성 그래프를 구성하여 모듈 간의 연결 상태를 관리합니다.
- Transformer
- 코드를 트랜스파일링하고 최적화합니다. 예: Babel 트랜스폼.
- Bundler
- 최종적으로 번들을 생성합니다. 이는 모바일 장치에서 실행 가능한 단일 파일입니다.
- Watcher
- 파일 변경을 감지하고 번들을 업데이트하여 HMR을 가능하게 합니다.
Metro Bundler와 Webpack의 차이점
FeatureMetro BundlerWebpack
목적 | React Native 전용 번들러 | 웹 애플리케이션 번들러 |
코드 스플리팅 | 기본적으로 지원하지 않음 | 코드 스플리팅 지원 |
정적 자산 처리 | 이미지 및 자산의 네이티브 핸들링 | 파일 로더, URL 로더 사용 |
설정 난이도 | 설정이 간단 (거의 필요 없음) | 설정 파일 필요 |
핫 모듈 리로드 (HMR) | React Native에 최적화 | 웹에 최적화 |
'CS' 카테고리의 다른 글
React server component (0) | 2025.02.24 |
---|---|
[React Native] Pressable 컴포넌트 (1) | 2025.01.31 |
[React Native] Expo (3) | 2024.11.08 |
[React Native] Bridge ( 브릿지 ) (0) | 2024.11.05 |
[Basic] Session & Cookie (1) | 2024.10.07 |