<?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: anubhuti chopra</title>
    <description>The latest articles on DEV Community by anubhuti chopra (@anubhuti_chopra).</description>
    <link>https://dev.to/anubhuti_chopra</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2365826%2F6136e5df-5644-43f8-96d1-09d491b5f4e8.png</url>
      <title>DEV Community: anubhuti chopra</title>
      <link>https://dev.to/anubhuti_chopra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anubhuti_chopra"/>
    <language>en</language>
    <item>
      <title>React Native’s New Architecture: A Beginner-Friendly Guide to Faster, Smoother Apps</title>
      <dc:creator>anubhuti chopra</dc:creator>
      <pubDate>Sat, 17 May 2025 12:07:16 +0000</pubDate>
      <link>https://dev.to/anubhuti_chopra/react-natives-new-architecture-a-beginner-friendly-guide-to-faster-smoother-apps-1l4b</link>
      <guid>https://dev.to/anubhuti_chopra/react-natives-new-architecture-a-beginner-friendly-guide-to-faster-smoother-apps-1l4b</guid>
      <description>&lt;p&gt;React Native’s new architecture is a game-changer for mobile developers, offering a massive boost in performance, flexibility, and scalability. This shift is centered around three core technologies – &lt;strong&gt;Fabric&lt;/strong&gt;, &lt;strong&gt;TurboModules&lt;/strong&gt;, and &lt;strong&gt;JSI (JavaScript Interface)&lt;/strong&gt; – which together provide a more seamless bridge between JavaScript and native code.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why a New Architecture?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The old React Native bridge worked well, but it had some limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance Issues:&lt;/strong&gt; Communication between JavaScript and native code was slow and asynchronous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Memory Usage:&lt;/strong&gt; The old bridge duplicated data, increasing memory usage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Debugging:&lt;/strong&gt; It was hard to track bugs across the JS-native boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The new architecture fixes these problems, providing a more responsive and efficient framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Key Components of the New Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Fabric – The New Rendering System (Example: High-Performance UI Updates)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To understand how Fabric can make your UI more responsive, here’s a simple example of a component using React’s concurrent mode to handle intensive state updates efficiently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useTransition&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTransition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleHeavyUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;startTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&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="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="si"&gt;}&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="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&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;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Perform Heavy Update"&lt;/span&gt; &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleHeavyUpdate&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPending&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;Updating...&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="si"&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;flex&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;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&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;With Fabric, this component can handle frequent updates without lag, providing a smoother experience for your users.&lt;/p&gt;

&lt;p&gt;Fabric is the new engine that drives how UI components are rendered. It’s faster because it talks to the native layer more directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better Performance:&lt;/strong&gt; Fabric uses React’s concurrent mode for faster updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Layout:&lt;/strong&gt; UI components respond immediately without waiting for the bridge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simpler Code:&lt;/strong&gt; Easier to build complex animations and gestures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. TurboModules – Faster, More Flexible Native Modules (Example: Native Module Integration)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s a simple example of creating a TurboModule for a native function. Suppose you want to expose a native method that returns the battery level on Android.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Native Module (Java)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BatteryModule.java&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.yourapp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.os.BatteryManager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.Context&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.Intent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.IntentFilter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactApplicationContext&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactContextBaseJavaModule&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactMethod&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.Promise&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BatteryModule&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ReactContextBaseJavaModule&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;BatteryModule&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ReactApplicationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"BatteryModule"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ReactMethod&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;getBatteryLevel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Promise&lt;/span&gt; &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;IntentFilter&lt;/span&gt; &lt;span class="n"&gt;ifilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntentFilter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ACTION_BATTERY_CHANGED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;batteryStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getReactApplicationContext&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;registerReceiver&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ifilter&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;batteryStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIntExtra&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTRA_LEVEL&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use the Native Module (JavaScript)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;batteryLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setBatteryLevel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchBatteryLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BatteryModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBatteryLevel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nf"&gt;setBatteryLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&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="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;flex&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;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;Battery Level: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;batteryLevel&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;batteryLevel&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&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;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Get Battery Level"&lt;/span&gt; &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fetchBatteryLevel&lt;/span&gt;&lt;span class="si"&gt;}&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;This demonstrates how to expose native functionality using TurboModules for faster, more direct communication.&lt;/p&gt;

