React native best practices
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.From its SKILL.md
npx -y skills add ComeOnOliver/skillshub --skill react-native-best-practicesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.7 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
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
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | FPS & Re-renders | CRITICAL | js-* |
| 2 | Bundle Size | CRITICAL | bundle-* |
| 3 | TTI Optimization | HIGH | native-*, bundle-* |
| 4 | Native Performance | HIGH | native-* |
| 5 | Memory Management | MEDIUM-HIGH | js-*, native-* |
| 6 | Animations | MEDIUM | js-* |
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
useDeferredValuefor 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-performancefor 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-*)
| File | Impact | Description |
|---|---|---|
js-lists-flatlist-flashlist.md | CRITICAL | Replace ScrollView with virtualized lists |
js-profile-react.md | MEDIUM | React DevTools profiling |
js-measure-fps.md | HIGH | FPS monitoring and measurement |
js-memory-leaks.md | MEDIUM | JS memory leak hunting |
js-atomic-state.md | HIGH | Jotai/Zustand patterns |
js-concurrent-react.md | HIGH | useDeferredValue, useTransition |
js-react-compiler.md | HIGH | Automatic memoization |
js-animations-reanimated.md | MEDIUM | Reanimated worklets |
js-uncontrolled-components.md | HIGH | TextInput optimization |
Native (native-*)
| File | Impact | Description |
|---|---|---|
native-turbo-modules.md | HIGH | Building fast native modules |
native-sdks-over-polyfills.md | HIGH | Native vs JS libraries |
native-measure-tti.md | HIGH | TTI measurement setup |
native-threading-model.md | HIGH | Turbo Module threads |
native-profiling.md | MEDIUM | Xcode/Android Studio profiling |
native-platform-setup.md | MEDIUM | iOS/Android tooling guide |
native-view-flattening.md | MEDIUM | View hierarchy debugging |
native-memory-patterns.md | MEDIUM | C++/Swift/Kotlin memory |
native-memory-leaks.md | MEDIUM | Native memory leak hunting |
native-android-16kb-alignment.md | CRITICAL | Third-party library alignment for Google Play |
Bundling (bundle-*)
| File | Impact | Description |
|---|---|---|
bundle-barrel-exports.md | CRITICAL | Avoid barrel imports |
bundle-analyze-js.md | CRITICAL | JS bundle visualization |
bundle-tree-shaking.md | HIGH | Dead code elimination |
bundle-analyze-app.md | HIGH | App size analysis |
bundle-r8-android.md | HIGH | Android code shrinking |
bundle-hermes-mmap.md | HIGH | Disable bundle compression |
bundle-native-assets.md | HIGH | Asset catalog setup |
bundle-library-size.md | MEDIUM | Evaluate dependencies |
bundle-code-splitting.md | MEDIUM | Re.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
| Problem | Start With |
|---|---|
| App feels slow/janky | js-measure-fps.md → js-profile-react.md |
| Too many re-renders | js-profile-react.md → js-react-compiler.md |
| Slow startup (TTI) | native-measure-tti.md → bundle-analyze-js.md |
| Large app size | bundle-analyze-app.md → bundle-r8-android.md |
| Memory growing | js-memory-leaks.md or native-memory-leaks.md |
| Animation drops frames | js-animations-reanimated.md |
| List scroll jank | js-lists-flatlist-flashlist.md |
| TextInput lag | js-uncontrolled-components.md |
| Native module slow | native-turbo-modules.md → native-threading-model.md |
| Native library alignment issue | native-android-16kb-alignment.md |
Attribution
Based on "The Ultimate Guide to React Native Optimization" by Callstack.
What ships with it
6468.3 KB alongside SKILL.md
GitHub clipped this repository’s file list, so this is at least 41 files and may be more.
references/
- bundle-analyze-app.md5.2 KB
- bundle-analyze-js.md6.3 KB
- bundle-barrel-exports.md4.9 KB
- bundle-code-splitting.md4.9 KB
- bundle-hermes-mmap.md3.8 KB
- bundle-library-size.md4.2 KB
- bundle-native-assets.md4.3 KB
- bundle-r8-android.md4.5 KB
- bundle-tree-shaking.md5.4 KB
- images/bundle-treemap-source-map-explorer.png651.8 KB
- images/controlled-textinput-pingpong.png124.2 KB
- images/devtools-flamegraph.png508.5 KB
- images/emerge-xray-ios.png429.4 KB
- images/expo-atlas-treemap.png604.4 KB
- images/flashlight-flatlist-vs-flashlist.png305.9 KB
- images/fps-drop-graph.png148.9 KB
- images/memory-heap-snapshot.png300.8 KB
- images/tti-warm-start-diagram.png124.3 KB
- images/view-hierarchy-flattening.png2526.4 KB
- images/xcode-instruments-templates.png398.8 KB
- images/xcode-thread-view.png174.3 KB
- js-animations-reanimated.md8.4 KB
- js-atomic-state.md5.9 KB
- js-concurrent-react.md6.2 KB
- js-lists-flatlist-flashlist.md5.0 KB
- js-measure-fps.md4.7 KB
- js-memory-leaks.md5.1 KB
- js-profile-react.md4.7 KB
- js-react-compiler.md8.8 KB
- js-uncontrolled-components.md5.0 KB
- native-android-16kb-alignment.md3.4 KB
- native-measure-tti.md6.7 KB
- native-memory-leaks.md5.5 KB
- native-memory-patterns.md6.2 KB
- native-platform-setup.md5.1 KB
- native-profiling.md4.7 KB
- native-sdks-over-polyfills.md5.4 KB
- native-threading-model.md5.6 KB
- native-turbo-modules.md6.4 KB
- native-view-flattening.md5.0 KB
1 more file not listed here. See all 41 in the repository.
Gives 1 of the 12 instructions most performance cost skills give in ~1.6k tokens
Counted across 797 of the 1,117 authors here whose files we hold, read 2026-09-06
- Check for product marketing context firstin 46 of 797, across 20 files
- Measure before optimizingin 31 of 797, across 25 files
- Profile first to identify the actual bottleneckin 23 of 797, across 22 files
- Verify your robots.txt allows AI crawlersin 21 of 797, across 12 files
- Import directly and avoid barrel fileshere, and in 19 of 797, across 15 files
- Spawn all runs in the same turnin 18 of 797, across 11 files
- Write a draft of the skillin 17 of 797, across 10 files
- Understand the user's intentin 17 of 797, across 10 files
- Use React.cache for per-request deduplicationin 16 of 797, across 11 files
- Profile before optimizingin 16 of 797, across 14 files
- Include specific numbers with sourcesin 15 of 797, across 8 files
- Add lazy loading to below-fold imagesin 15 of 797, across 10 files
Said here and by no other author read
- Profile React Native performance first
- Replace ScrollView with FlatList or FlashList
- Enable tree shaking
- Enable R8 for Android native code shrinking
- Use native navigation
- Defer non-critical work with InteractionManager
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.