New Architecture Deep Dive
JSI, Fabric, TurboModules, and production optimization strategy.
Key takeaways
- Since SDK 55 New Architecture is the operating baseline; SDK 56 layers React Native 0.85, Hermes V1, a new animation backend, and Expo Modules performance work on top.
- Each layer has a distinct failure signal: Hermes V1 (cold launch regression), JSI (worklet errors), TurboModules (module not found), and Fabric (layout flicker).
- Wrap native APIs behind domain-oriented JS functions, convert native exceptions to typed error codes, and force every event subscription to define cleanup.
- Hold cold launch P95 within 10% of previous production and native crash-free sessions at 99.5% or higher as the performance budget.
- Debug in order: run
expo-doctor, use a development build with native logs, then confirm sourcemaps, dSYMs, and ProGuard mappings for Hermes crashes.
Production View of New Architecture
After SDK 55, Expo apps should treat New Architecture as the operating baseline. SDK 56 builds on it with React Native 0.85, Hermes V1, a newer animation backend, and Expo Modules performance work.
Core Layers
| Layer | Role | Failure signal |
|---|---|---|
| Hermes V1 | JS execution and bytecode loading | cold launch regression, JSI crashes |
| JSI | Direct JS/native object boundary | native module crash, worklet errors |
| TurboModules | Lazy native module loading | module not found, sync/async mismatch |
| Fabric | Concurrent-friendly renderer | layout flicker, measurement mismatch |
| Expo Modules API | Swift/Kotlin native capability DSL | autolinking, permission, lifecycle bugs |
SDK 56 Review Points
- Re-baseline startup metrics because Hermes V1 is the default.
- Check network instrumentation and polyfills after
expo/fetchbecomes the global fetch path. - Validate the new animation backend with Reanimated and worklets on a device matrix.
- Keep iOS prebuilt Expo Modules enabled unless a package truly requires source build.
- Use
expo-doctorand the SDK 55 to 56 router codemod to avoid mixed Expo Router and React Navigation imports.
Native Boundary Rules
- Wrap native APIs behind domain-oriented JS functions.
- Convert native exceptions into typed error codes.
- Keep sync functions rare and limited to startup-critical paths.
- Force every event subscription to define cleanup.
- Treat native module additions and permission changes as binary releases, not OTA-only changes.
Performance Budget
| Metric | Recommended budget |
|---|---|
| Cold launch P95 | No more than 10% worse than previous production |
| TTI P95 | Compare at the 10% rollout gate |
| JS bundle load | Review with OTA payload size after bytecode diffing |
| Native crash-free sessions | 99.5% or higher |
| Android ANR | Track lower-end devices separately |
Debugging Order
- Run
npx expo-doctor. - Use a development build with React Native DevTools and native logs together.
- For Hermes crashes, confirm sourcemaps, dSYMs, and ProGuard mapping uploads first.
- For native module crashes, compare the EAS Build artifact, commit, and runtimeVersion.
- If a crash appears only after OTA, check EAS Update group and binary runtime compatibility first.