&lt;p&gt;TurboModules replace the old way of connecting to native modules. They are faster because they avoid the slow, serialized bridge communication.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On-Demand Loading:&lt;/strong&gt; Load only what you need, when you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Access:&lt;/strong&gt; No more slow JSON conversion – it’s all direct communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smaller App Sizes:&lt;/strong&gt; Load fewer modules, save memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. JSI (JavaScript Interface) – The Backbone (Example: Direct Native Access)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;JSI allows you to directly call native functions from JavaScript without a bridge. Here’s a simple example of using JSI to add two numbers in C++.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a JSI Module (C++)&lt;/strong&gt;&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="c1"&gt;// MyJSIModule.cpp&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;jsi/jsi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;react-native/jsi/jsilib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;facebook&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;jsi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;jsiRuntime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;addNumbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createFromHostFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;jsiRuntime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;PropNameID&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;forAscii&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsiRuntime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"addNumbers"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[](&lt;/span&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;asNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&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;span class="n"&gt;asNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;jsiRuntime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsiRuntime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"addNumbers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addNumbers&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;&lt;strong&gt;Use the JSI Function (JavaScript)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setResult&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;);&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="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;flex&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;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;Result: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="si"&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;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Calculate 10 + 20"&lt;/span&gt; &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&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;This code directly calls the C++ function from JavaScript, providing near-instant performance.&lt;/p&gt;

&lt;p&gt;JSI is the heart of the new architecture. It directly connects JavaScript to native code, removing the old bridge entirely.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster Calls:&lt;/strong&gt; Instant communication with native code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Memory Management:&lt;/strong&gt; Share data without copying it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Engine Support:&lt;/strong&gt; Use different JS engines like V8 or Hermes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Migrate to the New Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1: Prepare Your Project&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, make sure you’re using React Native 0.72+:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx react-native upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2: Enable the New Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Update your &lt;code&gt;android/gradle.properties&lt;/code&gt; to enable the new architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;newArchEnabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for iOS, ensure you have the latest Podfile settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;use_react_native!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:new_architecture&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3: Migrate Your Native Modules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you have custom native modules, you'll need to rewrite them as TurboModules. This involves updating your C++ bindings and ensuring they are JSI-compliant.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4: Test and Optimize&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With the new architecture enabled, test your app for potential breaking changes and performance improvements. Use tools like Flipper for debugging and performance analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Benefits of the New Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Performance:&lt;/strong&gt; Faster app startup and smoother UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smaller Bundle Sizes:&lt;/strong&gt; Reduced memory footprint with on-demand module loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Consistency:&lt;/strong&gt; More predictable performance across iOS and Android.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier Maintenance:&lt;/strong&gt; Simplified module management and code sharing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Real-World Project Example – Building a Native Module for Battery Health&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To bring everything together, let’s walk through a small real-world project that leverages the new architecture. We’ll create a native module to get the &lt;strong&gt;battery health&lt;/strong&gt; of the device.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1: Creating the Native Module (Java)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a new file in your Android project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BatteryHealthModule.java&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.yourapp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.os.BatteryManager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.Context&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.Intent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;android.content.IntentFilter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactApplicationContext&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactContextBaseJavaModule&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.ReactMethod&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.facebook.react.bridge.Promise&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BatteryHealthModule&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ReactContextBaseJavaModule&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;BatteryHealthModule&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ReactApplicationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"BatteryHealthModule"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ReactMethod&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;getBatteryHealth&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Promise&lt;/span&gt; &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;IntentFilter&lt;/span&gt; &lt;span class="n"&gt;ifilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntentFilter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ACTION_BATTERY_CHANGED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Intent&lt;/span&gt; &lt;span class="n"&gt;batteryStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getReactApplicationContext&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;registerReceiver&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ifilter&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;health&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;batteryStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIntExtra&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTRA_HEALTH&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BATTERY_HEALTH_UNKNOWN&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;health&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BATTERY_HEALTH_GOOD&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Good"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BATTERY_HEALTH_OVERHEAT&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Overheat"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BATTERY_HEALTH_DEAD&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Dead"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;BatteryManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BATTERY_HEALTH_OVER_VOLTAGE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Over Voltage"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Unknown"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2: Using the Native Module (JavaScript)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;batteryHealth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setBatteryHealth&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchBatteryHealth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;health&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NativeModules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BatteryHealthModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBatteryHealth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nf"&gt;setBatteryHealth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;health&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&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="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;flex&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;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&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;Battery Health: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;batteryHealth&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;batteryHealth&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&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;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Get Battery Health"&lt;/span&gt; &lt;span class="na"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fetchBatteryHealth&lt;/span&gt;&lt;span class="si"&gt;}&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;h3&gt;
  
  
  &lt;strong&gt;Step 3: Testing the Module&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run your app and press the &lt;strong&gt;Get Battery Health&lt;/strong&gt; button. You should see the current battery health displayed on the screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Benefits of This Example&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct Native Access:&lt;/strong&gt; Immediate access to battery health without bridging delays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Memory Use:&lt;/strong&gt; No unnecessary data copying, thanks to TurboModules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Easily extend this module to include more battery-related metrics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Debugging React Native’s New Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Debugging your app with the new architecture can feel a bit different, but with the right tools and approach, it’s straightforward and even fun!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Use Flipper – The Ultimate Debugging Tool&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Flipper is the official React Native debugger that supports the new architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Why Flipper?&lt;/strong&gt;&lt;br&gt;
