<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abinanthan</title>
    <description>The latest articles on DEV Community by Abinanthan (@abinanthan47).</description>
    <link>https://dev.to/abinanthan47</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1150614%2F0833d1c6-b7e1-49e0-803b-7fc9d39304f4.jpg</url>
      <title>DEV Community: Abinanthan</title>
      <link>https://dev.to/abinanthan47</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abinanthan47"/>
    <language>en</language>
    <item>
      <title>I Finally Understood React Native's New Architecture</title>
      <dc:creator>Abinanthan</dc:creator>
      <pubDate>Fri, 02 Oct 2026 17:06:34 +0000</pubDate>
      <link>https://dev.to/abinanthan47/i-finally-understood-react-natives-new-architecture-2al0</link>
      <guid>https://dev.to/abinanthan47/i-finally-understood-react-natives-new-architecture-2al0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqm0pushwgnz01f1i5yjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqm0pushwgnz01f1i5yjx.png" alt=" " width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve been working with React Native for a while, but there was one thing I kept getting wrong.&lt;/p&gt;

&lt;p&gt;I could explain what &lt;strong&gt;Hermes&lt;/strong&gt;, &lt;strong&gt;JSI&lt;/strong&gt;, &lt;strong&gt;Fabric&lt;/strong&gt;, and &lt;strong&gt;TurboModules&lt;/strong&gt; were individually.&lt;/p&gt;

&lt;p&gt;But if someone asked me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Okay, what actually happens after you write &lt;code&gt;&amp;lt;View&amp;gt;&amp;lt;Text&amp;gt;Hello&amp;lt;/Text&amp;gt;&amp;lt;/View&amp;gt;&lt;/code&gt;?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…I couldn't give a satisfying answer.&lt;/p&gt;

&lt;p&gt;I knew the words.&lt;/p&gt;

&lt;p&gt;I didn't really understand the system.&lt;/p&gt;

&lt;p&gt;So I decided to stop memorizing architecture diagrams and actually build a mental model of what is happening underneath.&lt;/p&gt;

&lt;p&gt;This is my attempt to explain it in the simplest way I now understand it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The diagram that confused me
&lt;/h2&gt;

&lt;p&gt;You've probably seen something roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
    ↓
Hermes
    ↓
JSI
    ↓
Fabric
    ↓
Native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks simple.&lt;/p&gt;

&lt;p&gt;But it immediately raised a bunch of questions for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does Hermes convert JavaScript into C++?&lt;/li&gt;
&lt;li&gt;Does JSI translate JavaScript into Kotlin/Swift?&lt;/li&gt;
&lt;li&gt;Is Fabric inside JSI?&lt;/li&gt;
&lt;li&gt;Where does the C++ code actually live?&lt;/li&gt;
&lt;li&gt;What exactly is being passed between JavaScript and C++?&lt;/li&gt;
&lt;li&gt;When I change a &lt;code&gt;&amp;lt;Text&amp;gt;&lt;/code&gt;, how does that eventually become a changed pixel on my phone?&lt;/li&gt;
&lt;li&gt;And where does Node.js / Metro fit into all of this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more I read, the more these terms started feeling like a collection of buzzwords.&lt;/p&gt;

&lt;p&gt;The breakthrough for me was realizing that &lt;strong&gt;these aren't steps in one giant translation pipeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They're different pieces with different responsibilities.&lt;/p&gt;




&lt;h1&gt;
  
  
  First: What is the New Architecture?
&lt;/h1&gt;

&lt;p&gt;React Native's New Architecture isn't just "a faster bridge."&lt;/p&gt;

