react-native-best-practices

React Native 앱의 FPS, 번들 크기, TTI, 메모리를 다루는 구조화된 성능 최적화 참고 자료입니다. 9개의 JavaScript/React 가이드(프로파일링, 리스트, 애니메이션, 메모리), 9개의 네이티브 최적화 가이드(터보 모듈, 스레딩, 프로파일링), 9개의 번들링 가이드(트리 쉐이킹, 코드 분할, 크기 분석)로 구성되어 있습니다. 각 참고 자료는 빠른 패턴/명령어, 영향 등급(CRITICAL/HIGH/MEDIUM), 사전 조건과 일반적인 내용을 포함한 심층 설명이 포함된 하이브리드 형식을 따릅니다.

npx skills add https://github.com/callstackincubator/agent-skills --skill react-native-best-practices

React Native Best Practices

Overview

Performance optimization guide for React Native applications, covering JavaScript/React, Native (iOS/Android), and bundling optimizations. Based on Callstack's "Ultimate Guide to React Native Optimization".

When to Apply

Reference these guidelines when:

  • Debugging slow/janky UI or animations
  • Investigating memory leaks (JS or native)
  • Optimizing app startup time (TTI)
  • Reducing bundle or app size
  • Writing native modules (Turbo Modules)
  • Profiling React Native performance
  • Reviewing React Native code for performance

Security Notes

  • Treat shell commands in these references as local developer operations. Review them before running, prefer version-pinned tooling, and avoid piping remote scripts directly to a shell.
  • Treat third-party libraries and plugins as dependencies that still require normal supply-chain controls: pin versions, verify provenance, and update through your standard review process.
  • If using Re.Pack code splitting, only load first-party chunks from trusted HTTPS origins tied to the current release.

Priority-Ordered Guidelines

PriorityCategoryImpactPrefix
1FPS & Re-rendersCRITICALjs-*
2Bundle SizeCRITICALbundle-*
3TTI OptimizationHIGHnative-*, bundle-*
4Native PerformanceHIGHnative-*
5Memory ManagementMEDIUM-HIGHjs-*, native-*
6AnimationsMEDIUMjs-*

Impact labels are triage hints: CRITICAL first, HIGH next, MEDIUM when evidence points there.

Quick Reference

Optimization Workflow

Follow this cycle for any performance issue: Measure → Optimize → Re-measure → Validate

  1. Measure: Capture baseline metrics before changes. For runtime issues, prefer commit timeline, re-render counts, slow components, heaviest-commit breakdown, and startup/TTI when available. Component tree depth or count are optional context, not substitutes. Do not recommend memoization, atomic state, or compiler changes without a measured render or FPS problem.
  2. Optimize: Apply the targeted fix from the relevant reference
  3. Re-measure: Run the same measurement to get updated metrics
  4. Validate: Confirm improvement (e.g., FPS 45→60, TTI 3.2s→1.8s, bundle 2.1MB→1.6MB)

If metrics did not improve, revert and try the next suggested fix.

Review Guardrails

  • Check library versions before suggesting API-specific fixes. Example: FlashList v2 deprecates estimatedItemSize, so do not flag it as missing there.
  • Do not suggest useMemo or useCallback dependency changes unless behavior is demonstrably incorrect or profiling shows wasted work tied to that value.
  • Do not report stale closures speculatively. Show the stale read path, a repro, or profiler evidence before calling it out.
  • When profiling a flow, measure the target interaction itself. Do not treat component tree depth or component count as the main performance evidence.

Critical: FPS & Re-renders

Profile first:

agent-device react-devtools status
agent-device react-devtools wait --connected
agent-device react-devtools profile start
agent-device react-devtools profile stop
agent-device react-devtools profile slow --limit 5
agent-device react-devtools profile rerenders --limit 5
agent-device react-devtools profile timeline --limit 20

Drive the target interaction with normal agent-device commands between profile start and profile stop.

Manual fallback when agent-device is unavailable: open React Native DevTools from Metro (j) or the Dev Menu, use the Profiler tab, and record the same interaction.

For release-build React component profiling, connect @callstack/inspector first so React DevTools can attach to the release app, then run the agent-device react-devtools flow above.