It shows logs, inspects network calls, views your component hierarchy, and profiles performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How to set up Flipper:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flipper is integrated by default in React Native 0.72+. Just open Flipper on your machine and connect your device/emulator.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inspect Fabric UI Components:&lt;/strong&gt;
The new Fabric architecture exposes detailed UI component trees you can inspect in Flipper’s React DevTools plugin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Enable Debugging in React Native&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For JavaScript debugging, use &lt;strong&gt;Hermes Debugger&lt;/strong&gt; or &lt;strong&gt;Chrome Debugger&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hermes debugger is faster and supports the new architecture better.&lt;/li&gt;
&lt;li&gt;To enable, add in your &lt;code&gt;metro.config.js&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;transformer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;experimentalImportSupport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inlineRequires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;ul&gt;
&lt;li&gt;Use &lt;code&gt;console.log&lt;/code&gt; as usual, but keep an eye on Flipper’s logs for native module outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Debug TurboModules&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Verify if TurboModules are loaded by inspecting your native modules in Flipper.&lt;/li&gt;
&lt;li&gt;Use Android Studio or Xcode native debuggers to step through native code.&lt;/li&gt;
&lt;li&gt;Add explicit logging in native modules to trace method calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Debugging JSI&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Because JSI runs native code directly, debugging might require native debugger tools.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;lldb&lt;/code&gt; (iOS) or &lt;code&gt;gdb&lt;/code&gt; (Android) to debug C++ code.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;console.log&lt;/code&gt; or logging macros in C++ to trace calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Performance Profiling&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use Flipper's React DevTools profiler to track rendering performance with Fabric.&lt;/li&gt;
&lt;li&gt;Use native profilers (Android Profiler, Instruments on iOS) to find bottlenecks in native modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. Common Debugging Tips&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Always clear caches after switching architecture modes:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm start &lt;span class="nt"&gt;--reset-cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rebuild your app after enabling the new architecture.&lt;/li&gt;
&lt;li&gt;Monitor crash logs closely – sometimes native module errors bubble up asynchronously.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>reactnative</category>
      <category>newarchitecture</category>
      <category>mobileapp</category>
      <category>learning</category>
    </item>
    <item>
      <title>Unstoppable Debugging Mastery in React Native</title>
      <dc:creator>anubhuti chopra</dc:creator>
      <pubDate>Sun, 11 May 2025 11:57:55 +0000</pubDate>
      <link>https://dev.to/anubhuti_chopra/unstoppable-debugging-mastery-in-react-native-4lbh</link>
      <guid>https://dev.to/anubhuti_chopra/unstoppable-debugging-mastery-in-react-native-4lbh</guid>
      <description>&lt;p&gt;Debugging is an essential skill for any developer, and in the world of React Native with TypeScript, it becomes even more critical. Understanding the right tools and strategies can save you hours of frustration and ensure a smoother development experience. In this guide, we’ll explore the most effective ways to debug your React Native applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Common Debugging Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React Native Debugger&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A standalone app that integrates well with React Native and provides a powerful combination of tools like Redux DevTools, Network Inspection, and more. To use it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install it using &lt;a href="https://github.com/jhen0409/react-native-debugger" rel="noopener noreferrer"&gt;React Native Debugger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Start it before running your app.&lt;/li&gt;
