React Native & Expo Development Guide
A practical guide for building production-ready React Native and Expo applications. Covers UI, animations, state, testing, performance, and deployment.
References
Consult these resources as needed:
- references/navigation.md — Expo Router: Stack, Tabs, NativeTabs (,
headerBackButtonDisplayMode
), links, modals, sheets, context menus
- references/components.md — FlashList patterns, , safe areas (
contentInsetAdjustmentBehavior
), native controls, blur/glass effects, storage
- references/styling.md — StyleSheet, NativeWind/Tailwind, platform styles, theming, dark mode
- references/animations.md — Reanimated 3: entering/exiting, shared values, gestures, scroll-driven
- references/state-management.md — Zustand (selectors, persist), Jotai (atoms, derived), React Query, Context
- references/forms.md — React Hook Form + Zod: validation, multi-step, dynamic arrays
- references/networking.md — fetch wrapper, React Query (optimistic updates), auth tokens, offline, API routes, webhooks
- references/performance.md — Profiling workflow, FlashList + , bundle analysis, TTI, memory leaks, animation perf
- references/testing.md — Jest, React Native Testing Library, E2E with Maestro
- references/native-capabilities.md — Camera, location, permissions ( hooks), haptics, notifications, biometrics
- references/engineering.md — Project layout (, , ), path aliases, SDK upgrades, EAS build/submit, CI/CD, DOM components
Quick Reference
Component Preferences
| Purpose | Use | Instead of |
|---|
| Lists | () + items | (no view recycling) |
| Images | | RN (no cache, no WebP) |
| Press | | (legacy) |
| Audio | | (deprecated) |
| Video | | (deprecated) |
| Animations | Reanimated 3 | RN Animated API (limited) |
| Gestures | Gesture Handler | PanResponder (legacy) |
| Platform check | | |
| Context | | (React 18) |
| Safe area scroll | contentInsetAdjustmentBehavior="automatic"
| |
| SF Symbols | with | |
Scaling Up
| Situation | Consider |
|---|
| Long lists with scroll jank | Virtualized list libraries (e.g. FlashList) |
| Want Tailwind-style classes | NativeWind v4 |
| High-frequency storage reads | Sync-based storage (e.g. MMKV) |
| New project with Expo | Expo Router over bare React Navigation |
State Management
| State Type | Solution |
|---|
| Local UI state | / |
| Shared app state | Zustand or Jotai |
| Server / async data | React Query |
| Form state | React Hook Form + Zod |
Performance Priorities
| Priority | Issue | Fix |
|---|
| CRITICAL | Long list jank | + memoized items |
| CRITICAL | Large bundle | Avoid barrel imports, enable R8 |
| HIGH | Too many re-renders | Zustand selectors, React Compiler |
| HIGH | Slow startup | Disable bundle compression, native nav |
| MEDIUM | Animation drops | Only animate / |
New Project Init
bash
# 1. Create project
npx create-expo-app@latest my-app --template blank-typescript
cd my-app
# 2. Install Expo Router + core deps
npx expo install expo-router react-native-safe-area-context react-native-screens
# 3. (Optional) Common extras
npx expo install expo-image react-native-reanimated react-native-gesture-handler
Then configure:
- Set entry point in :
"main": "expo-router/entry"
- Add scheme in :
- Delete and
- Create as root Stack layout
- Create for tab navigation
- Create route files in (see navigation.md)
For web support, also install:
npx expo install react-native-web react-dom @expo/metro-runtime
Core Principles
Consult references before writing: when implementing navigation, lists, networking, or project setup, read the matching reference file above for patterns and pitfalls.
Try Expo Go first (
). Custom builds (
) only needed when using local Expo modules, Apple targets, or third-party native modules not in Expo Go.
Conditional rendering: use
not
(renders "0").
Animation rule: only animate
and
— GPU-composited, no layout thrash.
Imports: always import directly from source, not barrel files — avoids bundle bloat.
Lists and images: before using
or RN
, check the Component Preferences table above —
and
are almost always the right choice.
Route files: always use kebab-case, never co-locate components/types/utils in
.
Checklist
New Project Setup
Before Shipping
Flutter development → see
skill.
iOS native (UIKit/SwiftUI) → see
skill.
Android native (Kotlin/Compose) → see
skill.
React Native is a trademark of Meta Platforms, Inc. Expo is a trademark of 650 Industries, Inc. All other product names are trademarks of their respective owners.