&lt;p&gt;It's a broader rewrite of React Native's internals: rendering, communication between JavaScript and native code, scheduling, and native modules/components. React Native made it the default starting with React Native 0.76. (&lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The easiest way I understand it now is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzppxq4nw96fs5f64wzyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzppxq4nw96fs5f64wzyw.png" alt=" " width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But this diagram can be misleading if you interpret every arrow as "code gets converted into the next thing."&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Let's go through it.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. I write React code
&lt;/h1&gt;

&lt;p&gt;Suppose I write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, I'm writing JavaScript/TypeScript and React components.&lt;/p&gt;

&lt;p&gt;I don't write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kt"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;TextView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole point of React Native.&lt;/p&gt;

&lt;p&gt;I describe the UI using React.&lt;/p&gt;

&lt;p&gt;So conceptually, I'm saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want a View containing some Text that says Hello."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  2. Where does Hermes come in?
&lt;/h1&gt;

&lt;p&gt;Hermes is the JavaScript engine used by React Native. In current React Native releases, Hermes V1 is the default JavaScript engine. (&lt;a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This part was easier for me once I stopped thinking of Hermes as a React Native renderer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hermes' job is to execute JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Very roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
    ↓
Hermes
    ↓
JavaScript is executed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hermes can use bytecode so that applications don't have to ship only as raw JavaScript source and compile everything from scratch at startup. (&lt;a href="https://reactnative.dev/blog/2021/10/26/toward-hermes-being-the-default?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;But Hermes doesn't take:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and magically turn it into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not its job.&lt;/p&gt;

&lt;p&gt;And this was one of my first misconceptions.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Then what is JSI?
&lt;/h1&gt;

&lt;p&gt;This was the part I struggled with the most.&lt;/p&gt;

&lt;p&gt;I originally thought:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
   ↓
JSI
   ↓
C++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;meant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"JSI converts JavaScript into C++."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;A much better mental model is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JSI is an interface that allows JavaScript and C++ to interact directly.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React Native's documentation describes JSI as allowing JavaScript to hold references to C++ objects and vice versa, allowing methods to be invoked without the serialization costs of the old bridge. (&lt;a href="https://reactnative.dev/architecture/landing-page?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So I started thinking about JSI as a &lt;strong&gt;communication interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────┐
│ JavaScript        │
│ Hermes            │
└────────┬──────────┘
         │
         │ JSI
         │
┌────────▼──────────┐
│ React Native C++  │
└───────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSI isn't a box containing Fabric.&lt;/p&gt;

&lt;p&gt;It's the interface that lets the JavaScript side interact with the C++ side.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Okay, but what actually gets communicated?
&lt;/h1&gt;

&lt;p&gt;This was the question that finally made the whole thing click for me.&lt;/p&gt;

&lt;p&gt;Imagine JavaScript needs to interact with some native functionality.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;nativeFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSI provides the mechanism for that JavaScript code to interact with a C++ function/object.&lt;/p&gt;

&lt;p&gt;The important thing is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript function call
        ↓
      JSI
        ↓
C++ function/object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're not converting the entire JavaScript program into C++.&lt;/p&gt;

&lt;p&gt;We're passing &lt;strong&gt;runtime values and function calls across the JavaScript/C++ boundary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JS

"Hello"
  ↓
JSI
  ↓
C++ sees a JS string value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JS

{
  text: "Hello",
  fontSize: 20
}

        ↓
       JSI
        ↓

C++ can access those values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one reason the New Architecture can avoid the old architecture's heavy serialization path. React Native specifically describes JSI as enabling direct access to JavaScript values rather than serializing everything as JSON between JavaScript and the host platform. (&lt;a href="https://reactnative.dev/architecture/fabric-renderer?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Then where does Fabric fit?
&lt;/h1&gt;

&lt;p&gt;Now we're entering the rendering side.&lt;/p&gt;

&lt;p&gt;Fabric is React Native's new rendering system. Its core implementation moves more rendering logic into C++ and improves interoperability with the host platform. (&lt;a href="https://reactnative.dev/architecture/fabric-renderer?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Let's go back to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React needs to represent the UI somehow.&lt;/p&gt;

&lt;p&gt;Conceptually, you can imagine a tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;View
└── Text
     └── "Hello"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fabric maintains the rendering-side representation of this UI and handles the work needed to turn React's desired UI into changes that eventually reach native views.&lt;/p&gt;

&lt;p&gt;The React Native architecture documentation describes this as a &lt;strong&gt;Render → Commit → Mount&lt;/strong&gt; pipeline. (&lt;a href="https://reactnative.dev/architecture/overview?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  6. The part that finally made sense to me: Render → Commit → Mount
&lt;/h1&gt;

&lt;p&gt;This was much easier for me to understand than trying to memorize Fabric as a single word.&lt;/p&gt;

&lt;p&gt;Imagine the screen currently says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Count: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React now has a new desired UI.&lt;/p&gt;

&lt;p&gt;Before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text
└── "Count: 0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text
└── "Count: 1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system doesn't need to throw away the entire screen just because one value changed.&lt;/p&gt;

&lt;p&gt;Conceptually, the rendering process figures out:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The Text already exists. Its content needs to change."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the resulting UI mutation is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Update Text
text = "Count: 1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. Commit
&lt;/h1&gt;

&lt;p&gt;This is where I had another mental-model mistake.&lt;/p&gt;

&lt;p&gt;I initially thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Fabric renders the UI and then Mounting renders it again."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not really the useful way to think about it.&lt;/p&gt;

&lt;p&gt;A better simplified model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Render
  ↓
Figure out the new UI state
  ↓
Commit
  ↓
Determine the mutations
  ↓
Mount
  ↓
Apply those mutations to native UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React Native's architecture docs explicitly describe the rendering pipeline in terms of Render, Commit, and Mount. (&lt;a href="https://reactnative.dev/architecture/overview?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So for our example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old:
Count: 0

New:
Count: 1

        ↓

Mutation:
Update Text → "Count: 1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  8. And then Mounting
&lt;/h1&gt;

&lt;p&gt;Now we have the actual UI mutations.&lt;/p&gt;

&lt;p&gt;Mounting is the part that applies those changes to the host/native views.&lt;/p&gt;

&lt;p&gt;So conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fabric
   ↓
Commit
   ↓
"Update Text"
   ↓
Mounting
   ↓
Native Text View
   ↓
Screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the abstract React representation eventually becomes an actual native UI update.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. But where is all this code running?
&lt;/h1&gt;

&lt;p&gt;This was another thing I wasn't clear about initially.&lt;/p&gt;

&lt;p&gt;When I'm developing on my Mac, I have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VS Code
Node.js
Metro
Android/iOS build tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are development/build-side tools.&lt;/p&gt;

&lt;p&gt;Metro handles the JavaScript bundling side of the development workflow.&lt;/p&gt;

&lt;p&gt;But when the application actually runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📱 Phone

Hermes
React Native runtime
C++ infrastructure
Fabric
Mounting
Native platform code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are part of the application runtime.&lt;/p&gt;

&lt;p&gt;So I started separating my mental model into two worlds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        💻 DEVELOPMENT MACHINE

VS Code
   ↓
Node.js
   ↓
Metro
   ↓
Build tools
   ↓
App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             📱 DEVICE

JS bundle
   ↓
Hermes
   ↓
JSI
   ↓
React Native C++
   ↓
Fabric
   ↓
Commit
   ↓
Mounting
   ↓
Native UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction cleared up a lot for me.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. So what actually happens when I change my code?
&lt;/h1&gt;

&lt;p&gt;Suppose I change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello world&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During development, roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;💻 My computer

Code changes
     ↓
Metro processes/bundles JS
     ↓
Updated JS is available to
the development app
     ↓
📱 Phone
     ↓
Hermes executes it
     ↓
React updates the UI
     ↓
JSI provides the JS ↔ C++ interface
     ↓
Fabric handles the rendering pipeline
     ↓
Commit determines the required mutations
     ↓
Mounting applies them
     ↓
Native Text gets updated
     ↓
📱 "Hello world"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice something important here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metro didn't render my UI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hermes didn't render my UI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSI didn't render my UI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fabric is the rendering system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;Mounting applies the resulting changes to native views.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  11. The biggest misconception I had
&lt;/h1&gt;

&lt;p&gt;I used to visualize React Native like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
    ↓
Translate JavaScript
    ↓
C++
    ↓
Translate C++
    ↓
Swift/Kotlin
    ↓
Screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That mental model is wrong.&lt;/p&gt;

&lt;p&gt;A better model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 JavaScript
                     │
                   Hermes
                     │
               React logic
                     │
                    JSI
                     │
                     ▼
              React Native C++
                     │
                   Fabric
                     │
                  Commit
                     │
                  Mounting
                     │
              Native platform
                     │
                   Screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not a chain of language translators.&lt;/p&gt;

&lt;p&gt;It's a set of systems communicating with each other.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. And what happened to the old Bridge?
&lt;/h1&gt;

&lt;p&gt;This is where the name &lt;strong&gt;New Architecture&lt;/strong&gt; starts making more sense.&lt;/p&gt;

&lt;p&gt;The old architecture relied heavily on an asynchronous bridge between JavaScript and native code.&lt;/p&gt;

&lt;p&gt;The New Architecture removes React Native's dependency on that bridge and uses JSI for direct JavaScript/native communication. (&lt;a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Very simplified:&lt;/p&gt;

&lt;h3&gt;
  
  
  Old mental model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
    ↓
Bridge
    ↓
Serialize
    ↓
Message
    ↓
Native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript
    ↓
JSI
    ↓
C++ / Native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That doesn't mean "JS is magically native now."&lt;/p&gt;

&lt;p&gt;It means the &lt;strong&gt;communication mechanism and the underlying architecture have fundamentally changed.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  13. So what is actually "new"?
&lt;/h1&gt;

&lt;p&gt;For me, the easiest summary is:&lt;/p&gt;

&lt;h3&gt;
  
  
  Old React Native
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JS
 ↓
Async Bridge
 ↓
Serialized data
 ↓
Native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New React Native
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JS
 ↓
JSI
 ↓
C++ / Native
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;plus a redesigned renderer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React
 ↓
Fabric
 ↓
Render
 ↓
Commit
 ↓
Mount
 ↓
Native UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a redesigned native module system through &lt;strong&gt;TurboModules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The New Architecture also brings support for modern React features such as Suspense, Transitions, automatic batching, and &lt;code&gt;useLayoutEffect&lt;/code&gt;, alongside the new native module/component systems. (&lt;a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/p&gt;




&lt;h1&gt;
  
  
  What I actually took away
&lt;/h1&gt;

&lt;p&gt;I don't think I needed to memorize every C++ class inside React Native to understand the architecture.&lt;/p&gt;

&lt;p&gt;The mental model that finally worked for me was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React
│
│ "This is the UI I want."
▼
Hermes
│
│ "I'll execute the JavaScript."
▼
JSI
│
│ "I'll provide the interface between
│  JavaScript and C++."
▼
React Native C++
│
│
├── Fabric
│     │
│     ├── Render
│     ├── Commit
│     └── Mount
│
└── Native modules / components
        │
        ▼
   iOS / Android
        │
        ▼
      Screen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the biggest thing I learned was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JSI doesn't translate JavaScript into C++. It gives JavaScript and C++ a way to interact.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once I understood that, &lt;strong&gt;Hermes → JSI → Fabric → Mounting&lt;/strong&gt; stopped looking like four random buzzwords and started looking like four pieces of one system.&lt;/p&gt;




&lt;h2&gt;
  
  
  One thing I'm still learning
&lt;/h2&gt;

&lt;p&gt;Understanding the architecture at this level doesn't mean I suddenly understand React Native's C++ codebase.&lt;/p&gt;

&lt;p&gt;There is still a lot more to dig into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How JSI actually exposes C++ functions to JavaScript&lt;/li&gt;
&lt;li&gt;How Fabric's Shadow Tree works internally&lt;/li&gt;
&lt;li&gt;What exactly happens during Render → Commit → Mount&lt;/li&gt;
&lt;li&gt;How TurboModules use the same underlying ideas&lt;/li&gt;
&lt;li&gt;How native events travel back from Android/iOS to JavaScript&lt;/li&gt;
&lt;li&gt;What happens across different threads&lt;/li&gt;
&lt;li&gt;And eventually, what all of this means for real-world performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's probably where I'll go next.&lt;/p&gt;

&lt;p&gt;Because for me, &lt;strong&gt;understanding the architecture became much easier once I stopped trying to memorize the diagram and started asking:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What is actually happening to this one piece of UI from the moment I write it until the moment I see it on my phone?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's the question I'm going to keep following.&lt;/p&gt;




&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React Native — &lt;a href="https://reactnative.dev/architecture/overview" rel="noopener noreferrer"&gt;Architecture Overview&lt;/a&gt; (&lt;a href="https://reactnative.dev/architecture/overview?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;React Native — &lt;a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here" rel="noopener noreferrer"&gt;The New Architecture is Here&lt;/a&gt; (&lt;a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;React Native — &lt;a href="https://reactnative.dev/architecture/landing-page" rel="noopener noreferrer"&gt;About the New Architecture&lt;/a&gt; (&lt;a href="https://reactnative.dev/architecture/landing-page?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;React Native — &lt;a href="https://reactnative.dev/architecture/fabric-renderer" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt; (&lt;a href="https://reactnative.dev/architecture/fabric-renderer?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;React Native 0.76 — &lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture" rel="noopener noreferrer"&gt;New Architecture by default&lt;/a&gt; (&lt;a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>architecture</category>
      <category>mobile</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