&lt;li&gt;Open the in-app developer menu (&lt;code&gt;Cmd + D&lt;/code&gt; or &lt;code&gt;Cmd + M&lt;/code&gt; for macOS, &lt;code&gt;Ctrl + M&lt;/code&gt; for Windows) and select &lt;strong&gt;Debug&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Flipper&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Meta's official debugging tool for React Native, providing features like network inspection, crash logs, performance profiling, and more. Setup is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure you have the latest React Native version.&lt;/li&gt;
&lt;li&gt;Install the Flipper app from &lt;a href="https://fbflipper.com/" rel="noopener noreferrer"&gt;Flipper website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add the Flipper plugin to your project if required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;VS Code Debugger&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Leverage the powerful VS Code debugging capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the React Native Tools extension.&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;.vscode/launch.json&lt;/code&gt; configuration.&lt;/li&gt;
&lt;li&gt;Set breakpoints and start debugging directly in your IDE.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Essential Debugging Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Console Logging&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While basic, &lt;code&gt;console.log()&lt;/code&gt; remains one of the quickest ways to understand what’s happening in your code. Use it wisely to avoid clutter.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React DevTools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Inspect the component tree, check props, and monitor state changes. It integrates seamlessly with React Native and can be a game-changer for UI debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Error Boundaries&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use error boundaries to catch runtime errors gracefully and prevent your app from crashing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ErrorBoundary&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;componentDidCatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error caught:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&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;h3&gt;
  
  
  &lt;strong&gt;TypeScript's Strict Mode&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Enable strict mode in your &lt;code&gt;tsconfig.json&lt;/code&gt; to catch type errors early and enforce best practices.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Network Debugging&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use tools like Axios interceptors or Flipper's network plugin to inspect and debug API calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Hot and Fast Refresh&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Take advantage of Fast Refresh for instant feedback during development.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Redux DevTools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're using Redux, integrate the Redux DevTools for better state inspection and time-travel debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Clearing Cache&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sometimes caching issues can cause unexpected behavior. Use the following command to clear the cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx react-native start --reset-cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Advanced Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Profiling with Flipper&lt;/strong&gt; - Track performance bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote JS Debugging&lt;/strong&gt; - Use the Chrome DevTools for advanced JavaScript debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Native CLI Options&lt;/strong&gt; - Use &lt;code&gt;npx react-native log-android&lt;/code&gt; and &lt;code&gt;npx react-native log-ios&lt;/code&gt; for platform-specific logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Optimization&lt;/strong&gt; - Use the &lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt; hooks wisely to prevent unnecessary renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Leak Detection&lt;/strong&gt; - Use tools like &lt;code&gt;why-did-you-render&lt;/code&gt; to catch unwanted re-renders and memory leaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash Reporting&lt;/strong&gt; - Use Sentry or Firebase Crashlytics for real-time crash analytics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Effective debugging is a mix of using the right tools and developing a keen sense for identifying problems early. Mastering these techniques will not only save you time but also make you a more confident React Native developer.  &lt;/p&gt;

