or run

tessl search
Log in

react-native-best-practices

tessl install github:callstackincubator/agent-skills --skill react-native-best-practices

github.com/callstackincubator/agent-skills

Provides React Native performance optimization guidelines for FPS, TTI, bundle size, memory leaks, re-renders, and animations. Applies to tasks involving Hermes optimization, JS thread blocking, bridge overhead, FlashList, native modules, or debugging jank and frame drops.

Review Score

92%

Validation Score

13/16

Implementation Score

88%

Activation Score

100%

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".

Skill Format

Each reference file follows a hybrid format for fast lookup and deep understanding:

  • Quick Pattern: Incorrect/Correct code snippets for immediate pattern matching
  • Quick Command: Shell commands for process/measurement skills
  • Quick Config: Configuration snippets for setup-focused skills
  • Quick Reference: Summary tables for conceptual skills
  • Deep Dive: Full context with When to Use, Prerequisites, Step-by-Step, Common Pitfalls

Impact ratings: CRITICAL (fix immediately), HIGH (significant improvement), MEDIUM (worthwhile 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

Priority-Ordered Guidelines

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

Quick Reference

Critical: FPS & Re-renders

Profile first:

# Open React Native DevTools
# Press 'j' in Metro, or shake device → "Open DevTools"

Common fixes:

  • Replace ScrollView with FlatList/FlashList for lists
  • Use React Compiler for automatic memoization
  • 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

Common fixes:

  • Avoid barrel imports (import directly from source)
  • Remove unnecessary Intl polyfills (Hermes has native support)
  • Enable tree shaking (Expo SDK 52+ or Re.Pack)
  • 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:

  • Disable JS bundle compression on Android (enables Hermes mmap)
  • Use native navigation (react-native-screens)
  • Defer non-critical work with InteractionManager

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.mdMEDIUMReact 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-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

Searching References

# Find patterns by keyword
grep -l "reanimated" references/
grep -l "flatlist" references/
grep -l "memory" references/
grep -l "profil" references/
grep -l "tti" references/
grep -l "bundle" references/

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
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.