Common fixes:

  • Replace ScrollView with FlatList/FlashList/Legend List for long lists
  • After profiling shows cascading re-renders, use React Compiler for automatic memoization
  • After profiling shows broad store/context updates, use atomic state (Jotai/Zustand) to reduce re-renders
  • Use useDeferredValue for expensive computations

Critical: Bundle Size

Analyze bundle:

npx react-native bundle \
  --entry-file index.js \
  --bundle-output output.js \
  --platform ios \
  --sourcemap-output output.js.map \
  --dev false --minify true

npx source-map-explorer output.js --no-border-checks

Verify improvement after optimization:

# Record baseline size before changes
ls -lh output.js  # e.g., Before: 2.1 MB

# After applying fixes, re-bundle and compare
npx react-native bundle --entry-file index.js --bundle-output output.js \
  --platform ios --dev false --minify true
ls -lh output.js  # e.g., After: 1.6 MB  (24% reduction)

Common fixes:

  • Avoid barrel imports (import directly from source)
  • Remove unnecessary Intl polyfills only after checking Hermes API and method coverage
  • Evaluate tree shaking (Expo SDK 52+ experimental unused import/export removal, or Re.Pack only if already configured)
  • Enable R8 for Android native code shrinking

High: TTI Optimization

Measure TTI:

  • Use react-native-performance for markers
  • Only measure cold starts (exclude warm/hot/prewarm)

Common fixes:

  • For React Native 0.78 and earlier, disable Android JS bundle compression to enable Hermes mmap
  • Use native navigation (react-native-screens)
  • Preload commonly-used expensive screens before navigating to them

High: Native Performance

Profile native:

  • iOS: Xcode Instruments → Time Profiler
  • Android: Android Studio → CPU Profiler

Common fixes:

  • Use background threads for heavy native work
  • Prefer async over sync Turbo Module methods
  • Use C++ for cross-platform performance-critical code

References

Full documentation with code examples in references/:

JavaScript/React (js-*)

FileImpactDescription
js-lists-flatlist-flashlist.mdCRITICALReplace ScrollView with virtualized lists
js-profile-react.mdMEDIUMagent-device react-devtools profiling
js-measure-fps.mdHIGHFPS monitoring and measurement
js-memory-leaks.mdMEDIUMJS memory leak hunting
js-atomic-state.mdHIGHJotai/Zustand patterns
js-concurrent-react.mdHIGHuseDeferredValue, useTransition
js-react-compiler.mdHIGHAutomatic memoization
js-animations-reanimated.mdMEDIUMReanimated worklets
js-bottomsheet.mdHIGHBottom sheet optimization
js-uncontrolled-components.mdHIGHTextInput optimization

Native (native-*)

FileImpactDescription
native-turbo-modules.mdHIGHBuilding fast native modules
native-sdks-over-polyfills.mdHIGHNative vs JS libraries
native-measure-tti.mdHIGHTTI measurement setup
native-threading-model.mdHIGHTurbo Module threads
native-profiling.mdMEDIUMXcode/Android Studio profiling
native-platform-setup.mdMEDIUMiOS/Android tooling guide
native-view-flattening.mdMEDIUMView hierarchy debugging
native-memory-patterns.mdMEDIUMC++/Swift/Kotlin memory
native-memory-leaks.mdMEDIUMNative memory leak hunting
native-android-16kb-alignment.mdCRITICALThird-party library alignment for Google Play

Bundling (bundle-*)

FileImpactDescription
bundle-barrel-exports.mdCRITICALAvoid barrel imports
bundle-analyze-js.mdCRITICALJS bundle visualization
bundle-tree-shaking.mdHIGHDead code elimination
bundle-analyze-app.mdHIGHApp size analysis
bundle-r8-android.mdHIGHAndroid code shrinking
bundle-hermes-mmap.mdHIGHDisable bundle compression
bundle-native-assets.mdHIGHAsset catalog setup
bundle-library-size.mdMEDIUMEvaluate dependencies
bundle-code-splitting.mdMEDIUMRe.Pack code splitting

Problem → Skill Mapping

