SYSTEM Cited by 2 sources
React Native¶
React Native (RN) is Meta's open-source cross-platform mobile application framework — TypeScript/JavaScript application code running on top of native iOS and Android platform layers, with a bridge (legacy) or JSI + TurboModules + Fabric (New Architecture, reactnative.dev/architecture/landing-page) connecting JS to native UI and APIs. Lets a single codebase ship to both iOS and Android with a large shared surface area and targeted per-platform escape hatches where needed.
RN is governed by Meta as primary maintainer, with significant upstream contributions from partner companies including Shopify (co-release captains), Microsoft (React Native Windows / macOS targets), Amazon, Tesla, SpaceX, and Coinbase. The React Native Working Group — previously including Meta, Twitter, Coinbase, Microsoft — is restarting in 2025 under Shopify's leadership.
Architecture at a glance¶
- JS / TypeScript application code runs in a JavaScript engine (Hermes is the current Meta-built default) inside the mobile process.
- Native platform layer (UIKit on iOS, Android View system on Android) renders actual pixels and handles platform APIs.
- Bridge (legacy) or JSI + TurboModules + Fabric (New Architecture) marshals calls between JS and native.
- Hot reloading flips JS module bundles in the running app without restarting — the load-bearing devloop improvement over native (see concepts/hot-reloading-devloop).
- Native modules (Objective-C / Swift / Kotlin / Java / C++) expose platform APIs to JS — 2D/3D scanning, on-device ML, background-job scheduling, widgets, Apple Watch complications, App Intents, Siri Shortcuts all require native code at some level.
Production evidence¶
Shopify's 2025-01-13 five-year retrospective (sources/2025-01-13-shopify-five-years-of-react-native-at-shopify) is the first-party disclosure that RN at consumer-app scale can hit <500ms (P75) screen loads and >99.9% crash-free sessions in the Shopify app and across Shopify's portfolio, after five years of migration on a per-team-per-app schedule. Shopify's closing posture: "native doesn't automatically mean fast, and React Native doesn't automatically mean slow." Canonical first-party validation that the bet is payable.
Failure modes the retrospective discloses¶
- Framework upgrades are expensive. "Updating an app to each new version of React Native takes a significant amount of work and often requires restructuring the code base." Mitigated by rotating-team staffing (patterns/rotating-framework-upgrade-team) and expected to improve with the New Architecture.
- Debugging is worse than native. "Debugging in React
Native is flakey and configuring it correctly in VSCode takes
some work. iOS and Android on the other hand have powerful
debugging capabilities that just work." Meta's rewrite of
the debugger stack (
reactnative.dev/docs/react-native- devtools) is in progress with Shopify collaboration. - 3rd-party library reliance is higher than native. The framework is not as comprehensive as native, so more 3rd- party libraries are needed, increasing supply-chain attack surface + dependency-upgrade burden. Mitigated at Shopify via Dependabot-automated dependency updates + automated code scanning for malicious code.
- Shared foundations come later, not earlier. The same Shopify retrospective discloses that RN adoption initially meant each team built things their own way — the years of shared-native-foundation work didn't carry over. Shopify started extracting common components (Identity, real- time monitoring, performance measurement) into shared libraries across all apps only by end of 2023 — three years into the RN bet. Canonicalised as concepts/shared-mobile-foundations.
Architectural posture at scale: native and RN, not or¶
Shopify's load-bearing architectural claim: "100% React Native should be an anti-goal." See patterns/mixed-native-plus-cross-platform-mobile-stack. The rule is "build most features once in RN; keep native for features where native is the best tool". Canonical native-is- best-tool categories from the Shopify retrospective:
- Device hardware — 2D/3D scanning, on-device AI inference.
- Memory-constrained surfaces — home-screen widgets, lock-screen widgets, Apple Watch apps and complications, App Intents, Siri Shortcuts.
- Long-running background jobs — Shopify's Point of Sale app downloads + syncs data in the background so it can process transactions offline. "By leveraging native code, we were able to offload that work completely to the background, ensuring that it had no effect on app performance."
Shopify-stewarded RN ecosystem libraries¶
Shopify is one of RN's largest non-Meta ecosystem contributors and maintains several load-bearing open-source libraries:
- FlashList —
High-performance list component designed to replace
FlatListfor long lists (avoiding RN list-perf pitfalls that Meta has worked to eliminate). - React Native Skia — GPU graphics library exposing Google's Skia 2D rendering library to RN. Sponsored by Shopify.
- Reanimated — high-performance animations library. Sponsored by Shopify.
- Restyle — RN styling system (design-system-friendly style primitives).
- Tophat — macOS app distribution tool for RN workflows.
New Architecture (Fabric + TurboModules + JSI)¶
Meta's ongoing rewrite of RN's native-JS bridge replaces the
asynchronous-message-queue bridge with JSI (JavaScript
Interface) for synchronous JS↔native calls, TurboModules
for lazily-loaded native modules, and Fabric for the new
renderer. See reactnative.dev/architecture/landing-page.
Shopify is "stoked about the New Architecture and [is]
committed to adopting it in our apps" — a separate 2025-09-12
Shopify post covers the migration itself.
Pillar summary¶
| Pillar | Old | New |
|---|---|---|
| Renderer | Paper (async, view-hierarchy mirrored into native) | Fabric (synchronous, shared C++ shadow tree) |
| Native modules | Bridge (async, JSON-serialised) | TurboModules (synchronous, JSI-bound) |
| Layout | Async layout | Synchronous layout (measure before paint) |
The new architecture adds state
batching (multiple setState calls collapse into one
render pass) and view
flattening (unused intermediate views are elided from the
native tree).
Migration failure modes (from Shopify's 2025-09-12 post)¶
Documented by sources/2025-09-12-shopify-migrating-to-react-natives-new-architecture:
- State batching — components that relied on observing
intermediate state values between
setStatecalls break under batching. These need refactoring to not depend on specific state-update timing. - View flattening —
<View ref={ref}>may be optimized out if flattening decides the view is "unnecessary" for the final layout;ref.currentthen resolves tonull. Mostly seen on iOS because Android had view flattening in the old architecture too. Workarounds: addcollapsable={false}on views with refs; Shopify auto-fixed the testID case with a Babel plugin that injectscollapsable={false}whenever a component has atestID. (See patterns/babel-plugin-automatic-collapsable-false.) - Shadow-tree manipulation from native UIManagers — native modules that swap React-Native-declared views (e.g., WebView replacement) cause view-hierarchy desync: React Native and the native OS disagree on what the tree looks like, and tap gestures fail. Fix: move the hybrid component's lifecycle entirely to native code. (See patterns/native-side-lifecycle-for-hybrid-component.)
requiresMainQueueSetup: truedeadlocks — legacy native modules that request main-queue setup can deadlock on iOS app launch when animations are running on the main thread. Fix: setrequiresMainQueueSetup: falseunless strictly necessary. (See concepts/legacy-native-module-main-queue-deadlock.)
TurboModules are not mandatory¶
A crucial operational finding: the new architecture can be enabled without converting any native modules to TurboModules. Conversion is a forward step for performance (no serialisation cost, synchronous JSI binding) but the two concerns are orthogonal. Shopify shipped the new architecture on 40+ legacy native modules and deferred TurboModule conversion for later review.
Dual-architecture compatibility during migration¶
Because the new architecture is a native binary property (not gated by a remote feature flag), migrating production apps requires a period where the same source tree builds under both old and new architectures. This is the forcing-function behind Shopify's dual-arch CI builds (see patterns/dual-architecture-ci-builds) and feature-flagged dual module implementations (see patterns/feature-flagged-dual-implementation). Shopify's FlashList v2 alpha also shipped with both-architecture support (see systems/flashlist).
Upgrade-first migration order¶
Shopify's operational guidance: upgrade to the latest RN version before starting the migration. The new architecture is under heavy active development; "the majority of bugs we encountered were fixed with version upgrades." Release the upgrade first to isolate the RN-version delta from the architecture delta — minimises concurrent-change blast radius when diagnosing regressions.
At-launch Fabric wins (Shopify, 2025)¶
Even without TurboModule conversion, moving to Fabric alone improved app-launch time ~10% on Android, ~3% on iOS. The delta comes from Fabric's more efficient view commit pipeline. Measure-before-paint simplified screen rendering (FlashList v2); batched state cut unnecessary re-renders, making tab switches snappier.
Adoption at other large consumer apps¶
From the Shopify retrospective: "The community is also thriving with several companies like Microsoft, Amazon, Tesla, SpaceX, and Coinbase using React Native and developers shipping high-quality 3rd party libraries and frameworks."
Seen in¶
- sources/2025-09-12-shopify-migrating-to-react-natives-new-architecture — Shopify's migration of Shopify Mobile + Shopify POS; first detailed public account of a large-scale production new- architecture rollout with dual-arch CI, phased store-aware rollout, and explicit stability-tier response playbook. Immediate Fabric wins (~10% Android / ~3% iOS launch time), regressions (up to 20% slower on some complex components, ANR spikes from main-thread native modules), and upstream bug fixes contributed back to RN and Reanimated.
- sources/2025-01-13-shopify-five-years-of-react-native-at-shopify — Mustafa Ali's five-year retrospective; first-party validation of P75 <500ms screen loads + >99.9% crash-free sessions at Shopify's consumer-app scale; canonical "native and RN, not or" architectural posture and shared-foundations-come-after-maturity timeline.
Related¶
- systems/react — the underlying component model RN shares with web React.
- systems/flashlist — Shopify's high-performance list component; v2 rebuilt on the new architecture.
- systems/reanimated — Software Mansion's animation library; Shopify's usage exposed frame-rate issues that drove upstream fixes.
- systems/tophat-shopify — Shopify's internal mobile test platform; the mechanism for dual-arch builds on every PR.
- concepts/hot-reloading-devloop — The load-bearing devloop improvement over native that RN brings.
- concepts/shared-mobile-foundations — Extracting common components after per-app maturity (Shopify 2023+).
- concepts/cross-platform-client-library — Adjacent pattern at the single-shared-library altitude.
- concepts/dual-architecture-compatibility — the discipline of keeping both architectures buildable during migration.
- concepts/view-flattening — Fabric's optimization that removes unused views from the native tree.
- concepts/state-batching — new-architecture behavior that
collapses intermediate
setStatevalues. - concepts/legacy-native-module-main-queue-deadlock — failure mode on iOS when legacy modules request main-queue setup and block animations.
- patterns/mixed-native-plus-cross-platform-mobile-stack — "Think native and React Native, not native or React Native."
- patterns/rotating-framework-upgrade-team — Small rotating team to handle RN version upgrades.
- patterns/dual-architecture-ci-builds — CI shape that enforces dual-arch compatibility on every PR.
- patterns/feature-flagged-dual-implementation — source- code-level companion to dual-arch CI.
- patterns/phased-mobile-rollout-with-stability-tiers — production rollout playbook aligned to app-store capabilities.
- patterns/babel-plugin-automatic-collapsable-false — compile-time auto-fix for view-flattening breaking testID lookups.
- patterns/native-side-lifecycle-for-hybrid-component — move shadow-tree-manipulating components to native ownership.
- companies/shopify — RN's largest known non-Meta enterprise adopter and ecosystem steward.