&lt;p&gt;Happy debugging! 🚀&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>debugging</category>
      <category>mobileapplication</category>
      <category>tips</category>
    </item>
    <item>
      <title>React Native 0.79: Hold Onto Your Keyboards! 🚀</title>
      <dc:creator>anubhuti chopra</dc:creator>
      <pubDate>Thu, 01 May 2025 07:18:41 +0000</pubDate>
      <link>https://dev.to/anubhuti_chopra/react-native-079-hold-onto-your-keyboards-3mk4</link>
      <guid>https://dev.to/anubhuti_chopra/react-native-079-hold-onto-your-keyboards-3mk4</guid>
      <description>&lt;p&gt;React Native 0.79 (April 2025) is here, and it’s a doozy. This release is packed with performance wins and developer-friendly tweaks across the board​. &lt;strong&gt;In plain terms:&lt;/strong&gt; it just got way cooler to build RN apps. Metro (the JS bundler) now starts up around 3× faster thanks to deferred hashing​, and it fully supports modern package.json exports/imports fields out of the box​. Android apps launch much quicker (we’re talking ~400ms shaved off in some tests​), and iOS native modules can be registered with Swift-friendly codegen, cutting boilerplate. &lt;/p&gt;

&lt;p&gt;Under the hood, RN’s JavaScriptCore (JSC) engine has been moved into a community package for faster updates​, and legacy Chrome remote debugging is gone in favor of newer DevTools​.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plus&lt;/strong&gt;, React 19 is the default React version now – unlocking shiny new hooks like Actions and useOptimistic​. And if you’ve been following along, React Native’s “New Architecture” (Fabric/TurboModules) is already on by default​ and now rock-solid.​&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; RN 0.79 is all about speed, modern tooling, and slick developer experiences. Let’s dive into the highlights! 🎉&lt;br&gt;
&lt;br&gt;&lt;br&gt;
⚡ &lt;strong&gt;Metro Bundler: Turbocharged&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     First up, Metro got a serious turbocharge. RN 0.79 ships Metro 0.82, which uses deferred hashing to cut cold-start times by about three times (even more in big projects/monorepos)​.In practice, your yarn start will spin up almost instantly compared to before. Metro 0.82 also now officially honors the exports and imports fields in package.json​, which means you can use modern, standards-compliant module resolution without workarounds. In short – wait times are slashed and your project’s module graph just got a whole lot cleaner. Faster bundling means more time coding and less time staring at the terminal!😎&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
📱 &lt;strong&gt;Android: Launch at Ludicrous Speed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     Android developers, rejoice! 0.79 changes how the JS bundle is packaged in your APKs. By default now, RN doesn’t compress the JS bundle in the APK​ Why? Previously Android would have to unzip that bundle on startup, causing delays. Now the bundle is just stored uncompressed on the device, so the app pops open much faster. In fact, Discord’s team saw a ~400ms (12%) startup speedup on a mid-tier phone (Samsung A14) with just this one tweak​. (There’s a tradeoff: a slightly bigger on-device footprint, but APKs downloaded from the Play Store remain compressed, so users don’t pay the price on install.) You can even toggle this via enableBundleCompression in app/build.gradle if you want to balance size vs speed. The bottom line – way faster Android cold starts with virtually no downside​.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
🍎 &lt;strong&gt;iOS: Swift Modules Made Easy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     iOS got some smooth upgrades too. 0.79 revamps how native modules hook into the RN app. Instead of writing a bunch of registration code in Objective-C, you now add a modulesProvider section in your app’s package.json​. In practice, that means Swift and ObjC native modules can self-register via the codegen system, with zero changes to your AppDelegate. This new modulesProvider field lets you define the JS name and Swift/ObjC provider class in JSON, and React Native handles the rest​. No more wrestling with headers or boilerplate – native modules just slide in seamlessly. (Good news if you love Swift: the old 0.77 limitation—where pure C++ modules couldn’t register on a Swift AppDelegate—is now history. Everything just works without extra glue code​.)&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
🔧 &lt;strong&gt;Under the Hood: Modern Engines &amp;amp; Debugging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     Under the hood, RN 0.79 is trimming fat and updating engines. JavaScriptCore (JSC), the default JS engine on iOS/Android, is being spun out into its own community package (@react-native-community/javascriptcore)​. What does this mean for you? RN core becomes leaner, and the JSC engine can be updated on its own schedule to grab new language features and security fixes​. (If you’re using Hermes instead of JSC, nothing changes – Hermes users are unaffected.) On the debugging side, say goodbye to the old-school Chrome remote debugger. RN 0.79 removes Remote JS Debugging via Chrome​. The team recommends using the built-in React Native DevTools or other modern tools instead. In other words, dump the buggy round-trip hacks and use the official DevTools console and React inspector – they’re more stable and fully featured. It might feel like the end of an era, but it’s for the better: cleaner toolchain, better breakpoints, and no more mysterious Chrome handshake issues​.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
🎉 &lt;strong&gt;React 19: The Future Is Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     Remember React 18? Well, now RN has React 19 as the engine under the hood (after a quick app upgrade)​. This brings some flashy new React features into your RN apps. Think built-in async transitions (Actions) and hooks like useOptimistic for easy optimistic UI updates​. For example, Actions lets you define a function whose work happens in a suspendable, concurrent way, handling pending/error states for you. useOptimistic helps show a “predictive” UI state while waiting for a server response. You can even pass refs as props instead of wrapping in forwardRef, thanks to React 19​. Just a heads-up: upgrading means you need to adjust anything that used removed APIs (like legacy propTypes)​, but most apps will seamlessly gain the new hooks and improvements. In short, RN 0.79 finally puts the latest React magic in your toolbox​.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
🤖 &lt;strong&gt;New Architecture: Rock Solid and Ready&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     If you’ve been following React Native’s progress, you know about the “New Architecture” (Fabric renderer + TurboModules). Good news: it’s the default now and fully stable. Since RN 0.76, the new architecture has been enabled by default in new projects​. By 0.79 it’s considered production-ready​. That means if you’ve already opted in, you get its benefits: smoother UI (Fiber-based mounting), better concurrency, and faster native module bridging. The core is now all set up for Fabric, so your UI interactions and thread-hopping native calls are as performant as they can be. Think of it as the solid foundation that future RN features will build on — and in 0.79 it’s completely baked in and battle-tested​.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
🎨 &lt;strong&gt;Styling and Other Goodies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;     Finally, let’s talk style (literally!). RN 0.79 keeps up all the recent strides in layout and style props. For instance, earlier versions (like 0.76) already introduced new CSS-like style props such as boxShadow and filter​, and 0.77 added flexbox gap support and percentage-based sizing. These aren’t new in 0.79 per se, but they’re fully there for you to use. This means crafting polished UIs is easier: shadows, blurs, and layout gap control are all part of the toolkit now​. Plus, the release includes tons of bug fixes and small upgrades under the hood (like dozens of internal modules moving to modern export syntax). It’s the kind of release where everything feels just a bit smoother and snappier.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
💡 &lt;strong&gt;Key Takeaways&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metro bundler&lt;/strong&gt; is insanely faster: cold-start is ~3× quicker with deferred hashing​, and modern package.json exports/imports work out-of-the-box​.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android startup&lt;/strong&gt; is much faster: RN now ships uncompressed JS bundles by default, shaving ~400ms (12%) off time-to-interactive on tested devices​.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS modules&lt;/strong&gt; registration is simpler: add a modulesProvider entry in package.json and Swift/ObjC native modules auto-register (no AppDelegate edits)​.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSC engine&lt;/strong&gt; has moved to a community package​. This modularizes RN core so JS engine updates (and new JS features) can come faster​.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome remote debugging&lt;/strong&gt; is gone​.Use React Native DevTools or other modern debuggers instead – they’re more stable and feature-rich.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 19&lt;/strong&gt; support: RN 0.79 runs React 19, unlocking features like async Actions, useOptimistic, and passing ref props​ (after updating your app for any removed APIs​).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Architecture&lt;/strong&gt; (Fabric/Turbo) is now default and battle-tested​.Enjoy smoother rendering and faster native modules out-of-the-box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better styling&lt;/strong&gt;: RN’s style system keeps getting richer. New props like boxShadow and filter are available​, so crafting nice UIs is even easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
React Native 0.79 isn’t about flashy new widgets – it’s about a leaner, meaner, faster toolkit for serious app builders. Faster bundling, snappier startups, and modern internals mean you spend more time building and less time wrestling with plumbing. So grab 0.79, upgrade your app, and enjoy the turbocharged ride! Happy coding! 🎉&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>learning</category>
      <category>mobileapp</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 React Native Performance Optimization Tips I Wish I Knew Earlier</title>
      <dc:creator>anubhuti chopra</dc:creator>
      <pubDate>Thu, 17 Apr 2025 06:53:50 +0000</pubDate>
      <link>https://dev.to/anubhuti_chopra/react-native-performance-optimization-tips-i-wish-i-knew-earlier-3elj</link>
      <guid>https://dev.to/anubhuti_chopra/react-native-performance-optimization-tips-i-wish-i-knew-earlier-3elj</guid>
      <description>&lt;p&gt;After building React Native apps for years, I’ve come to realise something painful: &lt;strong&gt;most performance issues don’t scream. They whisper&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your app might work fine on your device — smooth animations, fast loads — until one day a user with an older Android phone opens it and it feels like it's running underwater. That’s when the complaints start rolling in. Been there? Yeah, me too.&lt;/p&gt;

