Developer Tools

React Native's New Architecture: JSI, Fabric, TurboModules E

The 'coming soon' status of React Native's New Architecture is over. It's shipped, it's default, and it's fundamentally rewriting how JavaScript talks to native code.

{# Always render the hero — falls back to the theme OG image when article.image_url is empty (e.g. after the audit's repair_hero_images cleared a blocked Unsplash hot-link). Without this fallback, evergreens with cleared image_url render no hero at all → the JSON-LD ImageObject loses its visual counterpart and LCP attrs go missing. #}
Diagram illustrating the flow of data between JavaScript and Native code in React Native's New Architecture.

Key Takeaways

  • The "New Architecture" (JSI, Fabric, TurboModules) is now default in React Native, replacing the old asynchronous bridge.
  • JSI enables direct, synchronous communication between JavaScript and native code, eliminating serialization overhead.
  • TurboModules offer lazy loading and type safety, improving startup times and reducing runtime errors.
  • Fabric is a new concurrent rendering system designed for smoother animations and better UI responsiveness.
  • Migration to the New Architecture requires planning and effort for existing applications.

For ages, it felt like a mythical beast, whispered about in Slack channels and developer forums. React Native’s New Architecture — the trinity of JSI, Fabric, and TurboModules — was perpetually “just around the corner.” Many wrote it off. Vaporware, they muttered. But here we are. It’s not just released; it’s the default for new projects. And this isn’t some minor tweak. This is a fundamental platform shift, a complete overhaul of how JavaScript dances with native code, and the implications are seismic.

What everyone expected, or at least hoped for, was speed. Faster apps, smoother animations, fewer jank cycles. What we got is that, yes, but also a profound reimagining of the very pipes connecting the two worlds of code that make up so many of our mobile experiences. It’s like upgrading from a horse-drawn carriage to a maglev train — not just faster, but a whole new paradigm of movement.

The old way? A bridge. Think of it as a very polite, very cautious messenger carrying handwritten notes between two rooms. JavaScript would write a message, seal it in an envelope (JSON serialization), send it to the bridge. The bridge would carefully open it, read it (deserialization), deliver it to the native side. Native would do its work, write a reply, seal that up, and send it back. Round and round it went, every single time. This system, while functional, introduced three gnawing problems:

Asynchronous by default, synchronous by necessity. Sometimes, you just need an answer now. Like needing to know the exact pixel position of an element before you animate it. The bridge forced slow, asynchronous round-trips or required brittle workarounds that relied on potentially stale cached data. Not ideal.

Serialization overhead. Every. Single. Message. Had to be painstakingly converted into JSON and then back again. For high-frequency events—scrolling, gestures, animations firing every frame—this added up. It was like asking your messenger to translate a novel into a telegram, send it, get it back, and translate it again, just to say “hello.”

Eager initialization. Every single native module, whether your app used it or not, was fired up at startup. Large apps, stuffed with third-party SDKs, meant agonizingly long initial load times. It was like packing a suitcase with every single item in your house, just in case you might need one of them later.

Here’s where the magic happens: JSI. The JavaScript Interface. It rips out the bridge entirely. Instead, JavaScript can hold direct references to native objects and call native methods synchronously, with zero serialization. Imagine JavaScript can now reach directly into the native room, tap a native function on the shoulder, and get an immediate answer. No waiting. No translation.

From JavaScript’s perspective, calling a JSI-backed function feels identical to calling a regular JavaScript function — because it effectively is. The native implementation runs synchronously on the JavaScript thread via the JSI host object protocol.

This is the foundation upon which TurboModules are built. TurboModules are the new way to access native code. They bring two massive wins: lazy loading and type safety. Lazy loading means modules only spin up when you actually use them. So, if your app has 50 native modules but only uses 5 on a given screen, only those 5 initialize. Startup time shrinks dramatically. Type safety, via Codegen, means those messy runtime crashes from type mismatches are a thing of the past. Specs are written in TypeScript or Flow, and Codegen automatically generates the native code, ensuring that what you send from JavaScript is exactly what the native side expects.

It’s like having a highly skilled, bilingual personal assistant (JSI) who can not only fetch information instantly but also understands your specific needs down to the last detail (TurboModules and Codegen), ensuring no miscommunication. This isn’t just an upgrade; it’s a paradigm shift that unleashes performance previously thought impossible for cross-platform development. The era of asynchronous guesswork is over. The age of direct, performant interaction has dawned.

But what about Fabric? Fabric is React Native’s new rendering system. It’s the visual engine that translates your component tree into native UI elements. The old renderer was synchronous and single-threaded. Fabric, however, is built for concurrency. It can prioritize rendering tasks, pause and resume them, and even render on different threads. This is a massive win for complex UIs and animations, allowing for much smoother visual experiences. Think of it as upgrading from a single, overworked artist trying to paint a mural to a coordinated team of artists, each specializing in a different part, able to work simultaneously and efficiently.

Is this a smooth ride for existing apps? That’s the million-dollar question. Migrating a large, established app to the New Architecture isn’t a weekend project. It involves understanding the new components, potentially rewriting some native module interactions, and thoroughly testing. The docs are clear about this: it’s a migration, not an instant flip of a switch. Teams need to plan, allocate resources, and be prepared for the complexities involved.

What does this mean for open source developers? It means new opportunities. The New Architecture is an invitation to build faster, more capable libraries. It also means adapting existing libraries. For those contributing to React Native itself, it’s a new frontier of performance optimization. The underlying mechanisms are more accessible and powerful than ever before. It’s a chance to push the boundaries of what cross-platform applications can achieve.

What Exactly is JSI?

JSI, or JavaScript Interface, is the core component that replaces the old asynchronous bridge. It allows JavaScript to directly and synchronously call native methods and hold references to native objects, eliminating serialization overhead and enabling real-time, two-way communication.

Why is TurboModules Better Than Old NativeModules?

TurboModules offer lazy initialization, meaning they are only loaded when first used, significantly improving app startup times. They also introduce type safety through Codegen, preventing runtime errors caused by mismatched data types between JavaScript and native code.

Does the New Architecture Fix All Performance Issues?

While the New Architecture, with JSI, TurboModules, and Fabric, dramatically improves performance, especially in communication between JS and native code and in rendering, it’s not a silver bullet for every performance bottleneck. Developers still need to optimize their JavaScript code and native implementations for the best results.

How Does Fabric Impact UI Performance?

Fabric is React Native’s new concurrent rendering system. It enables the UI thread to be more responsive by allowing rendering tasks to be prioritized, paused, and resumed, leading to smoother animations and a more fluid user experience, especially in complex UIs.

What Are the Challenges of Migrating?

Migrating existing React Native apps to the New Architecture can be complex. It requires careful planning, potential refactoring of native modules, and extensive testing to ensure compatibility and stability. It’s a significant undertaking for large or mature applications.


**


🧬 Related Insights

Frequently Asked Questions**

What does React Native’s New Architecture actually do? It replaces the old asynchronous bridge with a direct, synchronous JavaScript Interface (JSI), introduces lazy-loading TurboModules for better startup times, and a concurrent rendering system called Fabric for smoother UIs.

Will this make my React Native app instantly faster? It provides the foundation for significant performance improvements, especially in native module communication and UI rendering. Actual speed gains depend on your app’s specific use cases and how well your code is optimized within the new architecture.

Do I have to rewrite my entire app? For most apps, a gradual migration is possible. You’ll likely need to update or rewrite individual native modules to be compatible with TurboModules and JSI. It’s not a complete rewrite, but it requires dedicated effort.

Written by
Open Source Beat Editorial Team

Curated insights, explainers, and analysis from the editorial team.

Frequently asked questions

What does React Native's New Architecture actually do?
It replaces the old asynchronous bridge with a direct, synchronous JavaScript Interface (JSI), introduces lazy-loading TurboModules for better startup times, and a concurrent rendering system called Fabric for smoother UIs.
Will this make my React Native app instantly faster?
It provides the foundation for significant performance improvements, especially in native module communication and UI rendering. Actual speed gains depend on your app's specific use cases and how well your code is optimized within the new architecture.
Do I have to rewrite my entire app?
For most apps, a gradual migration is possible. You'll likely need to update or rewrite individual native modules to be compatible with TurboModules and JSI. It's not a complete rewrite, but it requires dedicated effort.

Worth sharing?

Get the best Open Source stories of the week in your inbox — no noise, no spam.

Originally reported by Dev.to

Stay in the loop

The week's most important stories from Open Source Beat, delivered once a week.