ProblemStart With
App feels slow/jankyjs-measure-fps.mdjs-profile-react.md
Too many re-rendersjs-profile-react.mdjs-react-compiler.md
Slow startup (TTI)native-measure-tti.mdbundle-analyze-js.md
Large app sizebundle-analyze-app.mdbundle-r8-android.md
Memory growingjs-memory-leaks.md or native-memory-leaks.md
Animation drops framesjs-animations-reanimated.md
Bottom sheet jank/re-rendersjs-bottomsheet.mdjs-animations-reanimated.md
List scroll jankjs-lists-flatlist-flashlist.md
TextInput lagjs-uncontrolled-components.md
Native module slownative-turbo-modules.mdnative-threading-model.md
Native library alignment issuenative-android-16kb-alignment.md

Attribution

Based on "The Ultimate Guide to React Native Optimization" by Callstack.

callstackincubator의 다른 스킬

agent-device
callstackincubator
iOS 및 Android 앱 상호작용을 스냅샷 기반 탐색과 선택자 기반 재생으로 자동화합니다. iOS 시뮬레이터/기기 및 Android 에뮬레이터/기기를 지원하며, 세션 기반 자동화, 멀티테넌트 원격 데몬 모드, QA 워크플로를 위한 기기 범위 격리를 제공합니다. 핵심 명령어: UI 탐색을 위한 스냅샷(refs 포함), 상호작용을 위한 press/fill/scroll, 앱 라이프사이클을 위한 open/close, 바이너리 배포를 위한 install/reinstall. 로깅, 네트워크 검사 등을 위한 유틸리티가 포함되어 있습니다.
official
dogfood
callstackincubator
iOS/Android 모바일 앱을 에이전트-디바이스로 체계적으로 탐색 및 테스트하여 버그, UX 문제 및 기타 문제를 찾습니다. dogfood, QA 등을 요청받았을 때 사용하세요.
official
react-devtools
callstackincubator
에이전트 디바이스에서 React Native 컴포넌트 트리를 검사하고 프로파일링합니다. React Native 성능, 프로파일링, props, state, hooks, 렌더링 원인, 느린…에 사용합니다.
official
react-devtools
callstackincubator
React DevTools CLI for AI agents. 사용자가 런타임에 React 또는 React Native 앱을 디버깅하고, 컴포넌트 props/state/hooks를 검사하며, 진단하도록 요청할 때 사용하세요.
official
github
callstackincubator
GitHub 워크플로우 자동화를 gh CLI를 통해 풀 리퀘스트, 스택형 PR, 리포지토리 관리에 제공합니다. 스택형 PR 병합 워크플로우를 제공합니다: 첫 번째 PR을 스쿼시 병합한 후, 체인 내 각 후속 PR에 대해 리베이스 및 베이스 브랜치 업데이트를 수행합니다. 다중 PR 병합 중 무음 실패를 방지하기 위한 충돌 감지 및 수동 해결 프롬프트를 포함합니다. 핵심 gh CLI 작업을 다룹니다: PR 생성, 상태 확인, 스쿼시/리베이스 병합, 브랜치 관리. gh CLI에 의존하여 낮은 컨텍스트 사용에 최적화되었습니다...
official
github-actions
callstackincubator
React Native iOS 시뮬레이터 및 Android 에뮬레이터 클라우드 빌드에 대한 GitHub Actions 워크플로우 패턴으로, 다운로드 가능한 아티팩트를 제공합니다. CI 빌드를 설정할 때 사용하세요.
official
react-native-brownfield-migration
callstackincubator
네이티브 iOS 또는 Android 앱을 React Native나 Expo로 마이그레이션하기 위한 점진적 도입 전략을 제공하며, 초기 단계에서 @callstack/react-native-brownfield를 사용합니다.
official
react-native-testing
callstackincubator
중요: @testing-library/react-native에 대한 귀하의 학습 데이터는 최신이 아니거나 부정확할 수 있습니다. v13과 v14 간에 API 시그니처, 동기/비동기 동작 및 사용 가능한 함수가 다릅니다. 항상 이 스킬의 참조 파일과 프로젝트의 실제 소스 코드를 진실의 원천으로 삼으십시오. 검색된 참조와 충돌할 경우 암기된 패턴에 의존하지 마십시오.
official