&lt;p&gt;So here’s a list of performance tips I wish someone had tattooed on my screen earlier in my React Native journey. These are real-world lessons, not theoretical fluff — and they’ve saved me more than once.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Avoid Anonymous Functions in JSX
&lt;/h3&gt;

&lt;p&gt;It’s tempting to inline logic, especially when the function is &lt;br&gt;
 short. But anonymous functions in your render tree trigger &lt;br&gt;
 unnecessary re-renders.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ❌ This creates a new function every render
&amp;lt;Button onPress={() =&amp;gt; doSomething()} /&amp;gt;

// ✅ Better: use useCallback
const handlePress = useCallback(() =&amp;gt; {
  doSomething();
}, []);

&amp;lt;Button onPress={handlePress} /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even small optimizations like this can make a noticeable difference when you're rendering long lists or complex UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use FlatList Instead of ScrollView for Lists
&lt;/h3&gt;

&lt;p&gt;This one’s simple but often overlooked. When rendering large &lt;br&gt;
 datasets, always use FlatList — it’s virtualized, meaning it only &lt;br&gt;
 renders what’s visible on the screen.&lt;/p&gt;

&lt;p&gt;Key props to fine-tune performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;FlatList
   data={data}
   initialNumToRender={10}
   maxToRenderPerBatch={5}
   windowSize={10}
   removeClippedSubviews={true}
 /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid ScrollView for dynamic or long content. It renders everything, &lt;br&gt;
 which kills performance.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Don’t Overuse useEffect
