JS stack (@react-navigation/stack): toàn bộ animation và transition viết bằng JS qua Reanimated. Linh hoạt: custom transition, modal effect, gesture-driven dismiss. Nhược: animation chạy JS thread → có thể jank nếu thread busy lúc transition.
Native stack (@react-navigation/native-stack): wrap react-native-screens — dùng UINavigationController (iOS) và Fragment + FragmentTransaction (Android) bên dưới. Animation chạy trên native thread, hành vi y hệt navigation native (swipe-back iOS, header transition, large title iOS). Performance tốt hơn, đặc biệt trên Android low-end.
Trade-off:
- Native stack: customization animation hạn chế (chỉ vài preset), header style theo platform.
- JS stack: tự do thiết kế, nhưng phải tự test performance.
Khuyến nghị 2026: mặc định native stack. Chỉ dùng JS stack khi cần animation hoàn toàn custom (vd hero image transition cross-screen). Sự khác biệt rõ trên các app có nhiều screen — push/pop 30+ screen, native stack giữ FPS ổn định, JS stack bắt đầu drop frame.
JS stack (@react-navigation/stack): all animations and transitions are implemented in JS via Reanimated. Flexible: custom transitions, modal effects, gesture-driven dismiss. Downside: animations run on the JS thread — they jank when the thread is busy.
Native stack (@react-navigation/native-stack): wraps react-native-screens — uses UINavigationController (iOS) and Fragment + FragmentTransaction (Android) under the hood. Animations run on the native thread, matching native navigation exactly (iOS swipe-back, iOS large title, header transitions). Performance is better, especially on low-end Android.
Trade-off:
- Native stack: limited animation customization (a few presets), platform-specific header styling.
- JS stack: total design freedom, but you own performance.
Recommendation 2026: default to native stack. Reach for JS stack only when you need a fully custom animation (e.g. cross-screen hero image). The gap shows clearly in apps with many screens — push/pop 30+ screens, native stack holds FPS while JS stack starts dropping frames.