This episode dissects the New Architecture: Fabric as an asynchronous renderer, JSI for synchronous native calls, the interop layer for legacy libraries, TurboModules, plus migration strategies and when to enable it.

In episode 2 you got to know the New Architecture from a distance. Now it's time to dissect it: what actually happens when a React component is rendered, why native calls can be synchronous, and how the library ecosystem adapts.
Episode 17 digs deep into Fabric and JSI, the interop layer that keeps legacy libraries alive, TurboModules, then migration strategies — when to enable the New Architecture and how to make sure supporting libraries are ready. Since 0.76 this is the default, but understanding its layers is still important when facing performance issues.
When a React component is rendered, React produces a UI description. Fabric takes that description and turns it into native host views — UIView on iOS and View on Android — through several stages:
React element -> React tree -> shadow tree -> host view nativeFabric introduces the concept of an atomic commit: UI changes are grouped and applied all at once, so no half screen appears with mixed state. Heavy work can be moved off the UI Thread, and synchronization with React 19's rendering system becomes possible.
Fabric brings reduced UI Thread work, faster startup time, and support for features that were previously difficult, such as interop with libraries that use their own rendering. For app developers, the impact is felt in more stable scrolling and animations.
The legacy bridge went through JSON serialization and asynchronous communication. JSI (JavaScript Interface) connects JavaScript directly to native objects — JavaScript can hold references to native objects and call their methods without going through serialized messages.
With JSI, libraries like Reanimated can execute animations directly on the UI Thread, and MMKV can read and write storage synchronously from JavaScript. For your app, native calls that were slow in the legacy architecture can become instant.
import { MMKV } from "react-native-mmkv";
const storage = new MMKV();
storage.set("kunci", "nilai"); // sinkron, tanpa serialisasi
const nilai = storage.getString("kunci");Note the synchronous storage.set("kunci", "nilai") — the result is immediately available without a promise or bridge queue. This is the real difference developers feel.
The ecosystem has thousands of libraries written for the legacy bridge. The interop layer in the New Architecture adapts legacy modules automatically, so an app can enable the New Architecture without waiting for all libraries to be rewritten.
Interop preserves compatibility, but its performance remains bridge-like: there's serialization and async limitations. Libraries that use JSI directly are still faster. Check each library's support status before migrating — episode 21 shows how to check on reactnative.directory.
TurboModules changes how native modules are loaded: from all-at-once-at-startup to lazy — only loaded when called. This meaningfully cuts startup time, especially in apps with many native modules.
Natively written TurboModules use JSI and can be called synchronously. Legacy modules are adapted through interop and keep working. When choosing a library, the performance preference is clear: native TurboModules are better than interop'd legacy modules.
Before enabling the New Architecture, audit all dependencies:
reactnative.directory/library/<nama-library>Check New Architecture support, the minimum React Native version, and any open issues in the repository. Libraries that don't support it yet can use interop, but validate with thorough testing.
Since 0.76 the New Architecture is on by default, so for new projects there's no extra step. For legacy projects still on the old architecture, enable it via a configuration flag:
newArchEnabled=trueAfter enabling, run the full test suite, test native libraries one by one, and monitor startup metrics and stability before a full release.
Tip
For new projects, start directly with the New Architecture — it's the default since 0.76. For legacy projects, migrate gradually: audit libraries, enable on a branch, test extensively, then merge with a clear rollback plan.
Episode 17 dissected the New Architecture: Fabric as an asynchronous renderer with atomic commits, JSI enabling synchronous native calls, the interop layer for legacy libraries, TurboModules with lazy loading, and a safe migration strategy.
Key takeaways:
In the next episode, episode 18, we'll discuss performance and profiling: React DevTools, the Performance Monitor, and native profiling, then optimization with Hermes, fewer re-renders, list virtualization, and Reanimated animations.