&lt;/h3&gt;

&lt;p&gt;I see a lot of devs use useEffect as a default hook for everything data fetching, logging, side effects. It’s powerful, but overuse can lead to memory leaks, double-fetches, and unnecessary re-renders.&lt;/p&gt;

&lt;p&gt;Be intentional. Sometimes, derived state or simple conditional logic is all you need. And don’t forget to clean up your effects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;useEffect(() =&amp;gt; {
  const subscription = doSomething();
  return () =&amp;gt; {
    subscription?.unsubscribe();
  };
}, []);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Memoization is Your Friend
&lt;/h3&gt;

&lt;p&gt;React renders are cheap — until they’re not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt;&lt;br&gt;
React.memo() for functional components&lt;/p&gt;

&lt;p&gt;useMemo() for expensive calculations&lt;/p&gt;

&lt;p&gt;useCallback() for functions passed as props&lt;/p&gt;

&lt;p&gt;But don’t go overboard — memoization has its own cost. Use it strategically.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Optimize Images
&lt;/h3&gt;

&lt;p&gt;Unoptimized images are one of the biggest silent killers of performance, especially on slower networks.&lt;/p&gt;

&lt;p&gt;Here’s what helped:&lt;/p&gt;

&lt;p&gt;Use react-native-fast-image — better caching and decoding&lt;/p&gt;

&lt;p&gt;Compress images before shipping&lt;/p&gt;

&lt;p&gt;Lazy load images when possible (e.g., with onEndReached in FlatList)&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Turn On Hermes (Seriously)
&lt;/h3&gt;

&lt;p&gt;Hermes is a JavaScript engine optimized for React Native on Android. If your app is sluggish on Android, enabling Hermes can dramatically reduce load times and memory usage.&lt;/p&gt;

&lt;p&gt;How to enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android {
  ...
  defaultConfig {
    ...
    jscFlavor: 'org.webkit:android-jsc-intl:+'
  }
  buildTypes {
    release {
      ...
      shrinkResources true
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable in android/app/build.gradle and rebuild. You'll feel the difference, especially on older Android devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Trim the Fat: Dependencies &amp;amp; JS Bloat
&lt;/h3&gt;

&lt;p&gt;It’s easy to add another library to solve a problem — but every dependency adds to your bundle size and startup time.&lt;/p&gt;

&lt;p&gt;✅ Tips:&lt;/p&gt;

&lt;p&gt;Audit dependencies regularly&lt;/p&gt;

&lt;p&gt;Remove unused polyfills&lt;/p&gt;

&lt;p&gt;Avoid dev tools in production (e.g., redux-logger, Flipper, etc.)&lt;/p&gt;

&lt;p&gt;Use why-did-you-render during dev to find unnecessary renders and bloat.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Profile Your App Like a Detective
&lt;/h3&gt;

&lt;p&gt;Don't guess. Measure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools I recommend:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flipper – React DevTools + performance monitoring&lt;/p&gt;

&lt;p&gt;Android Profiler – CPU &amp;amp; memory usage&lt;/p&gt;

&lt;p&gt;Xcode Instruments – for iOS diagnostics&lt;/p&gt;

&lt;p&gt;React DevTools – check component re-renders&lt;/p&gt;

&lt;p&gt;Spend time here. You’ll be surprised where bottlenecks hide.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Use Native Driver in Animations
&lt;/h3&gt;

&lt;p&gt;React Native’s JS thread is fragile — animations that rely on it can easily get choppy. When using Animated, always enable the native driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Animated.timing(animatedValue, {
  toValue: 1,
  duration: 300,
  useNativeDriver: true,
}).start();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or go further and explore Reanimated 3, which is designed to run animations entirely on the native thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Prefer Lightweight Libraries
&lt;/h3&gt;

&lt;p&gt;Every dependency has a cost.&lt;/p&gt;

&lt;p&gt;Here’s what I use in place of heavier tools:&lt;/p&gt;

&lt;p&gt;Zustand or Jotai instead of Redux (for smaller apps)&lt;/p&gt;

&lt;p&gt;react-native-mmkv instead of AsyncStorage&lt;/p&gt;

&lt;p&gt;React Query or SWR instead of hand-rolled fetch logic&lt;/p&gt;

&lt;p&gt;These small shifts have made my apps leaner and faster.&lt;/p&gt;

&lt;p&gt;✅ Final Thoughts&lt;br&gt;
Performance isn’t about perfection — it’s about awareness.&lt;/p&gt;

&lt;p&gt;When you know what to look for, and how React Native works under the hood, it becomes easier to write faster, smoother apps from the start. The good news? You don’t need to be a wizard. You just need the right habits.&lt;/p&gt;

&lt;p&gt;Hope these tips help you avoid the mistakes I made. Got a performance win or horror story? Drop it in the comments — I’d love to hear it!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
