<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>React Native Blog</title>
        <link>https://reactnative.dev/blog</link>
        <description>React Native Blog</description>
        <lastBuildDate>Tue, 24 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Meta Platforms, Inc.</copyright>
        <item>
            <title><![CDATA[React Native Comes to Meta Quest]]></title>
            <link>https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest</link>
            <guid>https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest</guid>
            <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[React Native has always focused on helping developers reuse knowledge across platforms. What started with Android and iOS has steadily expanded to Apple TV, Windows, macOS, and even the web with react-strict-dom. In 2021, the Many Platform Vision post outlined a future where React Native could adapt to new devices and form factors without fragmenting the ecosystem.]]></description>
            <content:encoded><![CDATA[<p>React Native has always focused on helping developers reuse knowledge across platforms. What started with Android and iOS has steadily expanded to Apple TV, Windows, macOS, and even the web with react-strict-dom. In 2021, the <a class="" href="https://reactnative.dev/blog/2021/08/26/many-platform-vision">Many Platform Vision post</a> outlined a future where React Native could adapt to new devices and form factors without fragmenting the ecosystem.</p>
<p>At React Conf 2025, we took another step toward that vision by <a href="https://youtu.be/NiYwlvXsBKw?si=IGl4MiF6QtywVFGL&amp;t=1075" target="_blank" rel="noopener noreferrer" class="">announcing official React Native support for Meta Quest devices</a>. This post focuses on how to get started with React Native on Meta Quest, what works today, and how developers can build and ship VR apps using familiar tools and patterns.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#react-native-on-meta-quest" class="">React Native on Meta Quest</a></li>
<li class=""><a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#getting-started-on-meta-quest" class="">Getting started on Meta Quest</a></li>
<li class=""><a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#development-builds-and-native-features" class="">Development builds and native features</a></li>
<li class=""><a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#platform-specific-setup-and-differences-from-mobile" class="">Platform-specific setup and differences from mobile</a></li>
<li class=""><a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#design-and-ux-considerations-for-vr" class="">Design and UX considerations for VR</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="react-native-on-meta-quest">React Native on Meta Quest<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#react-native-on-meta-quest" class="hash-link" aria-label="Direct link to React Native on Meta Quest" title="Direct link to React Native on Meta Quest" translate="no">​</a></h2>
<figure><img src="https://reactnative.dev/blog/assets/meta-quest-react-native.jpg" alt="React Native app running on Meta Quest headset"><figcaption><p>React Native apps running on Meta Quest.</p></figcaption></figure>
<p>Meta Quest devices run Meta Horizon OS, an Android-based operating system. From a React Native perspective, this means all of the existing Android tooling, build systems, and debugging workflows work with minimal changes. For developers already building React Native apps on Android, much of existing development model carries over.</p>
<p>This aligns with how React Native has expanded to other Android-based environments over time. Rather than introducing a new runtime or development model, Meta Quest builds on the same Android foundation and integrates with React Native's existing abstractions. This allows platform-specific capabilities to be added without fragmenting the framework or requiring a separate approach to development.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="getting-started-on-meta-quest">Getting started on Meta Quest<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#getting-started-on-meta-quest" class="hash-link" aria-label="Direct link to Getting started on Meta Quest" title="Direct link to Getting started on Meta Quest" translate="no">​</a></h2>
<p>This section walks through the basic development workflow on Meta Quest, starting with Expo Go and moving toward development builds and platform-specific configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="step-by-step-run-an-expo-app-on-meta-quest">Step-by-step: Run an Expo app on Meta Quest<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#step-by-step-run-an-expo-app-on-meta-quest" class="hash-link" aria-label="Direct link to Step-by-step: Run an Expo app on Meta Quest" title="Direct link to Step-by-step: Run an Expo app on Meta Quest" translate="no">​</a></h3>
<p>To run an Expo app on Meta Quest, start a standard Expo project, launch the dev server, and open the app through Expo Go on the headset. Beyond a few Meta Horizon OS-specific requirements, the workflow is the same as on Android.</p>
<ol>
<li class="">
<p><strong>Install Expo Go on the headset</strong></p>
<p><a href="https://www.meta.com/en-gb/experiences/expo-go/25322546364000780/" target="_blank" rel="noopener noreferrer" class="">Expo Go is available on the Meta Horizon Store</a> and can be installed directly on Meta Quest devices. It is used for rapid iteration during development.</p>
</li>
<li class="">
<p><strong>Create (or use) an Expo project</strong></p>
<p>If you're starting fresh, create a standard Expo app. No special template is required.</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx create-expo-app@latest my-quest-app</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token builtin class-name" style="color:#fac863">cd</span><span class="token plain"> my-quest-app</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Start the dev server</strong></p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx expo start</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Connect with Quest using Expo Go</strong></p>
<p>Open Expo Go on the headset and scan the QR code displayed by the Expo CLI with the headset camera. The application launches in a new window on the device, allowing live reloading and fast iteration.</p>
</li>
<li class="">
<p><strong>Iterate as usual</strong></p>
<p>Code changes are reflected immediately on the device, following the same edit-refresh cycle used on Android and iOS.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="development-builds-and-native-features">Development builds and native features<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#development-builds-and-native-features" class="hash-link" aria-label="Direct link to Development builds and native features" title="Direct link to Development builds and native features" translate="no">​</a></h2>
<p>Expo Go is sufficient for early development and UI work. When access to native modules or deeper platform integration is required, development builds are used instead. These builds follow the standard Expo development build workflow and run directly on the Quest device.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="platform-specific-setup-and-differences-from-mobile">Platform-specific setup and differences from mobile<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#platform-specific-setup-and-differences-from-mobile" class="hash-link" aria-label="Direct link to Platform-specific setup and differences from mobile" title="Direct link to Platform-specific setup and differences from mobile" translate="no">​</a></h2>
<p>While the overall workflow remains the same, Meta Quest requires a small set of platform-specific adjustments.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="project-configuration-for-meta-horizon-os">Project configuration for Meta Horizon OS<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#project-configuration-for-meta-horizon-os" class="hash-link" aria-label="Direct link to Project configuration for Meta Horizon OS" title="Direct link to Project configuration for Meta Horizon OS" translate="no">​</a></h3>
<p>Meta Quest applications must meet specific requirements to run correctly and to be eligible for store submission. These include platform-specific Android configuration, product flavors, and application metadata.</p>
<p>Expo provides a plugin for Meta Horizon OS that applies these requirements at build time. Using this plugin ensures the project configuration aligns with Meta Quest expectations without manual modification of native files.</p>
<p>Install <code>expo-horizon-core</code> and add it to <code>app.json</code> or <code>app.config.js</code>:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"expo"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"plugins"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        </span><span class="token string" style="color:#8dc891">"expo-horizon-core"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"horizonAppId"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"your-horizon-app-id"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"defaultHeight"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"640dp"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"defaultWidth"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"1024dp"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"supportedDevices"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"quest2|quest3|quest3s"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"disableVrHeadtracking"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token property" style="color:#2aa198">"allowBackup"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Also, change the orientation value:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">   ...</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">   </span><span class="token property" style="color:#2aa198">"orientation"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"default"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">   ...</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Update <code>package.json</code> with Quest-specific scripts:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"scripts"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"android"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"expo run:android --variant mobileDebug"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"quest"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"expo run:android --variant questDebug"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"android:release"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"expo run:android --variant mobileRelease"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"quest:release"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"expo run:android --variant questRelease"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="using-react-native-without-expo">Using React Native without Expo<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#using-react-native-without-expo" class="hash-link" aria-label="Direct link to Using React Native without Expo" title="Direct link to Using React Native without Expo" translate="no">​</a></h3>
<p>Expo provides the easiest way to get started with React Native on Meta Quest. If you prefer to build without a framework, you can also apply the required Meta Horizon OS configuration directly in your Android project.</p>
<p>At a minimum, this includes:</p>
<ul>
<li class="">Creating a Meta Quest-specific build flavor in <code>android/app/build.gradle</code></li>
<li class="">Setting the <code>horizonAppId</code></li>
<li class="">Defining a default panel size in the Android manifest</li>
<li class="">Declaring supported devices (for example: <code>quest2|quest3|quest3s</code>)</li>
<li class="">Removing prohibited permissions</li>
<li class="">Adjusting the minimum supported Android SDK version</li>
<li class="">Adding runtime checks such as <code>isHorizonDevice()</code> and <code>isHorizonBuild()</code></li>
</ul>
<p>To understand the full set of changes, you can inspect the <code>expo-horizon-core</code> plugin implementation and replicate the same configuration manually.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-without-google-play-services">Android without Google Play Services<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#android-without-google-play-services" class="hash-link" aria-label="Direct link to Android without Google Play Services" title="Direct link to Android without Google Play Services" translate="no">​</a></h3>
<p>Meta Horizon OS is built on Android Open Source Project (AOSP), which provides the core Android platform without Google's proprietary services. From a development perspective, this means applications run on standard Android APIs but do not have access to Google Mobile Services such as Play Services or Play Store–specific integrations.</p>
<p>When targeting Meta Quest, applications should be designed to avoid direct dependencies on Google services or to provide platform-specific alternatives where needed.</p>
<p>A list of unsupported dependencies is available in the <a href="https://developers.meta.com/horizon/documentation/android-apps/unsupported-dependencies" target="_blank" rel="noopener noreferrer" class="">Meta Horizon OS documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="permissions-and-device-capabilities">Permissions and device capabilities<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#permissions-and-device-capabilities" class="hash-link" aria-label="Direct link to Permissions and device capabilities" title="Direct link to Permissions and device capabilities" translate="no">​</a></h3>
<p>Some Android permissions and hardware assumptions common on mobile devices do not apply to VR headsets. Cellular features (e.g. SMS), certain sensors (like GPS), and <a href="https://developers.meta.com/horizon/documentation/android-apps/unsupported-permissions/" target="_blank" rel="noopener noreferrer" class="">restricted permissions</a> are either unavailable or prohibited. Projects must explicitly account for these differences during setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="evaluating-library-compatibility">Evaluating library compatibility<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#evaluating-library-compatibility" class="hash-link" aria-label="Direct link to Evaluating library compatibility" title="Direct link to Evaluating library compatibility" translate="no">​</a></h3>
<p>Most React Native libraries work on Meta Quest, but compatibility depends on the assumptions a library makes about the underlying platform. In particular, libraries may rely on mobile-only hardware, touch input, or <a href="https://developers.meta.com/horizon/documentation/android-apps/unsupported-dependencies" target="_blank" rel="noopener noreferrer" class="">services that are not available on Horizon OS</a>.</p>
<p>As a general guideline:</p>
<ul>
<li class="">Libraries that are self-contained and rely only on standard React Native and Android APIs typically work without changes.</li>
<li class="">Libraries that assume touch-only input, mobile-only hardware, or Google Mobile Services require adaptation or conditional usage.</li>
<li class="">Libraries that depend on restricted permissions or unavailable device capabilities are not supported.</li>
</ul>
<p>For some common use cases, such as <a href="https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-location/README.md" target="_blank" rel="noopener noreferrer" class="">location</a> and <a href="https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-notifications/README.md" target="_blank" rel="noopener noreferrer" class="">notifications</a>, Expo provides drop-in replacements for Meta Horizon OS. Other libraries may work as-is or require platform-specific handling depending on their dependencies.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="platform-aware-code-paths">Platform-aware code paths<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#platform-aware-code-paths" class="hash-link" aria-label="Direct link to Platform-aware code paths" title="Direct link to Platform-aware code paths" translate="no">​</a></h3>
<p>Applications targeting both Meta Quest and other platforms should guard platform-specific behavior. Meta Horizon OS provides runtime utilities to detect whether the app is running on a Quest device, allowing unsupported features to be disabled or replaced when necessary.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ExpoHorizon</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'expo-horizon-core'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Check if running on a Horizon device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword control-flow" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token maybe-class-name">ExpoHorizon</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">isHorizonDevice</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token console class-name" style="color:#fac863">console</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">log</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'Running on Meta Horizon OS!'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Check if this is a Horizon build</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword control-flow" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token maybe-class-name">ExpoHorizon</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">isHorizonBuild</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token console class-name" style="color:#fac863">console</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">log</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'This is a Horizon build variant'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Access the Horizon App ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> appId </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token maybe-class-name">ExpoHorizon</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">horizonAppId</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token console class-name" style="color:#fac863">console</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">log</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'Horizon App ID:'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> appId </span><span class="token operator" style="color:#fc929e">??</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'Not configured'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="design-and-ux-considerations-for-vr">Design and UX considerations for VR<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#design-and-ux-considerations-for-vr" class="hash-link" aria-label="Direct link to Design and UX considerations for VR" title="Direct link to Design and UX considerations for VR" translate="no">​</a></h2>
<p>Designing for a head-mounted display introduces constraints that differ from touch-based mobile devices. Interfaces are viewed at a distance, rendered in space, and interacted with using a wider range of input methods.</p>
<p>UI elements generally require larger hit targets, increased spacing, and typography that remains readable across varying distances. These challenges are similar to those encountered on desktop, tablets, and foldable devices, where applications run in resizable windows and layouts must adapt dynamically.</p>
<p>One of the main differences between Meta Quest and Android mobile is input. Instead of relying primarily on touch, Meta Quest applications are commonly controlled through controllers, hand tracking, and optionally mouse and keyboard. Controllers behave more like a pointer device, which introduces interaction patterns that are closer to web and desktop UIs, including hover and focus-based navigation.</p>
<p>React Native's event system and component model can support these interaction patterns, but applications should avoid touch-only assumptions and ensure that UI elements provide clear focus states and predictable navigation when controlled through pointing devices.</p>
<p>Together, these considerations favor responsive layouts and input-agnostic interactions. React Native's layout system and component model provide a solid foundation for building comfortable and usable VR interfaces.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>For more details, check out the <a href="https://developers.meta.com/horizon/documentation/android-apps/design-requirements" target="_blank" rel="noopener noreferrer" class="">official design guidelines</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="examples-and-references">Examples and references<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#examples-and-references" class="hash-link" aria-label="Direct link to Examples and references" title="Direct link to Examples and references" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="reference-project">Reference project<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#reference-project" class="hash-link" aria-label="Direct link to Reference project" title="Direct link to Reference project" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://github.com/callstackincubator/expo-meta-horizon-os-demo" target="_blank" rel="noopener noreferrer" class="">Reference project with all the setup used in this article</a></li>
<li class=""><a href="https://github.com/callstack/react-native-horizonos-example" target="_blank" rel="noopener noreferrer" class="">Callstack Meta Horizon OS showcase app from React Conf</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="learn-more">Learn more<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#learn-more" class="hash-link" aria-label="Direct link to Learn more" title="Direct link to Learn more" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://oss.callstack.com/react-native-meta-horizon-os/" target="_blank" rel="noopener noreferrer" class="">Official Meta Quest documentation</a></li>
<li class=""><a href="https://www.callstack.com/ebooks/react-native-developers-guide-to-meta-horizon-os" target="_blank" rel="noopener noreferrer" class="">React Native Developer's Guide to Meta Horizon OS (ebook)</a></li>
<li class=""><a href="https://blog.swmansion.com/how-to-add-meta-quest-support-to-your-expo-app-68c52778b1fe" target="_blank" rel="noopener noreferrer" class="">How to Add Meta Quest Support to Your Expo Development Builds (article)</a></li>
<li class=""><a href="https://www.callstack.com/podcasts/bringing-react-native-to-vr-on-meta-quest" target="_blank" rel="noopener noreferrer" class="">Bringing React Native to VR on Meta Quest (podcast)</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=r-QL2EuqbdA" target="_blank" rel="noopener noreferrer" class="">React Native on Meta Quest: What We Learned About Building for VR (live stream)</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=24G2tui0Ts8" target="_blank" rel="noopener noreferrer" class="">Getting started with Meta Horizon Development using Expo</a></li>
<li class=""><a href="https://developers.meta.com/horizon/documentation/android-apps/bugs-requests" target="_blank" rel="noopener noreferrer" class="">Feedback channel for platform evolution</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2026/02/24/react-native-comes-to-meta-quest#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>Bringing React Native to new platforms takes more than code. We're grateful to everyone who contributed their time, feedback, and support along the way.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.84 - Hermes V1 by Default]]></title>
            <link>https://reactnative.dev/blog/2026/02/11/react-native-0.84</link>
            <guid>https://reactnative.dev/blog/2026/02/11/react-native-0.84</guid>
            <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're excited to release React Native 0.84!]]></description>
            <content:encoded><![CDATA[<p>Today we're excited to release React Native 0.84!</p>
<p>This release makes Hermes V1 the default JavaScript engine, bringing significant performance improvements to all React Native apps. We've also continued removing the Legacy Architecture on both iOS and Android, and are shipping precompiled iOS binaries by default.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#hermes-v1-as-default">Hermes V1 as Default</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#precompiled-binaries-on-ios-by-default">Precompiled Binaries on iOS by Default</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#legacy-architecture-components-removed">Legacy Architecture Components Removed</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#nodejs-22-minimum">Node.js 22 Minimum</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="hermes-v1-as-default">Hermes V1 as Default<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#hermes-v1-as-default" class="hash-link" aria-label="Direct link to Hermes V1 as Default" title="Direct link to Hermes V1 as Default" translate="no">​</a></h2>
<p><strong>Hermes V1 is now the default JavaScript engine for React Native on both iOS and Android</strong>, following the initial experimental opt-in in React Native 0.82.</p>
<p>Hermes V1 represents the next evolution of the Hermes engine, with significant improvements to both the compiler and VM that deliver measurably better JavaScript performance.</p>
<p><strong>What This Means for Your App</strong></p>
<ul>
<li class=""><strong>Automatic performance gains</strong>: All apps will use Hermes V1 by default, bringing improved execution speed and reduced memory usage.</li>
<li class=""><strong>No migration required</strong>: If you're already using Hermes (the default since 0.70), you'll automatically get Hermes V1. No configuration changes needed.</li>
</ul>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Opting out from Hermes V1</strong></summary><div><div class="collapsibleContent_Fd2D"><p><strong>Package manager override</strong></p><p>Force the installation of the legacy <code>hermes-compiler</code> package in your <code>package.json</code>:</p><div class="theme-tabs-container tabs-container tabList_J5MA"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_l0OV tabs__item--active">npm</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">pnpm</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_wHwb"><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">package.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token property" style="color:#2aa198">"overrides"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"0.15.0"</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">package.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token property" style="color:#2aa198">"resolutions"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"0.15.0"</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">package.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token property" style="color:#2aa198">"pnpm"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"overrides"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"0.15.0"</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div></div></div><p><strong>iOS</strong></p><p>When installing CocoaPods dependencies, pass the <code>RCT_HERMES_V1_ENABLED=0</code> and <code>RCT_USE_PREBUILT_RNCORE=0</code> environment variables.</p><p><strong>Android</strong></p><p>Add <code>hermesV1Enabled=false</code> inside the <code>android/gradle.properties</code> file, and configure the application to <a class="" href="https://reactnative.dev/contributing/how-to-build-from-source#update-your-project-to-build-from-source">build React Native from source</a>.</p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="precompiled-binaries-on-ios-by-default">Precompiled Binaries on iOS by Default<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#precompiled-binaries-on-ios-by-default" class="hash-link" aria-label="Direct link to Precompiled Binaries on iOS by Default" title="Direct link to Precompiled Binaries on iOS by Default" translate="no">​</a></h2>
<p>React Native 0.84 now ships precompiled binaries on iOS by default. Previously introduced as an opt-in, precompiled binaries are now enabled out of the box, significantly reducing build times for iOS apps.</p>
<p>This means you no longer need to compile React Native core from source every time you do a clean build. The precompiled <code>.xcframework</code> binaries are automatically downloaded and used during <code>pod install</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>If you need to build React Native from source (for example, to opt out of Hermes V1), you can disable precompiled binaries by setting <code>RCT_USE_PREBUILT_RNCORE=0</code> when installing pods.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="legacy-architecture-components-removed">Legacy Architecture Components Removed<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#legacy-architecture-components-removed" class="hash-link" aria-label="Direct link to Legacy Architecture Components Removed" title="Direct link to Legacy Architecture Components Removed" translate="no">​</a></h2>
<p>Building on the work started in 0.82 (which made the New Architecture the only runtime option), React Native 0.84 continues removing Legacy Architecture code from both iOS and Android. As described in the <a href="https://github.com/react-native-community/discussions-and-proposals/pull/929" target="_blank" rel="noopener noreferrer" class="">RFC</a>, we're removing several Legacy Architecture classes in each release.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<p>In 0.83, we introduced the experimental <code>RCT_REMOVE_LEGACY_ARCH</code> flag to compile out Legacy Architecture code. In 0.84, this is now the default behaviour — Legacy Architecture code is no longer included in your iOS builds, reducing both build time and app size.</p>
<p>No breakages are expected for apps already on the New Architecture — the Interop Layer code required for compatibility remains in place.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Re-enabling Legacy Architecture code on iOS</strong></summary><div><div class="collapsibleContent_Fd2D"><p>If you need to re-enable Legacy Architecture code in your iOS builds, you'll need to build from source. Install CocoaPods dependencies with the following flags:</p><div class="language-bash codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-bash codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_PREBUILT_RNCORE</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#cb4b16">RCT_REMOVE_LEGACY_ARCH</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><br></span></code></pre></div></div></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Removed Legacy Architecture classes</strong></summary><div><div class="collapsibleContent_Fd2D"><p>The following classes have been removed in this release:</p><div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">LazyReactPackage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">CxxModuleWrapper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">CxxModuleWrapperBase</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">CallbackImpl</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">NotThreadSafeBridgeIdleDebugListener</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">OnBatchCompleteListener</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">ReactCxxErrorHandler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">bridge</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">ReactInstanceManagerInspectorTarget</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">modules</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">debug</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">DidJSUpdateUiDuringFrameDetector</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">devsupport</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">BridgeDevSupportManager</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">uimanager</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">NativeKind</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">uimanager</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">debug</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">NotThreadSafeViewHierarchyUpdateDebugListener</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">uimanager</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">layoutanimation</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">LayoutAnimationController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">com</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">facebook</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">react</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">uimanager</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">layoutanimation</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">LayoutAnimationListener</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="nodejs-22-minimum">Node.js 22 Minimum<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#nodejs-22-minimum" class="hash-link" aria-label="Direct link to Node.js 22 Minimum" title="Direct link to Node.js 22 Minimum" translate="no">​</a></h2>
<p>React Native 0.84 requires <strong>Node.js v22.11 or later</strong>. This bump improves the availability of modern JavaScript features across the ecosystem of React Native tooling.</p>
<p>Make sure to update your Node.js version before upgrading. We recommend using a Node version manager like <a href="https://github.com/nvm-sh/nvm" target="_blank" rel="noopener noreferrer" class="">nvm</a> or <a href="https://github.com/Schniz/fnm" target="_blank" rel="noopener noreferrer" class="">fnm</a> to manage Node versions.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other Changes<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#other-changes" class="hash-link" aria-label="Direct link to Other Changes" title="Direct link to Other Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-1923">React 19.2.3<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#react-1923" class="hash-link" aria-label="Direct link to React 19.2.3" title="Direct link to React 19.2.3" translate="no">​</a></h3>
<p>This release syncs React 19.2.3 into React Native, including the latest fixes and improvements from the React team.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="eslint-v9-flat-config">ESLint v9 Flat Config<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#eslint-v9-flat-config" class="hash-link" aria-label="Direct link to ESLint v9 Flat Config" title="Direct link to ESLint v9 Flat Config" translate="no">​</a></h3>
<p>React Native's ESLint config now supports <a href="https://eslint.org/docs/latest/use/configure/configuration-files" target="_blank" rel="noopener noreferrer" class="">ESLint v9 Flat Config</a>, making it easier to adopt the latest ESLint tooling in your project.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="platform-support">Platform Support<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#platform-support" class="hash-link" aria-label="Direct link to Platform Support" title="Direct link to Platform Support" translate="no">​</a></h3>
<ul>
<li class=""><strong>Image formats</strong>: React Native 0.84 includes support for additional image formats (HEIC and HEIF), making it easier to work with modern camera outputs and image libraries.</li>
<li class=""><strong>PlatformColor</strong>: Enhanced testing and support for <code>PlatformColor</code> in animated interpolations and output ranges.</li>
<li class=""><strong>Keyboard events on Android</strong>: Added <code>onKeyDown</code>/<code>onKeyUp</code> support on Android, enabling keyboard event handling for hardware keyboards and TV remotes.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="accessibility">Accessibility<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#accessibility" class="hash-link" aria-label="Direct link to Accessibility" title="Direct link to Accessibility" translate="no">​</a></h3>
<p>Text components with <code>onPress</code> or <code>onLongPress</code> handlers now automatically receive <code>accessibilityRole="link"</code> for improved accessibility support, ensuring screen readers properly announce interactive text elements.</p>
<p>On Android, significant work has been done to fix accessibility state issues with recycled views — ensuring that <code>isClickable</code> and <code>OnClickListener</code> states are properly reset when views are recycled, preventing screen readers from announcing incorrect states.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="url-api-improvements">URL API Improvements<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#url-api-improvements" class="hash-link" aria-label="Direct link to URL API Improvements" title="Direct link to URL API Improvements" translate="no">​</a></h3>
<p>Added missing standard properties to <code>URL</code> (<code>hash</code>, <code>host</code>, <code>pathname</code>, etc.) and methods to <code>URLSearchParams</code> (<code>get</code>, <code>set</code>, <code>delete</code>, etc.), bringing React Native's URL implementation closer to the web standard. Also fixed a <code>URLSearchParams</code> duplicate entry issue.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios-1">iOS<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#ios-1" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<ul>
<li class="">Fixed a rare <code>EXC_BAD_ACCESS</code> crash in <code>ImageResponseObserverCoordinator</code> by wrapping observers in reference-counted pointers. This changes the object declarations in the <code>RCTImage</code> observer API, which may affect dependent libraries such as <code>react-native-svg</code>.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android-1">Android<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#android-1" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class="">Removed <code>BridgeDevSupportManager</code>.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="c">C++<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#c" class="hash-link" aria-label="Direct link to C++" title="Direct link to C++" translate="no">​</a></h4>
<ul>
<li class=""><code>JSBigString</code> now implements <code>jsi::Buffer</code> directly. The <code>BigStringBuffer</code> indirection has been removed (deprecated for now). Code directly subclassing or depending on <code>BigStringBuffer</code> may need updating.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="js">JS<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#js" class="hash-link" aria-label="Direct link to JS" title="Direct link to JS" translate="no">​</a></h4>
<ul>
<li class="">The legacy Perf and Network tabs have been removed from the in-app Element Inspector, as these features are now available in <a class="" href="https://reactnative.dev/docs/react-native-devtools">React Native DevTools</a>.</li>
</ul>
<p>Read the full list of breaking changes in the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0840" target="_blank" rel="noopener noreferrer" class="">CHANGELOG for 0.84</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="deprecations">Deprecations<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#deprecations" class="hash-link" aria-label="Direct link to Deprecations" title="Direct link to Deprecations" translate="no">​</a></h2>
<p>This release ships two deprecations:</p>
<ul>
<li class=""><strong>Networking:</strong> The <code>XHRInterceptor</code> and <code>WebSocketInterceptor</code> APIs are deprecated. Developer tools should use the Chrome DevTools Protocol (CDP) <code>Network</code> domain instead.</li>
<li class=""><strong>TurboModules</strong>: <code>TurboModuleProviderFunctionType</code> is deprecated.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.84 contains over 650 commits from 95 contributors. Thank you for all your hard work!</p>
<p>We want to send a special thank you to those who shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> for precompiled iOS binaries by default and removing the Legacy Architecture on iOS.</li>
<li class=""><a href="https://github.com/robhogan" target="_blank" rel="noopener noreferrer" class="">Rob Hogan</a> for the Node.js 22 version bump.</li>
<li class=""><a href="https://github.com/fabriziocucci" target="_blank" rel="noopener noreferrer" class="">Fabrizio Cucci</a> for accessibility improvements on Android.</li>
<li class=""><a href="https://github.com/pipopotamasu" target="_blank" rel="noopener noreferrer" class="">@pipopotamasu</a> for ESLint v9 Flat Config support.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-084">Upgrade to 0.84<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#upgrade-to-084" class="hash-link" aria-label="Direct link to Upgrade to 0.84" title="Direct link to Upgrade to 0.84" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.84 is now the latest stable version of React Native and 0.81.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="upgrading">Upgrading<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#upgrading" class="hash-link" aria-label="Direct link to Upgrading" title="Direct link to Upgrading" translate="no">​</a></h4>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a class="" href="https://reactnative.dev/docs/upgrading">Upgrading docs</a>.</p>
<blockquote>
<p><strong>💡 New</strong>: Try the experimental <a href="https://skills.sh/react-native-community/skills/upgrade-react-native" target="_blank" rel="noopener noreferrer" class=""><code>upgrade-react-native</code> AI skill for Community CLI Projects</a>.</p>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="create-a-new-project">Create a new project<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#create-a-new-project" class="hash-link" aria-label="Direct link to Create a new project" title="Direct link to Create a new project" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-text codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject --version latest</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="expo">Expo<a href="https://reactnative.dev/blog/2026/02/11/react-native-0.84#expo" class="hash-link" aria-label="Direct link to Expo" title="Direct link to Expo" translate="no">​</a></h4>
<p>For Expo projects, React Native 0.84 will be available as part of the <code>expo@canary</code> releases.
The next SDK, SDK 56, will be shipped with the next stable release of React Native: 0.85.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.83 - React 19.2, New DevTools features, no breaking changes]]></title>
            <link>https://reactnative.dev/blog/2025/12/10/react-native-0.83</link>
            <guid>https://reactnative.dev/blog/2025/12/10/react-native-0.83</guid>
            <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.83!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.83!</p>
<p>This release includes React 19.2, significant new features for React Native DevTools, and support for the Web Performance and Intersection Observer APIs (Canary). This is also the first React Native release with no user facing breaking changes.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#react-192">React 19.2</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#new-devtools-features">New DevTools features</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#intersection-observers-canary">Intersection Observers (Canary)</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#web-performance-apis-as-stable">Web Performance APIs as stable</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="react-192">React 19.2<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#react-192" class="hash-link" aria-label="Direct link to React 19.2" title="Direct link to React 19.2" translate="no">​</a></h2>
<p>This release includes React 19.2, bringing the new <code>&lt;Activity&gt;</code> and <code>useEffectEvent</code> APIs to React Native.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Important: <a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components" target="_blank" rel="noopener noreferrer" class="">CVE-2025-55182</a></div><div class="admonitionContent_pbrs"><p>At time of release, <code>react-native@0.83.0</code> depends on <code>react@19.2.0</code>, and you might also have seen the recent <a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components" target="_blank" rel="noopener noreferrer" class="">Critical Security Vulnerability in React Server Components</a>.</p><p>We want to stress that <strong>React Native is NOT directly affected by this vulnerability</strong>, as it does not depend on the impacted packages:</p><ul>
<li class=""><code>react-server-dom-webpack</code></li>
<li class=""><code>react-server-dom-parcel</code></li>
<li class=""><code>react-server-dom-turbopack</code></li>
</ul><p><strong>However</strong>, if you are using React Native as part of a <strong>monorepo</strong> where these packages may be present, please check and upgrade them immediately.</p><p>We will update all React dependencies to <code>19.2.1</code> in our next patch release.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="activity"><code>&lt;Activity&gt;</code><a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#activity" class="hash-link" aria-label="Direct link to activity" title="Direct link to activity" translate="no">​</a></h3>
<p><code>&lt;Activity&gt;</code> lets you break your app into "activities" that can be controlled and prioritized. You can use Activity as an alternative to conditionally rendering parts of your app, and it currently supports 2 modes: <code>'visible'</code> and <code>'hidden'</code>.</p>
<ul>
<li class=""><code>hidden</code>: hides the children, unmounts effects, and defers all updates until React has nothing left to work on.</li>
<li class=""><code>visible</code>: shows the children, mounts effects, and allows updates to be processed normally.</li>
</ul>
<p>One interesting feature of trees hidden using <code>&lt;Activity mode='hidden'&gt;</code> is that they preserve their state. So, when they become visible again, they, for example, keep the search status and the selection from a previous user interaction.</p>
<div class="table-wrapper"><table><thead><tr><th>React 19.1.1</th><th>React 19.2.1</th></tr></thead><tbody><tr><td><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/0.83-react-19.2-no-activity-61b910cc3d32753f1432f8d365963dab.gif" width="952" height="1800" class="img_SS3x"></td><td><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/0.83-react-19.2-activity-c374acc50fc57945dd0ef92ab6d119fe.gif" width="952" height="1800" class="img_SS3x"></td></tr></tbody></table></div>
<p>You can read more about <code>&lt;Activity&gt;</code> in the <a href="https://react.dev/reference/react/Activity" target="_blank" rel="noopener noreferrer" class="">React docs</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="useeffectevent"><code>useEffectEvent</code><a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#useeffectevent" class="hash-link" aria-label="Direct link to useeffectevent" title="Direct link to useeffectevent" translate="no">​</a></h3>
<p>One common pattern with <code>useEffect</code> is to notify the app code about some kind of "event" from an external system. The problem with this approach is that a change to any value used inside such an event will cause the surrounding Effect to re-run.</p>
<p>To solve this, most users disable the lint rule and exclude the dependency. But that can lead to bugs since the linter can no longer help you keep the dependencies up to date if you need to update the Effect later.</p>
<p>With <code>useEffectEvent</code>, you can split the "event" part of this logic out of the Effect that emits it.</p>
<p>You can read more about <code>useEffectEvent</code> in the <a href="https://react.dev/reference/react/useEffectEvent" target="_blank" rel="noopener noreferrer" class="">React docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-devtools-features">New DevTools features<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#new-devtools-features" class="hash-link" aria-label="Direct link to New DevTools features" title="Direct link to New DevTools features" translate="no">​</a></h2>
<p>In 0.83 we're excited to deliver some long awaited features and quality of life improvements to React Native DevTools.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="network-and-performance-panels">Network and Performance panels<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#network-and-performance-panels" class="hash-link" aria-label="Direct link to Network and Performance panels" title="Direct link to Network and Performance panels" translate="no">​</a></h3>
<p>Network inspection and performance tracing are two powerful new capabilities in React Native DevTools, available today.</p>
<p><img decoding="async" loading="lazy" alt="Network panel list in React Native DevTools" src="https://reactnative.dev/assets/images/debugging-rndt-network-462cd5e39a5525592501627bb0087747.jpg" width="1600" height="740" class="img_SS3x"></p>
<p><strong>Network inspection</strong>, now available for all React Native apps, allows you to view and understand the network requests made by your app. Logged requests provide detailed metadata such as timings and headers sent/received, as well as response previews. And — for the first time — you can use the Initiator tab to see where in your code a network request originated.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>💡 Network event coverage, Expo support</strong></summary><div><div class="collapsibleContent_Fd2D"><p><strong>Which network events are captured?</strong></p><p>Today, we record all network calls through <code>fetch()</code>, <code>XMLHttpRequest</code>, and <code>&lt;Image&gt;</code> — with support for custom networking libraries, such as Expo Fetch, coming later.</p><p><strong>Expo Network differences</strong></p><p>Because of this, apps using Expo will continue to see the "Expo Network" panel — a separate implementation by the Expo framework which will log these additional request sources but has slightly reduced features.</p><ul>
<li class="">Coverage for Expo-specific network events.</li>
<li class="">No request initiator support.</li>
<li class="">No Performance panel integration.</li>
</ul><p>We're working with Expo to integrate Expo Fetch and third party networking libraries with our new Network inspection pipeline in future releases.</p></div></div></details>
<p><img decoding="async" loading="lazy" alt="A performance trace in React Native DevTools" src="https://reactnative.dev/assets/images/debugging-rndt-performance-084166527768b90dbb936b240707bdcb.jpg" width="1600" height="740" class="img_SS3x"></p>
<p><strong>Performance tracing</strong> allows you to record a performance session within your app to understand how your JavaScript code is running and what operations took the most time. In React Native, we show JavaScript execution, React Performance tracks, Network events, and custom <a href="https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/User_timing" target="_blank" rel="noopener noreferrer" class="">User Timings</a>, rendered in a single performance timeline.</p>
<p>Together with support for the Web Performance APIs in 0.83, this is a powerful feature set providing fine-grained visibility into what might be making your React Native apps slow. We encourage everyone to try out the Performance panel and make it a part of your daily workflow.</p>
<p>Learn more about our newest <a class="" href="https://reactnative.dev/docs/react-native-devtools">React Native DevTools features</a> and <a href="https://react.dev/reference/dev-tools/react-performance-tracks" target="_blank" rel="noopener noreferrer" class="">React Performance tracks</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-desktop-app">New desktop app<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#new-desktop-app" class="hash-link" aria-label="Direct link to New desktop app" title="Direct link to New desktop app" translate="no">​</a></h3>
<p>Previously, React Native DevTools launched in a browser window and required Chrome or Edge to be installed. Today, we're introducing a vastly improved desktop experience with our new bundled desktop app. It features:</p>
<ul>
<li class=""><strong>The same zero-install setup as before</strong>, now with <strong>no web browser requirement</strong>.</li>
<li class=""><strong>Faster launch</strong> via a lightweight and notarized desktop binary. In rare cases where this cannot be downloaded (such as a corporate firewall), we fall back to the previous browser launch flow.</li>
<li class=""><strong>Better windowing</strong>, with improved multitasking on macOS, auto-raise on breakpoint, auto-raise when reconnecting to the same app, and saved window arrangements on relaunch.</li>
<li class=""><strong>Improved reliability</strong> by running DevTools separately from your personal browser profile. In particular, this resolves bug reports we have received about certain preinstalled Chrome extensions causing React Native DevTools to break.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="React Native DevTools icon in the macOS Dock" src="https://reactnative.dev/assets/images/0.83-rndt-desktop-app-99c6ef69aebde93fc5775942e660518c.jpg" width="1600" height="365" class="img_SS3x"></p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="intersection-observers-canary">Intersection Observers (Canary)<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#intersection-observers-canary" class="hash-link" aria-label="Direct link to Intersection Observers (Canary)" title="Direct link to Intersection Observers (Canary)" translate="no">​</a></h2>
<p>As part of our effort to bring web APIs to React Native, we have added support for <a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API" target="_blank" rel="noopener noreferrer" class=""><code>IntersectionObserver</code></a> in the <a href="https://reactnative.dev/docs/next/releases/release-levels#how-to-initialize-react-native-using-canary--experimental" target="_blank" rel="noopener noreferrer" class="">canary release</a> for 0.83.</p>
<p><code>IntersectionObserver</code> allows you to asynchronously observe layout intersections between a target element and its ancestor. Please see our <a href="https://reactnative.dev/docs/next/global-intersectionobserver" target="_blank" rel="noopener noreferrer" class="">API</a> and <a href="https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/webapis/intersectionobserver/__docs__/README.md" target="_blank" rel="noopener noreferrer" class="">implementation docs</a> for more details. We've also included <a href="https://github.com/facebook/react-native/tree/main/packages/rn-tester/js/examples/IntersectionObserver" target="_blank" rel="noopener noreferrer" class="">examples</a> in RNTester.</p>
<p style="text-align:center"><video width="320" controls="" autoplay=""><source type="video/mp4" src="/blog/assets/0.83-intersection-observer.mp4"></video></p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="web-performance-apis-as-stable">Web Performance APIs as stable<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#web-performance-apis-as-stable" class="hash-link" aria-label="Direct link to Web Performance APIs as stable" title="Direct link to Web Performance APIs as stable" translate="no">​</a></h3>
<p>As introduced in 0.82, React Native now implements a subset of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Performance_API" target="_blank" rel="noopener noreferrer" class="">Performance APIs</a> available on Web —&nbsp;now rolled out as stable:</p>
<ul>
<li class=""><a href="https://www.w3.org/TR/hr-time-3/" target="_blank" rel="noopener noreferrer" class="">High Resolution Time</a>: defines <code>performance.now()</code> and <code>performance.timeOrigin</code>.</li>
<li class=""><a href="https://w3c.github.io/performance-timeline/" target="_blank" rel="noopener noreferrer" class="">Performance Timeline</a>: defines <code>PerformanceObserver</code> and methods to access performance entries in the performance object (<code>getEntries()</code>, <code>getEntriesByType()</code>, <code>getEntriesByName()</code>).</li>
<li class=""><a href="https://w3c.github.io/user-timing/" target="_blank" rel="noopener noreferrer" class="">User Timing</a>: defines <code>performance.mark</code> and <code>performance.measure</code>.</li>
<li class=""><a href="https://w3c.github.io/event-timing/" target="_blank" rel="noopener noreferrer" class="">Event Timing API</a>: defines <code>event</code> entry types reported to <code>PerformanceObserver</code>.</li>
<li class=""><a href="https://w3c.github.io/longtasks/" target="_blank" rel="noopener noreferrer" class="">Long Tasks API</a>: defines <code>longtask</code> entry types reported to <code>PerformanceObserver</code>.</li>
</ul>
<p>These APIs allow tracking different aspects of performance in your app, visible in the Performance panel in React Native DevTools, as well as at runtime via <code>PerformanceObserver</code>.</p>
<p><code>PerformanceObserver</code> also works in production builds, opening new opportunities for capturing real world performance metrics in your apps.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental---hermes-v1">Experimental - Hermes V1<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#experimental---hermes-v1" class="hash-link" aria-label="Direct link to Experimental - Hermes V1" title="Direct link to Experimental - Hermes V1" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Hermes logo" src="https://reactnative.dev/assets/images/0.83-hermes-v1-15f50ba6bcc70a8b99e4c3e13bd17ac8.jpg" width="1600" height="298" class="img_SS3x"></p>
<p>Hermes V1 is the next evolution of Hermes, with improvements in the compiler and the VM that significantly boost JavaScript performance.</p>
<p>In React Native 0.82, we released Hermes V1 as an experimental opt-in. And in 0.83, Hermes V1 includes further performance improvements.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>💡 Enabling Hermes V1</strong></summary><div><div class="collapsibleContent_Fd2D"><p><strong>Note</strong>: While Hermes V1 is in the experimental phase, you’ll need to build React Native from source to try it out.</p><p>To try Hermes V1 in your own project, use the following steps:</p><ol>
<li class="">Force your package manager to resolve the experimental version of Hermes V1 compiler package by modifying the corresponding section of your package.json file (note that the current versioning convention is only for the experimental phase of Hermes V1):</li>
</ol><div style="margin-left:var(--ifm-list-left-padding)"><div class="theme-tabs-container tabs-container tabList_J5MA"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_l0OV tabs__item--active">yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">npm</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_wHwb"><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">package.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token property" style="color:#2aa198">"resolutions"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"250829098.0.4"</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">package.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token property" style="color:#2aa198">"overrides"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> </span><span class="token property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"250829098.0.4"</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div></div></div></div><ol start="2">
<li class="">
<p>Enable Hermes V1 for Android by adding hermesV1Enabled=true inside <code>android/gradle.properties</code>:</p>
<div class="language-gradle codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">android/gradle.properties</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-gradle codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">hermesV1Enabled=true</span><br></span></code></pre></div></div>
<p>Also, configure React Native to build from source by editing android/settings.gradle:</p>
<div class="language-gradle codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">android/settings.gradle</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-gradle codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">  includeBuild('../node_modules/react-native') {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      dependencySubstitution {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid"))</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid"))</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:250829098.0.1"))</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  }</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Enable Hermes V1 for iOS by installing pods with <code>RCT_HERMES_V1_ENABLED=1</code> environment variable.</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token constant" style="color:#5a9bcf">RCT_HERMES_V1_ENABLED</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle exec pod install</span><br></span></code></pre></div></div>
<p>Keep in mind that Hermes V1 is not compatible with the precompiled React Native builds, so make sure you don’t use the <code>RCT_USE_PREBUILT_RNCORE</code> flag when installing pods.</p>
</li>
<li class="">
<p>To confirm if your app is running Hermes V1, execute the following code within your app or the DevTools console. This code will return the Hermes version, which should match the version specified in step 1 (250829098.0.1):</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// expecting "250829098.0.1" in Hermes V1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">HermesInternal</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">getRuntimeProperties</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'OSS Release Version'</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
</li>
</ol></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental---compile-out-the-legacy-architecture-on-ios">Experimental - Compile out the Legacy Architecture on iOS<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#experimental---compile-out-the-legacy-architecture-on-ios" class="hash-link" aria-label="Direct link to Experimental - Compile out the Legacy Architecture on iOS" title="Direct link to Experimental - Compile out the Legacy Architecture on iOS" translate="no">​</a></h3>
<p>In this release, we are adding a new flag for iOS that allows you to compile out the Legacy Architecture from the codebase.
If your app is already on the New Architecture, you can try to remove the legacy architecture code by installing your pods with:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token constant" style="color:#5a9bcf">RCT_REMOVE_LEGACY_ARCH</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle exec pod install</span><br></span></code></pre></div></div>
<p>This should reduce both the build time and the size of your app. The improvements depend on how many third party libraries you are using: in our tests, using a new app without dependencies, the build time was reduced from 73.0 seconds to 58.2 seconds, and the app size went from 51.2 Mb to 48.2 Mb.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p><code>RCT_REMOVE_LEGACY_ARCH</code> is not compatible with React Native precompiled binaries. If you are using precompiled binaries, you'll need to reinstall the pods and build the app from source.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental---debug-your-precompiled-binaries-on-ios">Experimental - Debug your precompiled binaries on iOS<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#experimental---debug-your-precompiled-binaries-on-ios" class="hash-link" aria-label="Direct link to Experimental - Debug your precompiled binaries on iOS" title="Direct link to Experimental - Debug your precompiled binaries on iOS" translate="no">​</a></h3>
<p>In this release, we've implemented the ability to debug the React Native code that is shipped with a precompiled binary. This is primarily helpful to library maintainers or if you are developing a native module or a native component.</p>
<p>To debug the binary code shipped with the React Native precompiled binary, follow these steps:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1"># From the ios folder of your project</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod cache clean </span><span class="token parameter variable" style="color:#cb4b16">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod deintegrate</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_RN_DEP</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_PREBUILT_RNCORE</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token assign-left variable" style="color:#cb4b16">RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">open</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">your-project</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain">.xcworkspace</span><br></span></code></pre></div></div>
<p>The magic is done by the <code>RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS</code> flag, which instructs CocoaPods to download the React Native dSYM files and expand them in the proper folder.</p>
<p>At this point, you can put a breakpoint in your app, for example in <code>AppDelegate.swift</code>, and build and run the app from Xcode.</p>
<p>When the application pauses, open the Xcode console and run the LLDB command:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1"># If you are running the app in the simulator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">add-dsym </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">path-to-your-app</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain">/ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64_x86_64-simulator/React.framework/dSYMs/React.framework.dSYM</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1"># If you are running the app on a physical device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">add-dsym </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">path-to-your-app</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain">/ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64/React.framework/dSYMs/React.framework.dSYM</span><br></span></code></pre></div></div>
<p>Now you can step into the React Native code.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<p>We're working hard to make React Native releases more predictable and easier to upgrade. React Native 0.83 is the first release with <strong>no user facing breaking changes</strong>.</p>
<p>If you are on React Native 0.82, you should be able to upgrade your app to React Native 0.83 without any changes to your app code.</p>
<p>To learn more about what we consider a breaking change, have a look at <a class="" href="https://reactnative.dev/docs/releases/versioning-policy#what-is-a-breaking-change">this article</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="deprecations">Deprecations<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#deprecations" class="hash-link" aria-label="Direct link to Deprecations" title="Direct link to Deprecations" translate="no">​</a></h2>
<p>This release ships two deprecations that are Android specific:</p>
<ul>
<li class=""><strong>Networking</strong>: The <code>sendRequestInternal</code> method is being phased out and it is now deprecated.</li>
<li class=""><strong>Animation</strong>: <code>startOperationBatch</code> and <code>finishOperationBatch</code> are now deprecated.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.83 contains over 594 commits from 56 contributors. Thanks for all your hard work!</p>
<p>We want to send a special thank you to those community members that shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/hoxyq" target="_blank" rel="noopener noreferrer" class="">Ruslan Lesiutin</a>, <a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer" class="">Moti Zilberman</a>, and <a href="https://x.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for the React Native DevTools Performance and Network features.</li>
<li class=""><a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer" class="">Moti Zilberman</a> for the React Native DevTools desktop app.</li>
<li class=""><a href="https://github.com/lunaleaps" target="_blank" rel="noopener noreferrer" class="">Luna Wei</a> for Intersection Observers.</li>
<li class=""><a href="https://github.com/rubennorte" target="_blank" rel="noopener noreferrer" class="">Rubén Norte</a> for the Web Performance APIs.</li>
<li class=""><a href="https://github.com/coado" target="_blank" rel="noopener noreferrer" class="">Dawid Małecki</a> and <a href="https://github.com/j-piasecki" target="_blank" rel="noopener noreferrer" class="">Jakub Piasecki</a> for the rollout of Hermes V1.</li>
<li class=""><a href="https://github.com/rsnara" target="_blank" rel="noopener noreferrer" class="">Ramanpreet Nara</a> for the <code>RCT_REMOVE_LEGACY_ARCH</code> flag.</li>
<li class=""><a href="https://github.com/chrfalch" target="_blank" rel="noopener noreferrer" class="">Christian Falch</a> for precompiled iOS binary debugging.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-083">Upgrade to 0.83<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#upgrade-to-083" class="hash-link" aria-label="Direct link to Upgrade to 0.83" title="Direct link to Upgrade to 0.83" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a class="" href="https://reactnative.dev/docs/upgrading">Upgrading docs</a>.</p>
<p>To create a new project:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.83 will be available in SDK 55, which will be released in January 2026.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="supported-versions">Supported versions<a href="https://reactnative.dev/blog/2025/12/10/react-native-0.83#supported-versions" class="hash-link" aria-label="Direct link to Supported versions" title="Direct link to Supported versions" translate="no">​</a></h3>
<p>0.83 is now the latest stable version of React Native and 0.80.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.82 - A New Era]]></title>
            <link>https://reactnative.dev/blog/2025/10/08/react-native-0.82</link>
            <guid>https://reactnative.dev/blog/2025/10/08/react-native-0.82</guid>
            <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're excited to release React Native 0.82: the first React Native that runs entirely on the New Architecture.]]></description>
            <content:encoded><![CDATA[<p>Today we're excited to release React Native 0.82: the first React Native that runs entirely on the New Architecture.</p>
<p>This is a milestone release for React Native and we believe it's the start of a new era. In future versions we will be removing the remaining code from the Legacy Architecture to reduce install size and streamline the codebase.</p>
<p>In addition, 0.82 also ships with an experimental opt-in to a newer version of Hermes called Hermes V1. We’re also enabling several React features by updating the React version to 19.1.1, and shipping support for DOM Node APIs.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#new-architecture-only">New Architecture Only</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#experimental-hermes-v1">Experimental Hermes V1</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#react-1911">React 19.1.1</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#dom-node-apis">DOM Node APIs</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-architecture-only">New Architecture Only<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#new-architecture-only" class="hash-link" aria-label="Direct link to New Architecture Only" title="Direct link to New Architecture Only" translate="no">​</a></h2>
<p>In React Native 0.76 we announced that <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here">The New Architecture</a> became the default architecture of React Native.</p>
<p>Since then, the New Architecture has been tested and refined and we're confident in making it the <strong>only</strong> architecture for this and future versions of React Native.</p>
<p>This means that if you try to set <code>newArchEnabled=false</code> on Android, or if you try to install CocoaPods with <code>RCT_NEW_ARCH_ENABLED=0</code> on iOS, these will be ignored and your app will still run using the New Architecture.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-migrate">How to migrate<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#how-to-migrate" class="hash-link" aria-label="Direct link to How to migrate" title="Direct link to How to migrate" translate="no">​</a></h3>
<p>If you haven’t migrated your project to the New Architecture, we recommend first migrating your project to React Native 0.81 or Expo SDK 54. These are the last versions that allow you to use the Legacy Architecture. They contain warnings and performance improvements specifically to help migrating to the New Architecture.
<br> Then enable the New Architecture in 0.81 and verify that your application is working fine.
<br> Once you're using the New Architecture in 0.81, you can update safely to React Native 0.82 which prevents enabling the Legacy Architecture.</p>
<p>If an incompatible 3rd party dependency is blocking you from migrating to the New Architecture, we recommend you reach out to the library maintainers directly.</p>
<p>If a bug in React Native core is blocking you from migrating, we recommend you reach out to us <a href="https://github.com/facebook/react-native/issues/new/choose" target="_blank" rel="noopener noreferrer" class="">through our issue tracker</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="interop-layers--3p-library-compatibility">Interop Layers &amp; 3P library compatibility<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#interop-layers--3p-library-compatibility" class="hash-link" aria-label="Direct link to Interop Layers &amp; 3P library compatibility" title="Direct link to Interop Layers &amp; 3P library compatibility" translate="no">​</a></h3>
<p>We will keep the interop layers in the codebase for the foreseeable future. All the classes and functions that are required by the interop layers won’t be removed anytime soon. We will share further updates in the future regarding the removal of Interop Layers.</p>
<p>We’ve also verified that the 3P libraries that offer backward compatibility with both architectures will keep on working with 0.82 where New Architecture is the only architecture.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removal-of-legacy-architecture-classes">Removal of Legacy Architecture classes<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#removal-of-legacy-architecture-classes" class="hash-link" aria-label="Direct link to Removal of Legacy Architecture classes" title="Direct link to Removal of Legacy Architecture classes" translate="no">​</a></h3>
<p>To ensure backward compatibility and reduce breaking changes, we are not removing any APIs of the Legacy Architecture from the core of React Native in this version. Removing the Legacy Architecture will allow us to save significant size on the overall bundle size, therefore the removal is scheduled to start from the next version of React Native.</p>
<p>You can find more information in <a href="https://github.com/react-native-community/discussions-and-proposals/pull/929" target="_blank" rel="noopener noreferrer" class="">RFC0929: Removal of the Legacy Architecture of React Native</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-hermes-v1">Experimental Hermes V1<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#experimental-hermes-v1" class="hash-link" aria-label="Direct link to Experimental Hermes V1" title="Direct link to Experimental Hermes V1" translate="no">​</a></h2>
<p>React Native 0.82 adds support for opting into Hermes V1.</p>
<p>Hermes V1 is the next evolution of Hermes. We've been experimenting with it internally in our apps, and it is now time for the community to try it as well. It comes with improvements in the compiler and in the VM that boost Hermes performance.</p>
<p>From initial tests and benchmarks, Hermes V1 outperforms current Hermes in various scenarios. We have seen improvements in bundle loading and TTI. The improvements strongly depend on the details of your apps.</p>
<p>On the <a href="https://github.com/Expensify/App" target="_blank" rel="noopener noreferrer" class="">Expensify app</a>, a real world and complex application, we have seen the following improvements:</p>
<div class="table-wrapper"><table><thead><tr><th>Metric</th><th>Android (low end device)</th><th>iOS</th></tr></thead><tbody><tr><td>Bundle Load Time</td><td>3.2% faster</td><td>9% faster</td></tr><tr><td>Total TTI</td><td>7.6% faster</td><td>2.5% faster</td></tr><tr><td>Content TTI</td><td>7.2% faster</td><td>7.5% faster</td></tr></tbody></table></div>
<p>For Total TTI, we measured the time it takes from bundle loading to when the first screen in the app is rendered and it is interactive.</p>
<p>For Content TTI, we measured the time it takes for a component to be interactive, starting from the first rendering of the component itself.</p>
<p>Hermes V1 does not yet contain JS-to-native compilation (previously known as “Static Hermes”) or the JIT compilation that was <a href="https://www.youtube.com/watch?v=q-xKYA0EO-c" target="_blank" rel="noopener noreferrer" class="">presented during React Native EU 2023</a>. We are still testing these features, and will share more as we make progress.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-enable-hermes-v1">How to enable Hermes V1<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#how-to-enable-hermes-v1" class="hash-link" aria-label="Direct link to How to enable Hermes V1" title="Direct link to How to enable Hermes V1" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>While Hermes V1 is in the experimental phase, you’ll need to build React Native from source to try it out. Once Hermes V1 ships as default in a future React Native version, this restriction will be lifted.</p></div></div>
<p>To try Hermes V1 in your own project, use the following steps:</p>
<ol>
<li class="">Force your package manager to resolve the experimental version of Hermes V1 compiler package by modifying the corresponding section of your <code>package.json</code> file (note that the current versioning convention is only for the experimental phase of Hermes V1):</li>
</ol>
<div class="theme-tabs-container tabs-container tabList_J5MA"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_l0OV tabs__item--active">yarn</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">npm</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_wHwb"><div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token string-property property" style="color:#2aa198">"resolutions"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token string-property property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"250829098.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token string-property property" style="color:#2aa198">"overrides"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token string-property property" style="color:#2aa198">"hermes-compiler"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"250829098.0.1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div></div></div>
<ol start="2">
<li class="">Enable Hermes V1 for Android by adding <code>hermesV1Enabled=true</code> inside the <code>android/gradle.properties</code>:</li>
</ol>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">android/gradle.properties</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">hermesV1Enabled</span><span class="token operator" style="color:#fc929e">=</span><span class="token plain">true</span><br></span></code></pre></div></div>
<p>Also, configure React Native <a href="https://reactnative.dev/contributing/how-to-build-from-source#android" target="_blank" rel="noopener noreferrer" class="">to build from source</a> by editing <code>android/settings.gradle</code>:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">android/settings.gradle</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">includeBuild</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'../node_modules/react-native'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      dependencySubstitution </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token function" style="color:#79b6f2">substitute</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">module</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">"com.facebook.react:react-android"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">using</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">project</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">":packages:react-native:ReactAndroid"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token function" style="color:#79b6f2">substitute</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">module</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">"com.facebook.react:react-native"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">using</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">project</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">":packages:react-native:ReactAndroid"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">          </span><span class="token function" style="color:#79b6f2">substitute</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">project</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">":packages:react-native:ReactAndroid:hermes-engine"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">using</span><span class="token punctuation" style="color:#657b83">(</span><span class="token function" style="color:#79b6f2">module</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">"com.facebook.hermes:hermes-android:250829098.0.1"</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Enable Hermes V1 for iOS by installing pods with <code>RCT_HERMES_V1_ENABLED=1</code> environment variable.</li>
</ol>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">RCT_HERMES_V1_ENABLED</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><br></span></code></pre></div></div>
<p>Keep in mind that Hermes V1 is not compatible with the precompiled React Native builds, so make sure you don’t use the <code>RCT_USE_PREBUILT_RNCORE</code> flag when installing pods.</p>
<ol start="4">
<li class="">To confirm if your app is running Hermes V1, execute the following code within your app or DevTools console. This code will return the Hermes version, which should match the version specified in step 1 (<code>250829098.0.1</code>):</li>
</ol>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// expecting "250829098.0.1" in Hermes V1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token maybe-class-name">HermesInternal</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">getRuntimeProperties</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'OSS Release Version'</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="react-1911">React 19.1.1<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#react-1911" class="hash-link" aria-label="Direct link to React 19.1.1" title="Direct link to React 19.1.1" translate="no">​</a></h2>
<p>This release of React Native ships with the latest React stable: <a href="https://github.com/facebook/react/releases/tag/v19.1.1" target="_blank" rel="noopener noreferrer" class="">React 19.1.1</a>.</p>
<p>This release of React contains full support for owner stacks for React Native. Back in React Native 0.80, when we shipped support for 19.1.0, we <a class="" href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#react-1910">mentioned</a> that owner stacks were not fully supported if you were using the <a href="https://babeljs.io/docs/babel-plugin-transform-function-name" target="_blank" rel="noopener noreferrer" class=""><code>@babel/plugin-transform-function-name</code></a> Babel plugin. This release lifts this restriction and enables owner stacks for all React Native users.</p>
<div class="table-wrapper"><table><thead><tr><th>BEFORE</th><th>AFTER</th></tr></thead><tbody><tr><td><center><img decoding="async" loading="lazy" alt="Example error thrown without Owner Stacks" src="https://reactnative.dev/assets/images/0.82-owners-stack-before-bf24fa9bc9dd697b9200eb010ff02695.png" width="251" height="512" class="img_SS3x"></center></td><td><center><img decoding="async" loading="lazy" alt="Example error thrown with Owner Stacks" src="https://reactnative.dev/assets/images/0.82-owners-stack-after-ed600840df30d9908efafb13dd595829.png" width="252" height="512" class="img_SS3x"></center></td></tr></tbody></table></div>
<p>React 19.1.1 also improves the reliability of <a href="https://react.dev/reference/react/useDeferredValue" target="_blank" rel="noopener noreferrer" class=""><code>useDeferredValue</code></a> and <a href="https://react.dev/reference/react/startTransition" target="_blank" rel="noopener noreferrer" class=""><code>startTransition</code></a> in a Suspense boundary for React Native. These are essential React features, designed to boost app responsiveness. Previously both were wrongly showing the fallback component when used together with a Suspense boundary on React Native. With React 19.1.1, they now consistently perform as expected on React Native, aligning their behavior with Web.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="dom-node-apis">DOM Node APIs<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#dom-node-apis" class="hash-link" aria-label="Direct link to DOM Node APIs" title="Direct link to DOM Node APIs" translate="no">​</a></h2>
<p>Starting from React Native 0.82, native components will provide DOM-like nodes via refs.</p>
<p>Before, native components provided React Native-specific objects with just a handful of methods like <code>measure</code> and <code>setNativeProps</code>. After this release, they will provide <a href="https://reactnative.dev/docs/element-nodes" target="_blank" rel="noopener noreferrer" class="">nodes implementing a subset of the DOM API</a> to traverse the UI tree, measure layout, and more as on Web. For example:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">MyComponent</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> ref </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useRef</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">useEffect</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> element </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">current</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token comment" style="color:#93a1a1">// New methods</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">parentNode</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">parentElement</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">childNodes</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">children</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> bounds </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">getBoundingClientRect</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> doc </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">ownerDocument</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> maybeElement </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> doc</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">getElementById</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'some-view'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token comment" style="color:#93a1a1">// Legacy methods are still available</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    element</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">measure</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">x</span><span class="token parameter punctuation" style="color:#657b83">,</span><span class="token parameter"> y</span><span class="token parameter punctuation" style="color:#657b83">,</span><span class="token parameter"> width</span><span class="token parameter punctuation" style="color:#657b83">,</span><span class="token parameter"> height</span><span class="token parameter punctuation" style="color:#657b83">,</span><span class="token parameter"> pageX</span><span class="token parameter punctuation" style="color:#657b83">,</span><span class="token parameter"> pageY</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token comment" style="color:#93a1a1">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">ref</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Additionally, this will expose access to leaf <a href="https://reactnative.dev/docs/text-nodes" target="_blank" rel="noopener noreferrer" class="">text nodes</a> (created by the <code>Text</code> component) and <a href="https://reactnative.dev/docs/document-nodes" target="_blank" rel="noopener noreferrer" class="">document nodes</a> representing React Native root nodes.</p>
<p>This is a backwards compatible change, as the new nodes will continue implementing the legacy methods (like <code>measure</code>).</p>
<p>For more information, please check our <a href="https://reactnative.dev/docs/nodes" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="web-performance-apis-canary">Web Performance APIs (Canary)<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#web-performance-apis-canary" class="hash-link" aria-label="Direct link to Web Performance APIs (Canary)" title="Direct link to Web Performance APIs (Canary)" translate="no">​</a></h3>
<p>React Native now implements a subset of the performance APIs available on Web:</p>
<ul>
<li class=""><a href="https://www.w3.org/TR/hr-time-3/" target="_blank" rel="noopener noreferrer" class="">High Resolution Time</a>: defines <code>performance.now()</code> and <code>performance.timeOrigin</code>.</li>
<li class=""><a href="https://w3c.github.io/performance-timeline/" target="_blank" rel="noopener noreferrer" class="">Performance Timeline</a>: defines <code>PerformanceObserver</code> and methods to access performance entries in the performance object (<code>getEntries()</code>, <code>getEntriesByType()</code>, <code>getEntriesByName()</code>).</li>
<li class=""><a href="https://w3c.github.io/user-timing/" target="_blank" rel="noopener noreferrer" class="">User Timing</a>: defines <code>performance.mark</code> and <code>performance.measure</code>.</li>
<li class=""><a href="https://w3c.github.io/event-timing/" target="_blank" rel="noopener noreferrer" class="">Event Timing API</a>: defines <code>event</code> entry types reported to <code>PerformanceObserver</code>.</li>
<li class=""><a href="https://w3c.github.io/longtasks/" target="_blank" rel="noopener noreferrer" class="">Long Tasks API</a>: defines <code>longtask</code> entry types reported to <code>PerformanceObserver</code>.</li>
</ul>
<p>They allow tracking different aspects of performance in your app at runtime (for telemetry) and they will be visible in the performance panel in React Native DevTools (available in a future version of React Native).</p>
<p>They are currently <strong>available only in the <a href="https://reactnative.dev/docs/releases/release-levels" target="_blank" rel="noopener noreferrer" class="">canary release level</a></strong>, and will be released as stable in a future version of React Native.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="optimized-debug-build-type-for-android">Optimized Debug Build Type for Android<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#optimized-debug-build-type-for-android" class="hash-link" aria-label="Direct link to Optimized Debug Build Type for Android" title="Direct link to Optimized Debug Build Type for Android" translate="no">​</a></h3>
<p>Starting with React Native 0.82, you will be able to use the <code>debugOptimized</code> build type to speed up your development experience.</p>
<p>Historically, Android creates two default build variants:</p>
<ul>
<li class=""><code>debug</code>, used by default when developing and that allows you to connect to the various debugger tools such as React Native DevTools, Metro, the Android JVM and C++ debugger</li>
<li class=""><code>release</code>, used when shipping your application to production. This is fully optimized, with obfuscation and optimization that will make debugging harder.</li>
</ul>
<p>As most React Native developers won’t need to use the C++ debugger when developing, we introduced the <code>debugOptimized</code> build type.</p>
<p>With <code>debugOptimized</code> your animations and re-rendering will be faster, because you’re running a React Native build with several C++ optimizations enabled. At the same time you will still be able to use React Native Dev Tools to debug your JavaScript code.</p>
<p>When using <code>debugOptimized</code>, you won’t be able to use the C++ native debuggers, but you will still be able to use it if you use the debug build type.</p>
<p>To run the <code>debugOptimized</code> variant for your app you can invoke:</p>
<div class="theme-tabs-container tabs-container tabList_J5MA"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_l0OV tabs__item--active">Community CLI</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_l0OV">Expo</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_wHwb"><div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx react</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">native run</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">android </span><span class="token operator" style="color:#fc929e">--</span><span class="token plain">mode debugOptimized</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_wHwb" hidden=""><div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx expo run</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain">android </span><span class="token operator" style="color:#fc929e">--</span><span class="token plain">variant debugOptimized</span><br></span></code></pre></div></div></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>The <code>debugOptimized</code> build type has also been backported to React Native 0.81 and Expo SDK 54.</p></div></div>
<p>You can see the <code>debugOptimized</code> in action in these samples where we’re rendering several animations on screens.</p>
<p>The build running <code>debug</code> is running at ~20FPS while the <code>debugOptimized</code> one is running at ~60FPS:</p>
<div class="table-wrapper"><table><thead><tr><th><code>debug</code></th><th><code>debugOptimized</code></th></tr></thead><tbody><tr><td><img decoding="async" loading="lazy" alt="Example build running with debug" src="https://reactnative.dev/assets/images/0.82-debug-b85b9cfcbd8b7c2f86f8bea40be8edd1.gif" width="720" height="1280" class="img_SS3x"></td><td><img decoding="async" loading="lazy" alt="Example build running with debugOptimized" src="https://reactnative.dev/assets/images/0.82-debug-optimized-42824de1774ee3794888eb24203f56e2.gif" width="720" height="1280" class="img_SS3x"></td></tr></tbody></table></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="uncaught-promise-rejections-will-now-raise-consoleerror">Uncaught promise rejections will now raise <code>console.error</code><a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#uncaught-promise-rejections-will-now-raise-consoleerror" class="hash-link" aria-label="Direct link to uncaught-promise-rejections-will-now-raise-consoleerror" title="Direct link to uncaught-promise-rejections-will-now-raise-consoleerror" translate="no">​</a></h3>
<p>Following the <a class="" href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#improved-reporting-of-uncaught-javascript-errors">improvement of reporting uncaught JavaScript errors</a> in the previous version, we will now be reporting uncaught promises through that mechanism as well:</p>
<p><img decoding="async" loading="lazy" alt="Example of a promise rejection reported to console" src="https://reactnative.dev/assets/images/0.82-uncaught-promise-rejection-report-9b6e4e11cc1db946a1ebd377a54a21cc.png" width="512" height="156" class="img_SS3x"></p>
<p>Due to a bug, these were completely swallowed and ignored previously, so please expect some pre-existing errors to surface after upgrading to React Native 0.81. For that reason, previously pre-existing errors might also surface in JavaScript errors reported to your backend, and create a surge in new reports.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="general">General<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#general" class="hash-link" aria-label="Direct link to General" title="Direct link to General" translate="no">​</a></h4>
<ul>
<li class="">Move <code>ReactNativeFeatureFlags</code> to <code>src/private</code>
<ul>
<li class="">In general you should not depend on <code>ReactNativeFeatureFlags</code> at all as that is a private API.</li>
</ul>
</li>
<li class="">Type of <code>Appearance.setColorScheme()</code> has been updated to no longer accept a nullable value<!-- -->
<ul>
<li class="">Use 'unspecified' instead of null/undefined in the edge case that the color scheme needs to be reset.</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<ul>
<li class="">Migrated <code>RCTDisplayLink</code> away from legacy api <code>RCTModuleData</code> as we plan to remove it in the future.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class="">Class <code>com.facebook.react.bridge.JSONArguments</code> is removed as was accidentally <code>public</code></li>
<li class="">Deprecate <code>MessageQueueThreadPerfStats</code>
<ul>
<li class="">We deprecated this API and replaced it with stub. You should not rely on stats from this API anymore as the provided stats were not reliable</li>
</ul>
</li>
<li class="">Bump Gradle from 8.x to 9.0.0<!-- -->
<ul>
<li class="">List of all the changes in the next major stable version of Gradle 9.0.0 is available <a href="https://gradle.org/whats-new/gradle-9/" target="_blank" rel="noopener noreferrer" class="">here</a> but we expect no impact at all to users</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="c">C++<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#c" class="hash-link" aria-label="Direct link to C++" title="Direct link to C++" translate="no">​</a></h4>
<ul>
<li class="">Delete backward compatibility headers for <code>CallbackWrapper.h</code> / <code>LongLivedObject.h</code>
<ul>
<li class="">The correct include for those headers is <code>#include &lt;react/bridging/LongLivedObject.h&gt;</code> and <code>#include &lt;react/bridging/CallbackWrapper.h&gt;</code>.</li>
<li class="">You should not use the old includes under <code>#import &lt;ReactCommon/….h&gt;</code></li>
</ul>
</li>
</ul>
<p>Read the full list of breaking changes in the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0820" target="_blank" rel="noopener noreferrer" class="">CHANGELOG for 0.82</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.82 contains over 868 commits from 93 contributors. Thanks for all your hard work!</p>
<p>We want to send a special thank you to those community members that shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/coado" target="_blank" rel="noopener noreferrer" class="">Dawid Małecki</a> and <a href="https://github.com/j-piasecki" target="_blank" rel="noopener noreferrer" class="">Jakub Piasecki</a> for the help in rolling out Hermes V1.</li>
<li class=""><a href="https://github.com/krystofwoldrich" target="_blank" rel="noopener noreferrer" class="">Krystof Woldrich</a> for the support with fixing the swallowing of uncaught promise rejections.</li>
<li class=""><a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> for the support with writing the React 19.1.1 and Hermes V1 paragraph above.</li>
<li class=""><a href="https://github.com/rubennorte" target="_blank" rel="noopener noreferrer" class="">Rubén Norte</a> for the support with writing the DOM API and Performance API paragraphs.</li>
<li class=""><a href="https://github.com/tomekzaw/" target="_blank" rel="noopener noreferrer" class="">Tomasz Zawadzki</a> for the support with the <code>debugOptimized</code> benchmarking.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-082">Upgrade to 0.82<a href="https://reactnative.dev/blog/2025/10/08/react-native-0.82#upgrade-to-082" class="hash-link" aria-label="Direct link to Upgrade to 0.82" title="Direct link to Upgrade to 0.82" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a class="" href="https://reactnative.dev/docs/upgrading">upgrading to new versions docs</a>.</p>
<p>To create a new project:</p>
<div class="language-bash codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-bash codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.82 will be available as part of the expo@canary releases.</p>
<p>The next SDK, SDK 55, will be shipped with the next stable release of React Native: 0.83.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.82 is now the latest stable version of React Native and 0.79.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.81 - Android 16 support, faster iOS builds, and more]]></title>
            <link>https://reactnative.dev/blog/2025/08/12/react-native-0.81</link>
            <guid>https://reactnative.dev/blog/2025/08/12/react-native-0.81</guid>
            <pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.81!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.81!</p>
<p>This ships with support for Android 16 (API level 36) and includes a variety of other stability improvements and bugfixes, as well as experimental support for faster iOS builds using precompilation.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#android-16-support">Android 16 support</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#safeareaview-deprecation">SafeAreaView deprecation</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#community-maintained-javascriptcore-support">Community-maintained JavaScriptCore support</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#experimental-precompiled-ios-builds">Experimental Precompiled iOS builds</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-16-support">Android 16 support<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#android-16-support" class="hash-link" aria-label="Direct link to Android 16 support" title="Direct link to Android 16 support" translate="no">​</a></h3>
<p>Android apps built with React Native 0.81 will now default to targeting <strong>Android 16</strong> (API level 36).</p>
<p>As previously announced by Google, Android 16 requires that <a href="https://developer.android.com/develop/ui/views/layout/edge-to-edge" target="_blank" rel="noopener noreferrer" class="">apps are displayed edge-to-edge</a> with no support for <a href="https://developer.android.com/about/versions/16/behavior-changes-16" target="_blank" rel="noopener noreferrer" class="">opting out</a>.</p>
<p>To support this, we are deprecating the <code>&lt;SafeAreaView&gt;</code> component <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/827" target="_blank" rel="noopener noreferrer" class="">as previously announced</a> in favor of alternatives. <a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#safeareaview-deprecation" class="">See below</a> which will provide better edge-to-edge support.</p>
<p>We are also adding a new gradle property <code>edgeToEdgeEnabled</code> to let you choose if you wish to enable edge-to-edge on all supported Android versions below 16.</p>
<p><a href="https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture" target="_blank" rel="noopener noreferrer" class="">Predictive back gesture</a> is now enabled by default for apps targeting Android 16. The <a href="https://reactnative.dev/docs/backhandler" target="_blank" rel="noopener noreferrer" class="">BackHandler</a> API should continue to work as before for most use cases. However, if your app relies on custom native code for back handling (such as overriding the <code>onBackPressed()</code> method), you may need to manually migrate your code or <a href="https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture#opt-out" target="_blank" rel="noopener noreferrer" class="">temporarily opt-out</a>. Please test your app’s back navigation thoroughly after upgrading.</p>
<p>Google now expects apps to support <a href="https://developer.android.com/develop/ui/compose/layouts/adaptive" target="_blank" rel="noopener noreferrer" class="">adaptive layouts</a> on large screen devices, regardless of orientation or size restrictions. While you can opt-out for now, it’s recommended to test and update your app for responsive UI on large screens before Android 17.</p>
<p>Starting November 1, 2025, all Google Play app submissions must meet the 16 KB page size requirement for native binaries. This applies to new apps and updates targeting Android 15+ devices. <strong>React Native is already 16KB page size compliant</strong>. Ensure all your native code and third-party libraries are compliant as well.</p>
<p>For more details on Android 16 changes and migration steps, refer to this <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/921" target="_blank" rel="noopener noreferrer" class="">post in the discussions-and-proposals</a> repository.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="safeareaview-deprecation">SafeAreaView deprecation<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#safeareaview-deprecation" class="hash-link" aria-label="Direct link to SafeAreaView deprecation" title="Direct link to SafeAreaView deprecation" translate="no">​</a></h3>
<p>The built-in <code>&lt;SafeAreaView&gt;</code> component was originally designed to provide <strong>limited, iOS-only support</strong> for keeping content in the “safe areas” of the screen (away from camera notches, rounded corners, etc). It is not compatible with edge-to-edge rendering on Android, and does not permit customization beyond padding. As a result, many apps have opted for more portable and flexible solutions, such as <code><a href="https://appandflow.github.io/react-native-safe-area-context/" target="_blank" rel="noopener noreferrer" class="">react-native-safe-area-context</a></code>.</p>
<p>In React Native 0.81, the legacy <code>&lt;SafeAreaView&gt;</code> component is deprecated, and you will see warnings in React Native DevTools if your app uses it.</p>
<p>It will be removed in a future version of React Native. We recommend that you migrate to <code>react-native-safe-area-context</code> or a similar library to ensure your app looks its best across all platforms.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="community-maintained-javascriptcore-support">Community-maintained JavaScriptCore support<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#community-maintained-javascriptcore-support" class="hash-link" aria-label="Direct link to Community-maintained JavaScriptCore support" title="Direct link to Community-maintained JavaScriptCore support" translate="no">​</a></h3>
<p><a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#jsc-moving-to-community-package" target="_blank" rel="noopener noreferrer" class="">As we announced last year</a>, support for the JavaScriptCore (JSC) engine has moved to a <a href="https://github.com/react-native-community/javascriptcore" target="_blank" rel="noopener noreferrer" class="">community-maintained package</a> that is released separately from React Native itself. In React Native 0.81, we're removing the built-in version of JavaScriptCore. All apps that require JavaScriptCore should now use the community package in order to upgrade to 0.81. <a href="https://github.com/react-native-community/javascriptcore#installation" target="_blank" rel="noopener noreferrer" class="">Read the installation instructions</a> for the details.</p>
<p>This change does not affect apps that are using Hermes.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-precompiled-ios-builds">Experimental Precompiled iOS builds<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#experimental-precompiled-ios-builds" class="hash-link" aria-label="Direct link to Experimental Precompiled iOS builds" title="Direct link to Experimental Precompiled iOS builds" translate="no">​</a></h3>
<p>React Native 0.81 introduces precompiled iOS builds, cutting compile times by up to 10x in projects where React Native is the primary dependency. This is the result of a collaboration between Expo and Meta, and expands on <a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#experimental---react-native-ios-dependencies-are-now-prebuilt" target="_blank" rel="noopener noreferrer" class="">work we previously shipped in React Native 0.80</a>.</p>
<p>This feature is still experimental, but we are hoping to enable it for all apps in a future release. If you’d like to try precompiled builds in your own app, you can enable them by specifying the following environment variables when you run <code>pod install</code>:</p>
<div class="language-bash codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-bash codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_RN_DEP</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_PREBUILT_RNCORE</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><br></span></code></pre></div></div>
<p>Please provide feedback in <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/923" target="_blank" rel="noopener noreferrer" class="">this GitHub discussion</a>.</p>
<p>There are two limitations we are already aware of, and are working to resolve:</p>
<ul>
<li class="">In precompiled builds, you cannot debug and step into React Native's internals. You can still debug your <em>own</em> native code while using a precompiled version of React Native.</li>
<li class="">Prebuilds are not supported in Xcode 26 Beta, because the IDE builds all targets with <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes#Resolved-Issues-in-Xcode-26-Beta:~:text=Starting%20from%20Xcode%2026%2C%20Swift%20explicit%20modules%20will%20be%20the%20default%20mode%20for%20building%20all%20Swift%20targets" target="_blank" rel="noopener noreferrer" class="">Swift explicit modules</a> enabled. To use precompiled builds with Xcode 26, set the <code>SWIFT_ENABLE_EXPLICIT_MODULES</code> flag to <code>NO</code> in your Xcode project. We will address this in an upcoming patch release.</li>
</ul>
<p>You can read more about this feature in Expo’s full blog post, <a href="https://expo.dev/blog/precompiled-react-native-for-ios" target="_blank" rel="noopener noreferrer" class="">Precompiled React Native for iOS: Faster builds are coming in 0.81</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="minimum-nodejs-bumped-to-20">Minimum Node.js bumped to 20<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#minimum-nodejs-bumped-to-20" class="hash-link" aria-label="Direct link to Minimum Node.js bumped to 20" title="Direct link to Minimum Node.js bumped to 20" translate="no">​</a></h3>
<p>React Native now requires <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer" class="">Node.js</a> version 20.19.4 (the latest <a href="https://nodejs.org/en/about/previous-releases" target="_blank" rel="noopener noreferrer" class="">Maintenance LTS</a> version at the time of writing) or higher. You may need to upgrade Node.js in your development or CI environment when you upgrade to React Native 0.81.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="minimum-xcode-bumped-to-161">Minimum Xcode bumped to 16.1<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#minimum-xcode-bumped-to-161" class="hash-link" aria-label="Direct link to Minimum Xcode bumped to 16.1" title="Direct link to Minimum Xcode bumped to 16.1" translate="no">​</a></h3>
<p>React Native now requires <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-16_1-release-notes" target="_blank" rel="noopener noreferrer" class="">Xcode 16.1</a> or higher to build iOS projects. You may need to upgrade Xcode in your development or CI environment when you upgrade to React Native 0.81.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="metro-better-support-for-advanced-configuration-in-community-cli-projects">Metro: Better support for advanced configuration in Community CLI projects<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#metro-better-support-for-advanced-configuration-in-community-cli-projects" class="hash-link" aria-label="Direct link to Metro: Better support for advanced configuration in Community CLI projects" title="Direct link to Metro: Better support for advanced configuration in Community CLI projects" translate="no">​</a></h3>
<p>Metro now respects the <code><a href="https://metrobundler.dev/docs/configuration#resolverequest" target="_blank" rel="noopener noreferrer" class="">resolveRequest</a></code> and <code><a href="https://metrobundler.dev/docs/configuration/#getmodulesrunbeforemainmodule" target="_blank" rel="noopener noreferrer" class="">getModulesRunBeforeMainModule</a></code> options if specified in the <code>metro.config.js</code> file of a React Native Community CLI project. Previously, setting them would have no effect. If you have custom values for these options in your <code><a href="https://metrobundler.dev/docs/configuration/" target="_blank" rel="noopener noreferrer" class="">metro.config.js</a></code> file, you may need to delete them in order to restore the previous behavior.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="improved-reporting-of-uncaught-javascript-errors">Improved reporting of uncaught JavaScript errors<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#improved-reporting-of-uncaught-javascript-errors" class="hash-link" aria-label="Direct link to Improved reporting of uncaught JavaScript errors" title="Direct link to Improved reporting of uncaught JavaScript errors" translate="no">​</a></h3>
<p>React Native DevTools now shows the original message and stack trace of uncaught JavaScript errors, as well as the error’s <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause" target="_blank" rel="noopener noreferrer" class="">cause</a> if any, and an <a href="https://react.dev/reference/react/captureOwnerStack#owner-stack-vs-component-stack" target="_blank" rel="noopener noreferrer" class="">Owner Stack</a> for errors thrown by components. This makes errors easier to debug and fix.</p>
<p><img decoding="async" loading="lazy" alt="Example error including a cause and Owner Stack" src="https://reactnative.dev/assets/images/0.81-improved-uncaught-error-fa95330ee5a41739cc7604a21e03be8b.png" width="1172" height="359" class="img_SS3x"></p>
<p>If you are logging JavaScript errors to your backend or to a third-party error reporting service, this may affect the logs you see after upgrading to React Native 0.81 (for example: you might see more thrown errors that used to be reported via <code>console.error</code>), and you may need to update some backend logic accordingly.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="rn_serializable_state-and-c-flags"><code>RN_SERIALIZABLE_STATE</code> and C++ flags.<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#rn_serializable_state-and-c-flags" class="hash-link" aria-label="Direct link to rn_serializable_state-and-c-flags" title="Direct link to rn_serializable_state-and-c-flags" translate="no">​</a></h3>
<p>In this version of React Native, we introduced a new macro called <code>RN_SERIALIZABLE_STATE</code> to support serializable state for the Components on New Architecture.</p>
<p>If you’re a library author and you have a <strong>custom</strong> <code>CMakeLists.txt</code> file, you will need to specify this macro in your CMakeLists.txt file or your C++ code could fail to compile.</p>
<p>To support this, we introduce a new CMake function called <code>target_compile_reactnative_options</code> which will take care of setting up this macro and all the necessary C++ flags for you. You can invoke it as such in your CMakeLists file:</p>
<div class="language-cmake codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-cmake codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">target_compile_reactnative_options(myLibraryName PRIVATE)</span><br></span></code></pre></div></div>
<p>You can see an example of <a href="https://github.com/software-mansion/react-native-screens/pull/3114/commits/b4d283c8fc65e36ec60726fd7513735ccc7e1fe9" target="_blank" rel="noopener noreferrer" class="">how react-native-screens has set up this macro</a>.</p>
<p>This change will affect only more advanced and complex libraries. If your library is using codegen and you don’t have a custom CMake file, you won’t be affected by this change.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<p>This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting:</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class="">We made several classes internal. Those classes are not part of the public API and should not be accessed. We already notified or submitted patches to the affected libraries:<!-- -->
<ul>
<li class=""><code>com.facebook.react.fabric.mounting.MountingManager</code></li>
<li class=""><code>com.facebook.react.views.text.TextLayoutManager</code></li>
</ul>
</li>
<li class="">We moved the <code>textAlignVertical</code> <a href="https://github.com/facebook/react-native/blob/841866c35401ae05fa9c6a2a3e9b42714bbd291e/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h#L83" target="_blank" rel="noopener noreferrer" class="">native prop</a> from <code>TextAttribute.h</code> to <code>ParagraphAttribute.h</code>
<ul>
<li class="">The prop <code>textAlignVertical</code> only affects the top most text view (paragraph view). Yet, it exists in text attribute props nonetheless. To better reflect this platform limitation it was moved to paragraph props.</li>
<li class="">This change is <strong>not</strong> affecting the JS API of the <code>&lt;Text&gt;</code> component.</li>
<li class="">You will be affected by this change only if you implement a Fabric component that interacts with the C++ Text API.</li>
<li class="">If you’re affected by this change, you can replace <code>TextAttributes.h</code> with <code>ParagraphAttribute.h</code> in your code</li>
</ul>
</li>
</ul>
<p>Read the full list of breaking changes <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0810" target="_blank" rel="noopener noreferrer" class="">in the CHANGELOG for 0.81</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.81 contains over 1110 commits from 110 contributors. Thanks for all your hard work!</p>
<p>We want to send a special thank you to those community members that shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/chrfalch" target="_blank" rel="noopener noreferrer" class="">Christian Falch</a> for the amazing work on precompiled iOS builds. </li>
<li class=""><a href="https://github.com/zoontek" target="_blank" rel="noopener noreferrer" class="">Mathieu Acthernoene</a> for crucial contributions to Android edge-to-edge support</li>
<li class=""><a href="https://github.com/kikoso" target="_blank" rel="noopener noreferrer" class="">Enrique López-Mañas</a> and for helping test Android 16 integration and the SafeAreaView deprecation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-081">Upgrade to 0.81<a href="https://reactnative.dev/blog/2025/08/12/react-native-0.81#upgrade-to-081" class="hash-link" aria-label="Direct link to Upgrade to 0.81" title="Direct link to Upgrade to 0.81" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx </span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">react</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">native</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">community</span><span class="token operator" style="color:#fc929e">/</span><span class="token plain">cli</span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">latest</span><span class="token plain"> init </span><span class="token maybe-class-name">MyProject</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">--</span><span class="token plain">version latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.81 will be supported in the upcoming Expo SDK 54 as the default version of React Native.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.81 is now the latest stable version of React Native and 0.78.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.80 - React 19.1, JS API Changes, Freezing Legacy Arch and much more]]></title>
            <link>https://reactnative.dev/blog/2025/06/12/react-native-0.80</link>
            <guid>https://reactnative.dev/blog/2025/06/12/react-native-0.80</guid>
            <pubDate>Thu, 12 Jun 2025 16:01:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.80!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.80!</p>
<p>This release brings the version of React we ship inside React Native to the latest stable available: 19.1.0.</p>
<p>We’re also shipping a series of stability improvements to our JS API: deep imports will now fire a warning and we’re offering a new opt-in Strict TypeScript API which offers types that are more accurate and safer to use.</p>
<p>Moreover, the Legacy Architecture of React Native is now officially frozen, and you’ll start seeing warnings for APIs that will stop working once we fully sunset the Legacy Architecture.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#javascript-deep-imports-deprecation">JavaScript deep imports deprecation</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#legacy-architecture-freezing--warnings">Legacy Architecture Freezing &amp; Warnings</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#react-1910">React 19.1.0</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#experimental---react-native-ios-dependencies-are-now-prebuilt">Experimental - React Native iOS dependencies are now prebuilt</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="javascript-deep-imports-deprecation">JavaScript deep imports deprecation<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#javascript-deep-imports-deprecation" class="hash-link" aria-label="Direct link to JavaScript deep imports deprecation" title="Direct link to JavaScript deep imports deprecation" translate="no">​</a></h3>
<p>In this release, we are making moves to improve and stabilize React Native's public JavaScript API. The first step towards this is better scoping of which of our APIs are importable by apps and frameworks. In line with this, we are formally deprecating deep imports from React Native (<a href="https://github.com/react-native-community/discussions-and-proposals/pull/894" target="_blank" rel="noopener noreferrer" class="">see RFC</a>), and are introducing warnings via ESLint and the JS console.</p>
<p>These warnings are scoped to imports from within your project's source code, and can be <a class="" href="https://reactnative.dev/docs/strict-typescript-api">opted out from</a>. However, please bear in mind that we aim to remove deep imports from React Native's API in a future release, and these should instead be updated to the root import.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// Before - import from subpath</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native/Libraries/Alert/Alert'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// After - import from `react-native`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>Some APIs are not exported at root, and will become unavailable without deep imports. This is intentional, in order to reduce the overall surface area of React Native's API. We have an open <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/893" target="_blank" rel="noopener noreferrer" class="">feedback thread</a> for user issues, and will be working with the community to finalize which APIs we export over (at least) the next two React Native releases. Please share your feedback!</p>
<p>Learn more about this change in our dedicated post: <a class="" href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api">Moving Towards a Stable JavaScript API</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="opt-in-strict-typescript-api">Opt-in Strict TypeScript API<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#opt-in-strict-typescript-api" class="hash-link" aria-label="Direct link to Opt-in Strict TypeScript API" title="Direct link to Opt-in Strict TypeScript API" translate="no">​</a></h4>
<p>With the above redefinition of the exports in our public API, we're also shipping a new set of TypeScript types for the <code>react-native</code> package in 0.80, which we're calling the Strict TypeScript API.</p>
<p>Opting into the Strict TypeScript API is a preview of our future, stable JavaScript API for React Native. These new types are:</p>
<ol>
<li class=""><strong>Generated directly from our source code</strong> — improving coverage and correctness, so you can expect stronger compatibility guarantees.</li>
<li class=""><strong>Restricted to React Native's index file</strong> — more tightly defining our public API, and meaning we won't break the API when making internal file changes.</li>
</ol>
<p>We're shipping these alongside our existing types, meaning you can choose to migrate when ready. Also, if you're using standard React Native APIs, a lot of apps should validate with <strong>no changes</strong>. We strongly encourage early adopters and newly created apps to opt in via your <code>tsconfig.json</code> file.</p>
<p>When the community is ready, the Strict TypeScript API will become our default API in future —&nbsp;synchronized with deep imports removal.</p>
<p>Learn more about this change in our dedicated post: <a class="" href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api">Moving Towards a Stable JavaScript API</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="legacy-architecture-freezing--warnings">Legacy Architecture Freezing &amp; Warnings<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#legacy-architecture-freezing--warnings" class="hash-link" aria-label="Direct link to Legacy Architecture Freezing &amp; Warnings" title="Direct link to Legacy Architecture Freezing &amp; Warnings" translate="no">​</a></h3>
<p>The New Architecture of React Native is the default choice <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here">since version 0.76</a> and we’ve been reading <a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" target="_blank" rel="noopener noreferrer" class="">success stories</a> of projects and tools that greatly benefit from it.</p>
<p><a href="https://github.com/reactwg/react-native-new-architecture/discussions/290" target="_blank" rel="noopener noreferrer" class="">We recently shared</a> that we now consider the Legacy Architecture as frozen. We won’t be developing new bugfixes or features in the Legacy Architecture anymore and we will stop testing the Legacy Architecture while working on a release.</p>
<p>In order to smooth the migration, we are still allowing users to opt-out of the New Architecture if you’re experiencing bugs or regressions.</p>
<p>However shipping two architectures with React Native is a huge challenge, which impacts runtime performance, app size and maintenance of our codebase.</p>
<p>That’s why we’ll eventually have to sunset the Legacy Architecture at some point in the future.</p>
<p>In 0.80, we’ve added a series of warnings that will pop-up in React Native DevTools to warn you if you’re using APIs that won’t work in the New Architecture.</p>
<p>We recommend you to not ignore those warnings and to consider migrating your apps &amp; libraries to the New Architecture to be ready for the future.</p>
<p><img decoding="async" loading="lazy" alt="legacy architecture warnings" src="https://reactnative.dev/assets/images/0.80-legacy-arch-warnings-53105425d61d9e426f21af3e239df0f5.png" width="4320" height="2422" class="img_SS3x"></p>
<p>You can learn more about those changes in the talk "Life After Legacy: The New Architecture Future" <a href="https://www.youtube.com/live/K2JTTKpptGs?si=tRkT535f0GzguVGt&amp;t=9011" target="_blank" rel="noopener noreferrer" class="">we recently presented at App.js</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-1910">React 19.1.0<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#react-1910" class="hash-link" aria-label="Direct link to React 19.1.0" title="Direct link to React 19.1.0" translate="no">​</a></h3>
<p>This release of React Native ships with the latest React stable: 19.1.0</p>
<p>You can read about all the new features and bugfixes introduced in React 19.1.0 in the <a href="https://github.com/facebook/react/releases/tag/v19.1.0" target="_blank" rel="noopener noreferrer" class="">release description</a>.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>One notable feature of React 19.1.0 is the implementation and improvements of owner stacks. This is a development only feature that should help you identify which component is responsible for a specific error.</p><p>However, we are aware that owner stacks are not working as expected in React Native if you use the <code>@babel/plugin-transform-function-name</code> Babel plugin, which is enabled by default in the React Native Babel Preset. We will be shipping a fix for this in a future release of React Native.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="experimental---react-native-ios-dependencies-are-now-prebuilt">Experimental - React Native iOS dependencies are now prebuilt<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#experimental---react-native-ios-dependencies-are-now-prebuilt" class="hash-link" aria-label="Direct link to Experimental - React Native iOS dependencies are now prebuilt" title="Direct link to Experimental - React Native iOS dependencies are now prebuilt" translate="no">​</a></h3>
<p>If you’re building a React Native iOS app, you probably noticed that the first native build will take some time: a couple of minutes or even longer on older machines. That’s because we need to compile the whole React Native iOS code plus all of its dependencies.</p>
<p>Over the last weeks we’ve been experimenting with prebuilding some of the React Native core for iOS, similarly to what happens on Android, to reduce the build time when you’re first running a React Native app.</p>
<p>React Native 0.80 is the first release that can ship part of React Native for iOS as a prebuild to help reduce build times.</p>
<p>During the release process of React Native, we are producing an XCFramework called <code>ReactNativeDependencies.xcframework</code> that is a prebuilt version of only the 3rd party dependencies React Native depends on.</p>
<p>We experimented and benchmarked how much time this initial prebuild for iOS is saving and, in our benchmarks, run on an M4 machine, iOS builds are roughly 12% faster with the prebuild rather than by building from source.</p>
<p>From our experience, we also observed that several bug reports from users are caused by build issues related with React Native’s 3rd party dependencies (example <a href="https://github.com/facebook/react-native/issues/39568" target="_blank" rel="noopener noreferrer" class="">#39568</a>).
Prebuilding the 3rd party dependencies allows us to build them for you, so that you won’t face these build issues anymore.</p>
<p>Note that we are not pre-building the whole React Native: we are only pre-building the libraries Meta does not directly control, such as Folly and GLog.</p>
<p>In a future release, we will also ship the rest of React Native core as a prebuild.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-use-them">How to use them<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#how-to-use-them" class="hash-link" aria-label="Direct link to How to use them" title="Direct link to How to use them" translate="no">​</a></h4>
<p>This feature is still experimental, so it is not turned on by default.</p>
<p>If you want to use them, you can install your pods by adding the <code>RCT_USE_RN_DEP</code> env variable:</p>
<div class="language-bash codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-bash codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">RCT_USE_RN_DEP</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">1</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><br></span></code></pre></div></div>
<p>Alternatively, if you want to enable it for all the developers working on that, you can modify your Podfile like this:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">if linkage != nil</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> use_frameworks! :linkage =&gt; linkage.to_sym</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain">end</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">ENV['RCT_USE_RN_DEP'] = '1'</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">target 'HelloWorld' do</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> config = use_native_modules!</span><br></span></code></pre></div></div>
<p>Please, report any issue that the prebuilds might cause to you and to your app in <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/912" target="_blank" rel="noopener noreferrer" class="">this discussion</a>. We are committed to looking into them and making sure that tier usage is transparent to your app.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other Changes<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#other-changes" class="hash-link" aria-label="Direct link to Other Changes" title="Direct link to Other Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android---smaller-apk-size-thanks-to-ipo">Android - Smaller APK size thanks to IPO<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#android---smaller-apk-size-thanks-to-ipo" class="hash-link" aria-label="Direct link to Android - Smaller APK size thanks to IPO" title="Direct link to Android - Smaller APK size thanks to IPO" translate="no">​</a></h3>
<p>This release ships with significant size reduction for all the Android apps built with React Native. Starting in 0.80, we enabled <a href="https://en.wikipedia.org/wiki/Interprocedural_optimization" target="_blank" rel="noopener noreferrer" class="">Interprocedural Optimization</a> for both React Native and Hermes builds.</p>
<p>This resulted in a saving of ~1Mb for all the Android apps.</p>
<p><img decoding="async" loading="lazy" alt="android apk size comparison" src="https://reactnative.dev/assets/images/0.80-android-apk-size-81b179f0dbf9546c8b0c9d443ba535ea.png" width="1600" height="587" class="img_SS3x"></p>
<p>You will get this size win by updating your React Native version to 0.80 and there are no further changes required to your project.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-app-screen-redesign">New App Screen redesign<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#new-app-screen-redesign" class="hash-link" aria-label="Direct link to New App Screen redesign" title="Direct link to New App Screen redesign" translate="no">​</a></h3>
<p>If you’re not using Expo but you’re using the Community CLI &amp; Template, in this version we've moved the New App Screen into its <a href="https://www.npmjs.com/package/@react-native/new-app-screen" target="_blank" rel="noopener noreferrer" class="">own package</a> and given it a fresh coat of paint. This reduces initial code boilerplate when you create a new app with the Community Template, and also provides a better experience when viewed on larger screens.</p>
<p><img decoding="async" loading="lazy" alt="New App Screen redesign" src="https://reactnative.dev/assets/images/0.80-new-community-template-landing-19d75fcc472b11d97b4715e7c7339ef5.jpg" width="1600" height="1080" class="img_SS3x"></p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="notice-about-jsc-community-support">Notice about JSC community support<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#notice-about-jsc-community-support" class="hash-link" aria-label="Direct link to Notice about JSC community support" title="Direct link to Notice about JSC community support" translate="no">​</a></h3>
<p>React Native 0.80 is the last version of React Native to offer first party JSC support. The support for JSC will be offered via the community maintained package <code>@react-native-community/javascriptcore</code>.</p>
<p>In case you missed the announcement, you can <a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#jsc-moving-to-community-package">read more about it here</a></p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="added-exports-field-on-main-package">Added <code>"exports"</code> field on main package<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#added-exports-field-on-main-package" class="hash-link" aria-label="Direct link to added-exports-field-on-main-package" title="Direct link to added-exports-field-on-main-package" translate="no">​</a></h3>
<p>As part of our JS Stable API changes, we've introduced an <a href="https://nodejs.org/api/packages.html#package-entry-points" target="_blank" rel="noopener noreferrer" class=""><code>"exports"</code> field</a> on the <code>package.json</code> manifest of <code>react-native</code>.</p>
<p>In 0.80, this mapping continues to expose <strong>all JavaScript subpaths</strong> by default, and therefore should not be a major breaking change. At the same time, this may subtly affect how modules within the <code>react-native</code> package are resolved:</p>
<ul>
<li class="">Under Metro, <a href="https://metrobundler.dev/docs/package-exports#replacing-platform-specific-extensions" target="_blank" rel="noopener noreferrer" class="">platform-specific extensions</a> will not be automatically expanded against <code>"exports"</code> matches. We've provided a number of shim modules to accommodate this (<a href="https://github.com/facebook/react-native/pull/50426" target="_blank" rel="noopener noreferrer" class="">#50426</a>).</li>
<li class="">Under Jest, the ability to mock deep imports may be altered, which may require updating tests.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<p>This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting:</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="js">JS<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#js" class="hash-link" aria-label="Direct link to JS" title="Direct link to JS" translate="no">​</a></h3>
<ul>
<li class="">We bumped <code>eslint-plugin-react-hooks</code> from v4.6.0 to v5.2.0 (see full <a href="https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog here</a>). The <code>react-hooks</code> lint rules may produce new error signals which you will have to fix or suppress</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h3>
<ul>
<li class="">This release bumps the Kotlin version shipped with React Native to version 2.1.20. Kotlin 2.1 introduces new language features in preview that you can start using in your modules/components. You can read more about it in <a href="https://kotlinlang.org/docs/whatsnew21.html" target="_blank" rel="noopener noreferrer" class="">the official release notes</a>.</li>
<li class="">We deleted the <code>StandardCharsets</code> class. It has been deprecated since 0.73. You should use the <code>java.nio.charset.StandardCharsets</code> class instead.</li>
<li class="">We made several classes internal. Those classes are not part of the public API and should not be accessed. We already notified or submitted patches to the affected libraries:<!-- -->
<ul>
<li class=""><code>com.facebook.react.fabric.StateWrapperImpl</code></li>
<li class=""><code>com.facebook.react.modules.core.ChoreographerCompat</code></li>
<li class=""><code>com.facebook.react.modules.common.ModuleDataCleaner</code></li>
</ul>
</li>
<li class="">We migrated several classes from Java to Kotlin. If you’re using those classes, the nullability and types of some parameter changed so you might need to adjust your code:<!-- -->
<ul>
<li class="">All the classes inside <code>com.facebook.react.devsupport</code></li>
<li class=""><code>com.facebook.react.bridge.ColorPropConverter</code></li>
<li class=""><code>com.facebook.react.views.textinput.ReactEditText</code></li>
<li class=""><code>com.facebook.react.views.textinput.ReactTextInputManager</code></li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h3>
<ul>
<li class="">We deleted the <code>RCTFloorPixelValue</code> field from RCTUtils.h - The <code>RCTFloorPixelValue</code> method was not used in React Native and we removed it altogether.</li>
</ul>
<p>Further smaller breaking changes are listed <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0800" target="_blank" rel="noopener noreferrer" class="">in the CHANGELOG for 0.80</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.80 contains over 1167 commits from 127 contributors. Thanks for all your hard work!</p>
<p>We want to send a special thank you to those community members that shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/chrfalch" target="_blank" rel="noopener noreferrer" class="">Christian Falch</a> for the work on the iOS prebuilds for React Native Dependencies</li>
<li class=""><a href="https://x.com/iwoplaza" target="_blank" rel="noopener noreferrer" class="">Iwo Plaza</a>, <a href="https://x.com/breskin67" target="_blank" rel="noopener noreferrer" class="">Jakub Piasecki</a>, and <a href="https://github.com/coado" target="_blank" rel="noopener noreferrer" class="">Dawid Małecki</a> for their work on the Strict TypeScript API.</li>
</ul>
<p>Moreover, we also want to thank the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> for authoring the part related to iOS prebuilds for React Native Dependencies.</li>
<li class=""><a href="https://x.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for Deep imports deprecation, Opt-in Strict TypeScript API, New App Screen redesign.</li>
<li class=""><a href="https://x.com/cortinico" target="_blank" rel="noopener noreferrer" class="">Nicola Corti</a> for the Legacy Architecture Freezing &amp; Warnings.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-080">Upgrade to 0.80<a href="https://reactnative.dev/blog/2025/06/12/react-native-0.80#upgrade-to-080" class="hash-link" aria-label="Direct link to Upgrade to 0.80" title="Direct link to Upgrade to 0.80" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<p>If you use Expo, React Native 0.80 will be supported in a canary release of the Expo SDK. Instructions on how to use React Native 0.80 in Expo are also available <a href="https://expo.dev/changelog/react-native-80" target="_blank" rel="noopener noreferrer" class="">in a dedicated blogpost</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.80 is now the latest stable version of React Native and 0.77.x moves to unsupported. For more information see React Native's support policy. We aim to publish a final end-of-life update of 0.77 in the near future.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[Moving Towards a Stable JavaScript API (New Changes in 0.80)]]></title>
            <link>https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api</link>
            <guid>https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api</guid>
            <pubDate>Thu, 12 Jun 2025 16:00:00 GMT</pubDate>
            <description><![CDATA[In React Native 0.80, we're introducing two significant changes to React Native's JavaScript API — the deprecation of deep imports, and our new Strict TypeScript API. These are part of an ongoing effort to accurately define our API and offer dependable type safety to users and frameworks.]]></description>
            <content:encoded><![CDATA[<p>In React Native 0.80, we're introducing two significant changes to React Native's JavaScript API — the deprecation of deep imports, and our new Strict TypeScript API. These are part of an ongoing effort to accurately define our API and offer dependable type safety to users and frameworks.</p>
<p><strong>Quick takeaways:</strong></p>
<ul>
<li class=""><strong>Deep imports deprecation</strong>: From 0.80, we're introducing deprecation warnings for deep imports from the <code>react-native</code> package.</li>
<li class=""><strong>Opt-in Strict TypeScript API</strong>: We are moving to from-source TypeScript types and a new public API baseline under TypeScript. These enable stronger and more futureproof type accuracy, and will be a one-time breaking change. <a class="" href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#strict-typescript-api">Opt in</a> via <code>compilerOptions</code> in your project's <code>tsconfig.json</code>.</li>
<li class="">We'll work with the community over time to ensure that these changes work for everyone, before enabling the Strict TypeScript API by default in a future React Native release.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-changing-and-why">What's changing and why<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#whats-changing-and-why" class="hash-link" aria-label="Direct link to What's changing and why" title="Direct link to What's changing and why" translate="no">​</a></h2>
<p>We are moving to improve and stabilise React Native's public JavaScript API — i.e. what you get when you import <code>'react-native'</code>.</p>
<p>Historically, we've approximated this. React Native is authored in <a href="https://flow.org/" target="_blank" rel="noopener noreferrer" class="">Flow</a>, but the community has long since moved to TypeScript in open source, which is how the public API is consumed and validated for compatibility. Our types have been (lovingly) <a href="https://www.npmjs.com/package/@types/react-native" target="_blank" rel="noopener noreferrer" class="">community-contributed</a>, and since merged and aligned in our codebase. However, these have relied on manual maintenance and no automated tooling, introducing correctness gaps.</p>
<p>Additionally, our public JS API has been poorly defined in terms of module boundaries — e.g. internal <code>'react-native/Libraries/'</code> deep imports were reachable by app code, but could frequently change as we updated these internals.</p>
<p>In 0.80, we're addressing these issues by deprecating deep imports, and introducing a user opt-in to a new, generated API baseline in TypeScript. We're calling this our <strong>Strict TypeScript API</strong>. Ultimately, this is the groundwork to offer a stable React Native API in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="deprecating-deep-imports-from-react-native">Deprecating deep imports from <code>react-native</code><a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#deprecating-deep-imports-from-react-native" class="hash-link" aria-label="Direct link to deprecating-deep-imports-from-react-native" title="Direct link to deprecating-deep-imports-from-react-native" translate="no">​</a></h2>
<p>The main change we're making to our API today is deprecating the use of deep imports (<a href="https://github.com/react-native-community/discussions-and-proposals/pull/894" target="_blank" rel="noopener noreferrer" class="">RFC</a>), with warnings in ESLint and the JS console. Deep imports of values and types should be updated to <code>react-native</code>'s root import.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// Before - import from subpath</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native/Libraries/Alert/Alert'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// After - import from `react-native`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>This change reduces the total surface area of our JavaScript API into a fixed set of exports which we can control and make stable in a future release. We're targeting a removal of these import paths in 0.82.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>API feedback</div><div class="admonitionContent_pbrs"><p>Some APIs are not exported at root, and will become unavailable without deep imports. We have an <strong><a href="https://github.com/react-native-community/discussions-and-proposals/discussions/893" target="_blank" rel="noopener noreferrer" class="">open feedback thread</a></strong> and will be working with the community to finalize the exports in our public API. Please share your feedback!</p></div></div>
<p><strong>Opting out</strong></p>
<p>Please bear in mind that we aim to remove deep imports from React Native's API in a future release, and these should instead be updated to the root import.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Opting out of warnings</strong></summary><div><div class="collapsibleContent_Fd2D"><h4 class="anchor anchorTargetStickyNavbar_tleR" id="eslint">ESLint<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#eslint" class="hash-link" aria-label="Direct link to ESLint" title="Direct link to ESLint" translate="no">​</a></h4><p>Disable the <code>no-deep-imports</code> rule using <code>overrides</code>.</p><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">.eslintrc.js</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token literal-property property" style="color:#2aa198">overrides</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token literal-property property" style="color:#2aa198">files</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'*.js'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.jsx'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.ts'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.tsx'</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token literal-property property" style="color:#2aa198">rules</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        </span><span class="token string-property property" style="color:#2aa198">'@react-native/no-deep-imports'</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">]</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_tleR" id="console-warnings">Console warnings<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#console-warnings" class="hash-link" aria-label="Direct link to Console warnings" title="Direct link to Console warnings" translate="no">​</a></h4><p>Pass the <code>disableDeepImportWarnings</code> option to <code>@react-native/babel-preset</code>.</p><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">babel.config.js</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">module</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token literal-property property" style="color:#2aa198">presets</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'module:@react-native/babel-preset'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token literal-property property" style="color:#2aa198">disableDeepImportWarnings</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div><p>Restart your app with <code>--reset-cache</code> to clear the Metro cache.</p><div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli start --reset-cache</span><br></span></code></pre></div></div></div></div></details>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Opting out of warnings (Expo)</strong></summary><div><div class="collapsibleContent_Fd2D"><h4 class="anchor anchorTargetStickyNavbar_tleR" id="eslint-1">ESLint<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#eslint-1" class="hash-link" aria-label="Direct link to ESLint" title="Direct link to ESLint" translate="no">​</a></h4><p>Disable the <code>no-deep-imports</code> rule using <code>overrides</code>.</p><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">.eslintrc.js</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token literal-property property" style="color:#2aa198">overrides</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">files</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'*.js'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.jsx'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.ts'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'*.tsx'</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">rules</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token string-property property" style="color:#2aa198">'@react-native/no-deep-imports'</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div><h4 class="anchor anchorTargetStickyNavbar_tleR" id="console-warnings-1">Console warnings<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#console-warnings-1" class="hash-link" aria-label="Direct link to Console warnings" title="Direct link to Console warnings" translate="no">​</a></h4><p>Pass the <code>disableDeepImportWarnings</code> option to <code>babel-preset-expo</code>.</p><div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">babel.config.js</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">module</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">exports</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">api</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  api</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">cache</span><span class="token punctuation" style="color:#657b83">(</span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">presets</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">'babel-preset-expo'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token literal-property property" style="color:#2aa198">disableDeepImportWarnings</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div><p>Restart your app with <code>--clear</code> to clear the Metro cache.</p><div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx expo start </span><span class="token parameter variable" style="color:#cb4b16">--clear</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="strict-typescript-api-opt-in">Strict TypeScript API (opt-in)<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#strict-typescript-api-opt-in" class="hash-link" aria-label="Direct link to Strict TypeScript API (opt-in)" title="Direct link to Strict TypeScript API (opt-in)" translate="no">​</a></h2>
<p>The Strict TypeScript API is a new set of TypeScript types in the <code>react-native</code> package, which can be opted into via your <code>tsconfig.json</code>. We're shipping these alongside our existing TS types, meaning you can choose to migrate when ready.</p>
<p>The new types are:</p>
<ol>
<li class=""><strong>Generated directly from our source code</strong> — improving coverage and correctness, so you can expect stronger compatibility guarantees.</li>
<li class=""><strong>Restricted to <code>react-native</code>'s index file</strong> — more tightly defining our public API, and meaning we won't break the API when making internal file changes.</li>
</ol>
<p>When the community is ready, the Strict TypeScript API will become our default API in future — synchronized with deep imports removal. This means it's a <strong>good idea</strong> to begin opting in, as you'll be ready for React Native's future stable JS API.</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">tsconfig.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"extends"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@react-native/typescript-config"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"compilerOptions"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"customConditions"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token string" style="color:#8dc891">"react-native-strict-api"</span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Under the hood</div><div class="admonitionContent_pbrs"><p>This will instruct TypeScript to resolve <code>react-native</code> types from our new <a href="https://www.npmjs.com/package/react-native?activeTab=code" target="_blank" rel="noopener noreferrer" class=""><code>types_generated/</code></a> dir, instead of the previous <a href="https://www.npmjs.com/package/react-native?activeTab=code" target="_blank" rel="noopener noreferrer" class=""><code>types/</code></a> dir (manually maintained). No restart of TypeScript or your editor is required.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-deep-imports-are-disallowed">Breaking: Deep imports are disallowed<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#breaking-deep-imports-are-disallowed" class="hash-link" aria-label="Direct link to Breaking: Deep imports are disallowed" title="Direct link to Breaking: Deep imports are disallowed" translate="no">​</a></h3>
<p>As above, types under the Strict TypeScript API are now only resolvable from the main <code>'react-native'</code> import path, enforcing <a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support">package encapsulation</a>, per our above deprecation.</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// Before - import from subpath</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native/Libraries/Alert/Alert'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// After - MUST import from `react-native`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Alert</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Key win</div><div class="admonitionContent_pbrs"><p>We've scoped our public API to the exports of React Native's <code>index.js</code> file, which we carefully maintain. This means that file changes elsewhere in our codebase will no longer be breaking changes.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-some-type-names--shapes-have-changed">Breaking: Some type names / shapes have changed<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#breaking-some-type-names--shapes-have-changed" class="hash-link" aria-label="Direct link to Breaking: Some type names / shapes have changed" title="Direct link to Breaking: Some type names / shapes have changed" translate="no">​</a></h3>
<p>Types are now generated from source, rather than manually maintained. In doing this:</p>
<ul>
<li class="">We've aligned differences that had built up from the community contributed types — and also increased the type coverage of our source code.</li>
<li class="">We've intentionally updated some type names and type shapes, where there was scope to simplify or reduce ambiguity.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Key win</div><div class="admonitionContent_pbrs"><p>Because types are now generated from React Native's source code, you can be confident that the typechecker is <strong>always accurate</strong> for a given version of <code>react-native</code>.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="example-stricter-exported-symbols">Example: Stricter exported symbols<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#example-stricter-exported-symbols" class="hash-link" aria-label="Direct link to Example: Stricter exported symbols" title="Direct link to Example: Stricter exported symbols" translate="no">​</a></h4>
<p>The <code>Linking</code> API is now a single <code>interface</code>, rather than two exports. This follows for a number of other APIs (<a class="" href="https://reactnative.dev/docs/strict-typescript-api">see docs</a>).</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Linking</span><span class="token imports punctuation" style="color:#657b83">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">LinkingStatic</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">foo</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">linking</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token maybe-class-name">LinkingStatic</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">foo</span><span class="token punctuation" style="color:#657b83">(</span><span class="token maybe-class-name">Linking</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Linking</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">foo</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">linking</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token maybe-class-name">Linking</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">foo</span><span class="token punctuation" style="color:#657b83">(</span><span class="token maybe-class-name">Linking</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="example-fixed--more-complete-types">Example: Fixed / more complete types<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#example-fixed--more-complete-types" class="hash-link" aria-label="Direct link to Example: Fixed / more complete types" title="Direct link to Example: Fixed / more complete types" translate="no">​</a></h4>
<p>Previous manual type definitions left the opportunity for type gaps. Under generated Flow → TypeScript, these are no longer present (and at source, benefit from Flow's additional type validation for multi-platform code).</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">Dimensions</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Before - Type error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// After - number | undefined</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">densityDpi</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token maybe-class-name">Dimensions</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">get</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other breaking changes<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#other-breaking-changes" class="hash-link" aria-label="Direct link to Other breaking changes" title="Direct link to Other breaking changes" translate="no">​</a></h3>
<p>Please refer to our <a class="" href="https://reactnative.dev/docs/strict-typescript-api">dedicated guide</a> in the docs which details all breaking types changes and how to update your code.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="rollout">Rollout<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#rollout" class="hash-link" aria-label="Direct link to Rollout" title="Direct link to Rollout" translate="no">​</a></h2>
<p>We appreciate that any breaking change to React Native will take time for developers to update to in their apps.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="now--opt-in-launch-080">Now — Opt-in launch (0.80)<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#now--opt-in-launch-080" class="hash-link" aria-label="Direct link to Now — Opt-in launch (0.80)" title="Direct link to Now — Opt-in launch (0.80)" translate="no">​</a></h4>
<p>The <code>"react-native-strict-api"</code> opt-in is stable in the 0.80 release.</p>
<ul>
<li class="">This is a one-time migration. We aim for apps and libraries to opt in at their own pace over the next couple of releases.</li>
<li class="">Under either mode, nothing will change for your app at runtime — this affects TypeScript analysis only.</li>
<li class=""><strong>And</strong>, we will take feedback on missing APIs, via our <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/893" target="_blank" rel="noopener noreferrer" class="">dedicated feedback thread</a>.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Recommended</div><div class="admonitionContent_pbrs"><p>The Strict TypeScript API will become our default API in the future.</p><p>If you have time, it's worth testing the opt-in now in your <code>tsconfig.json</code>, to futureproof your app or library. This will immediately evaluate if there are any type errors introduced in your app under the Strict API. <strong>There may be none(!)</strong> — in which case, you're good to go.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="future--strict-typescript-api-by-default">Future — Strict TypeScript API by default<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#future--strict-typescript-api-by-default" class="hash-link" aria-label="Direct link to Future — Strict TypeScript API by default" title="Direct link to Future — Strict TypeScript API by default" translate="no">​</a></h4>
<p>In the future, we will require all codebases to use our Strict API, and will remove the legacy types.</p>
<p>The timeline for this will be based on community feedback. For at least the next two React Native releases, the Strict API will remain an opt-in.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="faqs">FAQs<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#faqs" class="hash-link" aria-label="Direct link to FAQs" title="Direct link to FAQs" translate="no">​</a></h2>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><p><strong>I'm using subpath imports today. What should I do?</strong></p></summary><div><div class="collapsibleContent_Fd2D"><p>Please migrate to the root <code>'react-native'</code> import path.</p><ul>
<li class="">Subpath imports (e.g. <code>'react-native/Libraries/Alert/Alert'</code>) are becoming private APIs. Without preventing access to implementation files inside React Native, we can’t offer a stable JavaScript API.</li>
<li class="">We want our deprecation warnings to motivate community feedback, which can be raised via our <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/893" target="_blank" rel="noopener noreferrer" class="">centralized discussion thread</a>, if you believe we are not exposing code paths that are crucial for your app. Where justified, we may promote APIs to the index export.</li>
</ul></div></div></details>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><p><strong>I'm a library maintainer. How does this change impact me?</strong></p></summary><div><div class="collapsibleContent_Fd2D"><p>Both apps and libraries can opt in at their own pace, since <code>tsconfig.json</code> will only affect the immediate codebase.</p><ul>
<li class="">Typically, <code>node_modules</code> is excluded from validation by the TypeScript server in a React Native project. Therefore, your package's exported type definitions are the source of truth.</li>
</ul><p><strong>💡 We want feedback!</strong> As with changed subpath imports, if you encounter any integration issues with the Strict API, please let us know <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/893" target="_blank" rel="noopener noreferrer" class="">on GitHub</a>.</p></div></div></details>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><p><strong>Does this guarantee a final API for React Native yet?</strong></p></summary><div><div class="collapsibleContent_Fd2D"><p>Sadly, not yet. In 0.80, we've made a tooling investment so that React Native's existing JS API baseline can be accurately consumed via TypeScript — enabling future stable changes. We're formalizing the existing API you know and love.</p><p>In the future, we will take action to finalise the APIs we currently offer in core — across each language surface. API changes will be communicated via RFCs/announcements, and typically a deprecation cycle.</p></div></div></details>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><p><strong>Why isn't React Native written in TypeScript?</strong></p></summary><div><div class="collapsibleContent_Fd2D"><p>React Native is core infrastructure at Meta. We test every merged change across our Family of Apps, before they hit general open source availability.</p><p>At this scale and sensitivity, correctness matters. The bottom line is that Flow offers us greater performance and greater strictness than TypeScript, including specific <a href="https://flow.org/en/docs/react/multiplatform/" target="_blank" rel="noopener noreferrer" class="">multi-platform support for React Native</a>.</p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="thanks">Thanks<a href="https://reactnative.dev/blog/2025/06/12/moving-towards-a-stable-javascript-api#thanks" class="hash-link" aria-label="Direct link to Thanks" title="Direct link to Thanks" translate="no">​</a></h2>
<p>These changes were made possible by <a href="https://x.com/iwoplaza" target="_blank" rel="noopener noreferrer" class="">Iwo Plaza</a>, <a href="https://x.com/breskin67" target="_blank" rel="noopener noreferrer" class="">Jakub Piasecki</a>, <a href="https://github.com/coado" target="_blank" rel="noopener noreferrer" class="">Dawid Małecki</a>, <a href="https://x.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a>, and <a href="https://x.com/CipolleschiR" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a>.</p>
<p>Thanks also to <a href="https://github.com/pieterv" target="_blank" rel="noopener noreferrer" class="">Pieter Vanderwerff</a>, <a href="https://github.com/rubennorte" target="_blank" rel="noopener noreferrer" class="">Rubén Norte</a>, and <a href="https://x.com/robjhogan" target="_blank" rel="noopener noreferrer" class="">Rob Hogan</a> for their additional help and input.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Learn more</div><div class="admonitionContent_pbrs"><div style="display:flex;align-items:center;gap:40px"><div style="flex:1"><strong style="display:block;margin-top:8px;margin-bottom:8px">Watch the talk!</strong><span style="display:block;margin-bottom:8px">We shared a deep dive into our motivations and the work behind the Strict TypeScript API at <strong>App.js 2025</strong>.</span><p style="margin-bottom:8px"><strong><a href="https://www.youtube.com/live/UTaJlqhTk2g?si=SDRmj80kss7hXuGG&amp;t=6520" target="_blank" rel="noopener noreferrer" class="">View on YouTube</a></strong></p></div><img src="https://reactnative.dev/blog/assets/0.80-js-stable-api-appjs.jpg" style="flex-shrink:0;max-width:200px;aspect-ratio:16/9;border-radius:10px" alt="App.js 2025 Talk"></div></div></div>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.79 - Faster tooling and much more]]></title>
            <link>https://reactnative.dev/blog/2025/04/08/react-native-0.79</link>
            <guid>https://reactnative.dev/blog/2025/04/08/react-native-0.79</guid>
            <pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.79!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.79!</p>
<p>This release ships with performance improvements on various fronts, as well as several bugfixes. First, Metro is now faster to start thanks to deferred hashing, and has stable support for package exports. Startup time in Android will also be improved thanks to changes in the JS bundle compressions and much more.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#metro-faster-startup-and-package-exports-support">New Metro Features</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#jsc-moving-to-community-package">JSC moving to a Community Package</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#ios-swift-compatible-native-modules-registration">iOS: Swift-Compatible Native Modules registration</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#android-faster-app-startup">Android: Faster App Startup</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#removal-of-remote-js-debugging">Removal of Remote JS Debugging</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="metro-faster-startup-and-package-exports-support">Metro: Faster startup and package exports support<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#metro-faster-startup-and-package-exports-support" class="hash-link" aria-label="Direct link to Metro: Faster startup and package exports support" title="Direct link to Metro: Faster startup and package exports support" translate="no">​</a></h3>
<p>This release ships with <a href="https://github.com/facebook/metro/releases/tag/v0.82.0" target="_blank" rel="noopener noreferrer" class="">Metro 0.82</a>.This version uses deferred hashing to improve the speed of first <code>yarn start</code> typically by over 3x (more in larger projects and monorepos) making your development experience and CI builds faster on a daily basis.</p>
<p><img decoding="async" loading="lazy" alt="metro startup comparison" src="https://reactnative.dev/assets/images/0.79-metro-startup-comparison-6dd153aeb4b43cb5dec1390b67bc4673.gif" width="960" height="540" class="img_SS3x"></p>
<p>Also in Metro 0.82, we’re promoting <code>package.json</code> <code>"exports"</code> and <code>"imports"</code> field resolution to stable. <code>"exports"</code> resolution was <a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support">introduced in React Native 0.72</a>, and <code>"imports"</code> support was added in a community contribution - both will now be enabled by default for all the projects on React Native 0.79.</p>
<p>This improves compatibility with modern npm dependencies, and opens up new, standards-compliant ways to organise your projects.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Breaking change</div><div class="admonitionContent_pbrs"><p>While we've been testing <code>package.json</code> <code>"exports"</code> in the community for a while, this switchover can be a breaking change for certain packages and project setups.</p><p>In particular, we're aware of user reported incompatibilities for some popular packages including Firebase and AWS Amplify, and are working to get these fixed at source.</p><p>If you're encountering issues:</p><ul>
<li class="">Please update to the Metro <a href="https://github.com/facebook/metro/releases/tag/v0.81.5" target="_blank" rel="noopener noreferrer" class="">0.81.5 hotfix</a>, or set <a href="https://metrobundler.dev/docs/configuration/#unstable_enablepackageexports-experimental" target="_blank" rel="noopener noreferrer" class=""><code>resolver.unstable_enablePackageExports = false</code></a> to opt out.</li>
<li class="">See <a href="https://github.com/expo/expo/discussions/36551" target="_blank" rel="noopener noreferrer" class="">expo/expo#36551</a> for affected packages and future updates.</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="jsc-moving-to-community-package">JSC moving to Community Package<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#jsc-moving-to-community-package" class="hash-link" aria-label="Direct link to JSC moving to Community Package" title="Direct link to JSC moving to Community Package" translate="no">​</a></h3>
<p>As part of our effort to reduce the API surface of React Native, we're in the process of moving the JavaScriptCore (JSC) engine to a community-maintained package: <code>@react-native-community/javascriptcore</code></p>
<p>This change will not affect users that are using Hermes.</p>
<p>Starting with React Native 0.79, you can use a community supported version of JSC by following the <a href="https://github.com/react-native-community/javascriptcore#installation" target="_blank" rel="noopener noreferrer" class="">installation instructions in the readme</a>. The JSC version provided by React Native core will still be available in 0.79, but we’re planning to remove it <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0836-lean-core-jsc.md" target="_blank" rel="noopener noreferrer" class="">in the near future</a>.</p>
<p>Moving JSC to a community maintained package will allow us to update the JSC version more frequently and offer you the latest features. The community maintained JSC will follow a separate release schedule from React Native.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="ios-swift-compatible-native-modules-registration">iOS: Swift-Compatible Native Modules registration<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#ios-swift-compatible-native-modules-registration" class="hash-link" aria-label="Direct link to iOS: Swift-Compatible Native Modules registration" title="Direct link to iOS: Swift-Compatible Native Modules registration" translate="no">​</a></h3>
<p>In this release, we are revamping the way in which you can register your Native Module into the React Native runtime. The new approach follows the same approach of components, described in the <a class="" href="https://reactnative.dev/docs/next/the-new-architecture/using-codegen#configuring-codegen">official documentation</a>.</p>
<p>Starting from this version of React Native, you can register your modules by modifying the <code>package.json</code> file. We introduced a new <code>modulesProvider</code> field in the <code>ios</code> property:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">"codegenConfig": {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">    "ios": {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">       "modulesProvider": {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">         "JS Name for the module": "ObjC Module provider for the pure C++ TM or a class conforming to RCTTurboModule"</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">     }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Codegen will take care to create all the relevant code starting from your <code>package.json</code> file.</p>
<p>If you do use a pure C++ Native Module you will have to follow this recommended configuration:</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary>Configure pure C++Native Modules in your app</summary><div><div class="collapsibleContent_Fd2D"><p>For pure C++ Native Modules, you need to add a new ObjectiveC++ class to glue together the C++ Native Module with the rest of the App:</p><div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">CppNativeModuleProvider.h</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">Foundation</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">Foundation</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">ReactCommon</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">RCTTurboModule</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">NS_ASSUME_NONNULL_BEGIN</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">@interface</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">YourNativeModule</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain">Provider </span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain"> NSObject </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">RCTModuleProvider</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">@end</span><br></span></code></pre></div></div><div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">CppNativeModuleProvider.mm</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">NS_ASSUME_NONNULL_END</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property string" style="color:#8dc891">"&lt;YourNativeModule&gt;Provider.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">ReactCommon</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">CallInvoker</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">ReactCommon</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">TurboModule</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property string" style="color:#8dc891">"&lt;YourNativeModule&gt;.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">@implementation</span><span class="token plain"> NativeSampleModuleProvider</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">std</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">shared_ptr</span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">facebook</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">react</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">TurboModule</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">getTurboModule</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> facebook</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">react</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">ObjCTurboModule</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">InitParams </span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">params</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> std</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">make_shared</span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">facebook</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">react</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">NativeSampleModule</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">jsInvoker</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div></div></div></details>
<p>With this new approach, we unified the registration of Native Modules for both app developers and library maintainers. Libraries can specify the same properties in their <code>package.json</code> and Codegen will take care of the rest.</p>
<p>This approach solves the limitation we introduced in 0.77 that prevented the registration of a pure C++ Native Module with a Swift <code>AppDelegate</code>. As you can see, none of these changes modifies the <code>AppDelegate</code> and the generated code will work for <code>AppDelegate</code> implemented with both Swift and Objective-C.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-faster-app-startup">Android: Faster App Startup<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#android-faster-app-startup" class="hash-link" aria-label="Direct link to Android: Faster App Startup" title="Direct link to Android: Faster App Startup" translate="no">​</a></h3>
<p>We’re also shipping a change to improve your Android startup time by a significant amount.</p>
<p>Starting with this version, we won’t be compressing the JavaScript bundle anymore inside the APK. Previously, the Android system needed to uncompress the JavaScript bundle before your app could start. This was causing a significant slowdown during the app startup.</p>
<p>Starting from this release, we will be shipping the JavaScript Bundle uncompressed by default, so your Android apps will be generally faster to start.</p>
<p>The <a href="https://margelo.com/" target="_blank" rel="noopener noreferrer" class="">Margelo</a> team tested this feature on the Discord app and got a significant performance boost: Discord’s time-to-interactive (TTI) was reduced by 400ms, which was a 12% speedup with a one-line change (tested on a Samsung A14).</p>
<p>On the other hand, storing the bundle uncompressed, will result in a higher space consumption for your application on the user device. If this is a concern to you, you can toggle this behavior using the <code>enableBundleCompression</code> property in your <code>app/build.gradle</code> file.</p>
<div class="language-kotlin codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">app/build.gradle</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-kotlin codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">react </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// If you want to compress the JS bundle (slower startup, less</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// space consumption)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  enableBundleCompression </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// If don't you want to compress the JS bundle (faster startup,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// higher space consumption)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  enableBundleCompression </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// Default is `false`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Please note that the APK size will increase in this release, but your users won’t be paying the extra cost in APK download size, as the APKs are compressed when downloaded from the network.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removal-of-remote-js-debugging">Removal of Remote JS Debugging<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#removal-of-remote-js-debugging" class="hash-link" aria-label="Direct link to Removal of Remote JS Debugging" title="Direct link to Removal of Remote JS Debugging" translate="no">​</a></h3>
<p>As part of our ongoing efforts to improve debugging, we're removing Remote JS Debugging via Chrome. This legacy debugging method was deprecated, <a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#remote-javascript-debugging">and moved to a runtime opt-in, in React Native 0.73</a>. Please use <a class="" href="https://reactnative.dev/docs/react-native-devtools">React Native DevTools</a> for modern and reliable debugging.</p>
<p>This also means that React Native is no longer compatible with the <a href="https://github.com/jhen0409/react-native-debugger" target="_blank" rel="noopener noreferrer" class="">react-native-debugger</a> community project. For developers that want to use third party debugging extensions, such as Redux DevTools, we recommend <a href="https://github.com/expo/dev-plugins" target="_blank" rel="noopener noreferrer" class="">Expo DevTools Plugins</a>, or integrating the standalone versions of these tools.</p>
<p>Read more in <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/872" target="_blank" rel="noopener noreferrer" class="">this dedicated post</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="internal-modules-updated-to-export-syntax">Internal modules updated to <code>export</code> syntax<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#internal-modules-updated-to-export-syntax" class="hash-link" aria-label="Direct link to internal-modules-updated-to-export-syntax" title="Direct link to internal-modules-updated-to-export-syntax" translate="no">​</a></h3>
<p>As part of modernizing our JavaScript codebase, we've updated a number of implementation modules within <code>react-native</code> to consistently use <code>export</code> syntax instead of <code>module.exports</code>.</p>
<p>We've updated around <strong>46 APIs</strong> in total, which can be found in the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0790" target="_blank" rel="noopener noreferrer" class="">changelog</a>.</p>
<p>This change has a subtle impact on existing imports:</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Case 1:&nbsp;Default export</strong></summary><div><div class="collapsibleContent_Fd2D"><div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // CHANGED - require() syntax</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#cb4b16">-</span><span class="token deleted-sign deleted line" style="color:#cb4b16"> const ImageBackground = require('react-native/Libraries/Image/ImageBackground');</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token deleted-sign deleted line" style="color:#cb4b16"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"> const ImageBackground = require('react-native/Libraries/Image/ImageBackground').default;</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">// Unchanged - import syntax</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">import ImageBackground from 'react-native/Libraries/Image/ImageBackground';</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">// RECOMMENDED - root import</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">import {ImageBackground} from 'react-native';</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></div></div></details>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>Case 2: Secondary exports</strong></summary><div><div class="collapsibleContent_Fd2D"><p>There are very few cases of this pattern, again unaffected when using the root <code>'react-native'</code> import.</p><div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // Unchanged - require() syntax</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> const BlobRegistry = require('react-native/Libraries/Blob/BlobRegistry');</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // Unchanged - require() syntax with destructuring</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> const {register, unregister} = require('react-native/Libraries/Blob/BlobRegistry');</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // CHANGED - import syntax as single object</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:#cb4b16">-</span><span class="token deleted-sign deleted line" style="color:#cb4b16"> import BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry';</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token deleted-sign deleted line" style="color:#cb4b16"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"> import * as BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry';</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // Unchanged - import syntax with destructuring</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> import {register, unregister} from 'react-native/Libraries/Blob/BlobRegistry';</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> // RECOMMENDED - root import</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> import {BlobRegistry} from 'react-native';</span><br></span></code></pre></div></div></div></div></details>
<p>We expect the impact of this change to be extremely limited, particularly for projects written in TypeScript and using <code>import</code> syntax. Please check for any type errors to update your code.</p>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_pbrs"><p><strong>The root <code>react-native</code> import is strongly recommended</strong></p><p>As a general takeaway, we strongly recommend importing from the root <code>'react-native'</code> path, to avoid extraneous breaking changes in the future. In our next release, we will be deprecating deep imports, as part of better defining React Native's public JavaScript API (<a href="https://github.com/react-native-community/discussions-and-proposals/pull/894" target="_blank" rel="noopener noreferrer" class="">see the RFC</a>).</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<p>This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting.</p>
<ul>
<li class=""><strong>Invalid unitless lengths in box shadows and filters</strong>:<!-- -->
<ul>
<li class="">In order to make React Native more compliant with the CSS/Web specs, we now don’t support anymore unitless lengths in <code>box-shadow</code> and <code>filter</code>. This means that if you were using a <code>box-shadow</code> of <code>1 1 black</code> we won’t be rendering. You should instead specify units such as <code>1px 1px black</code></li>
</ul>
</li>
<li class=""><strong>Remove incorrect hwb() syntax support from normalize-color:</strong>
<ul>
<li class="">In order to make React Native more compliant with the CSS/Web specs, we now restrict some invalid syntax for <code>hwb()</code>. Historically React Native used to support comma separated values (e.g. <code>hwb(0, 0%, 100%)</code>) which we now don’t support anymore (you should migrate to <code>hwb(0 0% 100%)</code>). You can read more about this change <a href="https://github.com/facebook/react-native/commit/676359efd9e478d69ad430cff213acc87b273580" target="_blank" rel="noopener noreferrer" class="">here</a>.</li>
</ul>
</li>
<li class=""><strong>Libraries/Core/ExceptionsManager exports update</strong>
<ul>
<li class="">As part of our effort to modernize the React Native JS API, we updated <code><a href="https://github.com/facebook/react-native/blob/0.79-stable/packages/react-native/Libraries/Core/ExceptionsManager.js" target="_blank" rel="noopener noreferrer" class="">ExceptionsManager</a></code> to now export a default <code>ExceptionsManager</code> object, and <code>SyntheticError</code> as a secondary export.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.79 contains over 944 commits from 100 contributors. Thanks for all your hard work!</p>
<p>We want to send a thank you to those community members that shipped significant contributions in this release:</p>
<ul>
<li class=""><a href="https://github.com/mrousavy" target="_blank" rel="noopener noreferrer" class="">Marc Rousavy</a> for developing and documenting the “Android: Faster App Startup” feature</li>
<li class=""><a href="https://github.com/Kudo" target="_blank" rel="noopener noreferrer" class="">Kudo Chien</a> and <a href="https://github.com/okwasniewski" target="_blank" rel="noopener noreferrer" class="">Oskar Kwaśniewski</a>for working on the <code>@react-native-community/javascriptcore</code> package and writing the “JSC moving to Community Package” section</li>
<li class=""><a href="https://github.com/facebook/metro/pull/1302" target="_blank" rel="noopener noreferrer" class="">James Lawson</a> for adding support for import subpath resolution <a href="https://github.com/facebook/metro/pull/1302" target="_blank" rel="noopener noreferrer" class="">in Metro</a>.</li>
</ul>
<p>Moreover, we also want to thank the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/robhogan" target="_blank" rel="noopener noreferrer" class="">Rob Hogan</a> for the “New Metro Features” section</li>
<li class=""><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for the “Removal of Remote JS Debugging” and “Internal modules updated to export syntax” sections</li>
<li class=""><a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> for the work on iOS Native Module registration</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-079">Upgrade to 0.79<a href="https://reactnative.dev/blog/2025/04/08/react-native-0.79#upgrade-to-079" class="hash-link" aria-label="Direct link to Upgrade to 0.79" title="Direct link to Upgrade to 0.79" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.79 will be supported in the upcoming Expo SDK 53 as the default version of React Native.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.79 is now the latest stable version of React Native and 0.76.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.76 in the near future.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.78 - React 19 and more]]></title>
            <link>https://reactnative.dev/blog/2025/02/19/react-native-0.78</link>
            <guid>https://reactnative.dev/blog/2025/02/19/react-native-0.78</guid>
            <pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.78!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.78!</p>
<p>This release ships React 19 in React Native and some other relevant features like native support for Android Vector drawables and better brownfield integration for iOS.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#react-19">React 19</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#towards-smaller-and-faster-releases">Towards smaller and faster releases</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#opt-in-for-javascript-logs-in-metro">Opt-in for JavaScript logs in Metro</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#added-support-for-android-xml-drawables">Added support for Android XML drawables</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#reactnativefactory-on-ios">ReactNativeFactory on iOS</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-19">React 19<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#react-19" class="hash-link" aria-label="Direct link to React 19" title="Direct link to React 19" translate="no">​</a></h3>
<p>React 19 is now available on React Native!</p>
<p>React 19 requires updating your app, as we introduced some changes from React 18. For example, we removed some APIs such as <code>propTypes</code>, and you need to adjust your app to make it compatible with the new version of React.</p>
<p>Follow our step-by-step <a href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">instructions to upgrade</a> your app to React 19.</p>
<p>After the migration, you’ll be able to leverage all the new features of React, including (non exhaustively):</p>
<ul>
<li class=""><strong><a href="https://react.dev/blog/2024/12/05/react-19#actions" target="_blank" rel="noopener noreferrer" class="">Actions</a>:</strong> these are functions that use async transitions. Async transitions automatically manage submitting data for you: they handle pending states, optimistic updates, error handling and more.</li>
<li class=""><strong><a href="https://react.dev/reference/react/useActionState" target="_blank" rel="noopener noreferrer" class="">useActionState</a>:</strong> a utility hook built on top of Actions. It takes a function and returns a wrapped Action to call. When the action is called, it will return the last result of the Action and its <code>pending</code> state.</li>
<li class=""><strong><a href="https://react.dev/reference/react/useOptimistic" target="_blank" rel="noopener noreferrer" class="">useOptimistic</a>:</strong> a new hook that simplifies showing the final state of an update optimistically while the async request is underway. If the request errors, React will switch back to the previous value automatically.</li>
<li class=""><strong><a href="https://react.dev/reference/react/use" target="_blank" rel="noopener noreferrer" class=""><code>use</code></a>:</strong> this is a new API that allows access to resources during render. You can now read a promise or a context with <code>use</code> and React will Suspend until they resolve.</li>
<li class=""><strong><a href="https://react.dev/blog/2024/12/05/react-19#ref-as-a-prop" target="_blank" rel="noopener noreferrer" class=""><code>ref</code> as <code>props</code></a>:</strong> you can now pass <code>ref</code> as a <code>prop</code> like you do with any other prop. Function components will no longer need <code>forwardRef</code> and you can migrate your components now.</li>
<li class="">And many others</li>
</ul>
<p>For a complete list of the new available features, have a look at the <a href="https://react.dev/blog/2024/12/05/react-19" target="_blank" rel="noopener noreferrer" class="">React 19 release blog post</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="react-compiler">React Compiler<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#react-compiler" class="hash-link" aria-label="Direct link to React Compiler" title="Direct link to React Compiler" translate="no">​</a></h4>
<p>React Compiler is a build-time tool designed to optimize React applications by automatically applying memoization. While developers can manually use APIs like <code>useMemo</code>, <code>useCallback</code>, and <code>React.memo</code> to prevent unnecessary recomputation of unchanged parts of an app, they could also forget or misuse these optimizations. React Compiler addresses this by leveraging its understanding of JavaScript and of the <a href="https://react.dev/reference/rules" target="_blank" rel="noopener noreferrer" class="">Rules of React</a> to automatically memoize values or groups of values within components and hooks.</p>
<p>With this release, we simplified the process to enable the React Compiler in your React Native apps. <a href="https://react.dev/learn/react-compiler#using-react-compiler-with-react-17-or-18" target="_blank" rel="noopener noreferrer" class="">In previous versions</a>, you had to install two packages: the compiler and its runtime. After those packages were installed, you had to configure a Babel plugin to enable React Compiler through Metro.</p>
<p>Now, you only need to install the compiler itself and to configure the Babel plugin. To learn how to enable it, you can follow our step-by-step <a href="https://react.dev/learn/react-compiler#usage-with-babel" target="_blank" rel="noopener noreferrer" class="">guide</a>.</p>
<p>To verify that the compiler is running, you can open the React Native DevTools: you should see that the components that are memoized have the <code>Memo ✨</code> tag attached to them in the Component Inspector.</p>
<p>If you want to learn more about React Compiler, these are useful resources:</p>
<ul>
<li class=""><a href="https://react.dev/learn/react-compiler" target="_blank" rel="noopener noreferrer" class="">React Compiler</a> docs</li>
<li class=""><a href="https://www.youtube.com/watch?v=uA_PVyZP7AI" target="_blank" rel="noopener noreferrer" class="">React Compiler Deep Dive</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="towards-smaller-and-faster-releases">Towards smaller and faster releases<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#towards-smaller-and-faster-releases" class="hash-link" aria-label="Direct link to Towards smaller and faster releases" title="Direct link to Towards smaller and faster releases" translate="no">​</a></h3>
<p>We’re updating our release process to ship stable React Native releases more frequently in 2025.</p>
<p>It will be easier for you to update the React Native version because we’ll be reducing the number of breaking changes we ship. Faster releases also means that all the bugfixes we ship internally are reaching you earlier, and you can benefit from the latest features we develop inside React Native.</p>
<p>We believe this new model will benefit every developer in the React Native ecosystem, as fewer breaking changes means a more stable framework that everyone can rely on.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="opt-in-for-javascript-logs-in-metro">Opt-in for JavaScript logs in Metro<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#opt-in-for-javascript-logs-in-metro" class="hash-link" aria-label="Direct link to Opt-in for JavaScript logs in Metro" title="Direct link to Opt-in for JavaScript logs in Metro" translate="no">​</a></h3>
<p>We've added an opt-in to restore JavaScript log streaming via the Metro dev server, <a class="" href="https://reactnative.dev/blog/2025/01/21/version-0.77#removal-of-consolelog-streaming-in-metro">previously removed in 0.77</a> for Community CLI users. This is in response to user feedback, as well as reviewing where we are with our replacement offerings today.</p>
<p>To opt in, use the new <code>--client-logs</code> flag. This can also be aliased via an npm script for convenience.</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli start --client-logs</span><br></span></code></pre></div></div>
<p>Log streaming in Metro will still be going away in future and remains off by default. However, we intend to give developers a longer migration period to adapt to this change.</p>
<p>This update will also be made available in the incoming 0.77.1 minor release.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="added-support-for-android-xml-drawables">Added support for Android XML drawables<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#added-support-for-android-xml-drawables" class="hash-link" aria-label="Direct link to Added support for Android XML drawables" title="Direct link to Added support for Android XML drawables" translate="no">​</a></h3>
<p>In React Native 0.78, we’re shipping a new way to load icons, illustrations, and other graphic elements on Android as <a href="https://developer.android.com/guide/topics/resources/drawable-resource" target="_blank" rel="noopener noreferrer" class="">XML resources</a>. This means you can use <a href="https://developer.android.com/develop/ui/views/graphics/vector-drawable-resources" target="_blank" rel="noopener noreferrer" class="">vector drawables</a> for displaying vector images at any scale without losing quality, or <a href="https://developer.android.com/guide/topics/resources/drawable-resource#Shape" target="_blank" rel="noopener noreferrer" class="">shape drawables</a> for drawing more basic embellishments. This is all supported by the same <code>Image</code> component that you know and love. To use this feature today, you can import XML resources like any other <a class="" href="https://reactnative.dev/docs/next/images#static-image-resources">static resource</a> by referencing them in the <code>source</code> prop. Furthermore, using XML resources rather than bitmaps will also help you reduce your application size and will result in better rendering across screens with different DPI.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// via require</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token maybe-class-name">Image</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  source</span><span class="token operator" style="color:#fc929e">=</span><span class="token punctuation" style="color:#657b83">{</span><span class="token function" style="color:#79b6f2">require</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'./img/my_icon.xml'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  style</span><span class="token operator" style="color:#fc929e">=</span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">{</span><span class="token literal-property property" style="color:#2aa198">width</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">40</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#2aa198">height</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">40</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">/</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// or via import</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">MyIcon</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'./img/my_icon.xml'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token maybe-class-name">Image</span><span class="token plain"> source</span><span class="token operator" style="color:#fc929e">=</span><span class="token punctuation" style="color:#657b83">{</span><span class="token maybe-class-name">MyIcon</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> style</span><span class="token operator" style="color:#fc929e">=</span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">{</span><span class="token literal-property property" style="color:#2aa198">width</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">40</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#2aa198">height</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">40</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">/</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="performance--quality">Performance &amp; Quality<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#performance--quality" class="hash-link" aria-label="Direct link to Performance &amp; Quality" title="Direct link to Performance &amp; Quality" translate="no">​</a></h4>
<p><a class="" href="https://reactnative.dev/docs/next/images#off-thread-decoding">Like all other image types</a>, Android’s XML resources are loaded and inflated off the main thread so you don’t drop any frames. This means the resource is not guaranteed to display instantly but also does not prevent user input while the resource is loading. Off-thread decoding is especially important when you need to render many icons at the same time. Internal apps realized some significant performance improvements when using Android’s vector drawables.</p>
<p>Utilizing resource types like vector drawables are the perfect way to display images without loss of quality, and can result in smaller APK files since you don't need to include an image type for every screen density. Furthermore, vector drawables are copied from memory once they’re loaded so if you render the same icon more than once they will all display at the same time.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="trade-offs">Trade-offs<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#trade-offs" class="hash-link" aria-label="Direct link to Trade-offs" title="Direct link to Trade-offs" translate="no">​</a></h4>
<p>It’s important to note that drawable XML resources are not perfect, and there are constraints to using them:</p>
<ul>
<li class="">They must be referenced at build time of your Android application. These resources are passed into a build step with the <a href="https://developer.android.com/tools/aapt2" target="_blank" rel="noopener noreferrer" class="">Android Asset Packaging Tool</a> (AAPT) to convert raw XML into binary XML. Android does not support loading raw XML files, <a href="https://issuetracker.google.com/issues/62435069" target="_blank" rel="noopener noreferrer" class="">this is a known limitation</a>.</li>
<li class="">They cannot be loaded over the network by Metro. If you change the directory or name of an XML resource, you will need to rebuild your Android application each time.</li>
<li class="">They have no dimensions. By default, they will display with a 0x0 size and you need to provide a width and height for them to show up.</li>
<li class="">They are not fully customizable at runtime; you can only control dimensions or the overall tint color but you can’t customize individual element attributes <em>inside</em> the resource like stroke widths, border radius, or colors. These types of customizations require different variants of your XML resource.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Android’s vector drawables are not a 1:1 replacement for libraries like <code>react-native-svg</code>. They are designed specifically for Android and do not work for iOS. If you want to have the same SVGs across all platforms, you'll have to continue using <code>react-native-svg</code>. Vector drawables merely offer performance benefits at the expense of customization.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="reactnativefactory-on-ios">ReactNativeFactory on iOS<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#reactnativefactory-on-ios" class="hash-link" aria-label="Direct link to ReactNativeFactory on iOS" title="Direct link to ReactNativeFactory on iOS" translate="no">​</a></h3>
<p>With React Native 0.78 we improved the integration of React Native on iOS.</p>
<p>This version introduces a new class called <code>RCTReactNativeFactory</code> that allows you to create instances of React Native without the need of an AppDelegate. This should allow you to create a new version of React Native in a ViewController, for example. This simplifies dramatically the integration with Brownfield apps.</p>
<p>Imagine that you want to show a React Native view in a View Controller of your app. Starting from React Native 0.78, what you need to do, after installing all the dependencies as shown in <a class="" href="https://reactnative.dev/docs/next/integration-with-existing-apps?language=apple#1-set-up-directory-structure">this guide</a>, is to add this code:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">import React</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">import React_RCTAppDelegate</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">public class ViewController {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  var reactNativeFactory: RCTReactNativeFactory?</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  var reactNativeDelegate: ReactNativeDelegate?</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> public func viewdidLoad() {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   super.viewDidLoad()</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   // …</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"> reactNativeDelegate = ReactNativeDelegate()</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"> reactNativeFactory = RCTReactNativeFactory(delegate: reactNativeDelegate!)</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"> view = reactNativeFactory.rootViewFactory.view(withModuleName: "&lt;your module name&gt;")</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">}</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  override func sourceURL(for bridge: RCTBridge) -&gt; URL? {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    self.bundleURL()</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  override func bundleURL() -&gt; URL? {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    #if DEBUG</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    #else</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    Bundle.main.url(forResource: "main", withExtension: "jsbundle")</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">    #endif</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">}</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="display:inline-block;color:#859900"></span><br></span></code></pre></div></div>
<p>React Native will be loaded in the View Controller as soon as you navigate to it.</p>
<p>This code creates an <code>RCTReactNativeFactory</code>, assigns a delegate to it, and asks it to create a <code>rootView</code> for a React Native’s view.</p>
<p>The delegate is defined below, and it overrides the <code>sourceURL</code> and the <code>bundleURL</code> properties to tell React Native where it can find the JS bundle to load in the view.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="general">General<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#general" class="hash-link" aria-label="Direct link to General" title="Direct link to General" translate="no">​</a></h3>
<ul>
<li class="">React Native DevTools<!-- -->
<ul>
<li class="">Removed FuseboxClient CDP domain</li>
</ul>
</li>
<li class="">Codegen<!-- -->
<ul>
<li class="">Separate component array types and command array types</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h3>
<ul>
<li class="">Nullability changes: migrating <code>RootView</code> to Kotlin resulted in changes of parameter types from nullable to non nullable.</li>
<li class="">The following classes have been moved from public to internal, or removed, and can’t be accessed anymore:<!-- -->
<ul>
<li class=""><code>com.facebook.react.bridge.GuardedResultAsyncTask</code></li>
<li class=""><code>com.facebook.react.uimanager.ComponentNameResolver</code></li>
<li class=""><code>com.facebook.react.uimanager.FabricViewStateManager</code></li>
<li class=""><code>com.facebook.react.views.text.frescosupport.FrescoBasedReactTextInlineImageViewManager</code></li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h3>
<ul>
<li class="">Change Image load event size info from logical size to pixel (This only affects the Old Architecture)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.78 contains over 509 commits from 87 contributors. Thanks for all your hard work!</p>
<p>Thanks to all the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/ds-horizon" target="_blank" rel="noopener noreferrer" class="">Dream11</a> team for the thorough testing of React 19 features in React Native</li>
<li class=""><a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer" class="">Nicola Corti</a> for the work on Faster Releases</li>
<li class=""><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for the work on the Metro logs opt-in</li>
<li class=""><a href="https://github.com/Abbondanzo" target="_blank" rel="noopener noreferrer" class="">Peter Abbondanzo</a> for the work on Android XML Drawable Support</li>
<li class=""><a href="https://github.com/okwasniewski" target="_blank" rel="noopener noreferrer" class="">Oskar Kwaśniewski</a> for the work on the ReactNativeFactory</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-078">Upgrade to 0.78<a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78#upgrade-to-078" class="hash-link" aria-label="Direct link to Upgrade to 0.78" title="Direct link to Upgrade to 0.78" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx </span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">react</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">native</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">community</span><span class="token operator" style="color:#fc929e">/</span><span class="token plain">cli</span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">latest</span><span class="token plain"> init </span><span class="token maybe-class-name">MyProject</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">--</span><span class="token plain">version latest</span><br></span></code></pre></div></div>
<p>If you use Expo, <a href="https://expo.dev/changelog/react-native-78" target="_blank" rel="noopener noreferrer" class="">React Native 0.78 will be supported in a canary release of the Expo SDK</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.78 is now the latest stable version of React Native and 0.75.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.75 in the near future.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[React Native Core Contributor Summit 2024 Recap]]></title>
            <link>https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024</link>
            <guid>https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024</guid>
            <pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Every year, the core contributors in the React Native Community get together with the React Native team to collaboratively shape the direction of this project.]]></description>
            <content:encoded><![CDATA[<p>Every year, the core contributors in the React Native Community get together with the React Native team to collaboratively shape the direction of this project.</p>
<p>Last year was no different—with small exception. We usually meet a day before <a href="https://www.reactuniverseconf.com/" target="_blank" rel="noopener noreferrer" class="">React Universe Conf</a> (formerly React Native EU) at <a href="https://www.callstack.com/open-source" target="_blank" rel="noopener noreferrer" class="">Callstack</a> HQ in Wrocław. In 2024, learning from past experiences, we hosted the Summit for two consecutive days, so that we can have more unstructured time together.</p>
<p><img decoding="async" loading="lazy" alt="all-participants" src="https://reactnative.dev/assets/images/react-native-core-contributor-summit-2024-1-fd96c5042217025035a569cf7ceea4e5.jpeg" width="3000" height="2000" class="img_SS3x"></p>
<p>This annual tradition has become a valuable opportunity for contributors to share insights and voice their concerns, and for the core team to share their plans and gather feedback from key contributors to the React Native ecosystem—including partner companies, individual library authors and friends.</p>
<p>We divided the Summit into two tracks covering following topics:</p>
<ul>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#releases" class="">Releases</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#whats-next-after-the-new-architecture" class="">What's next after the New Architecture?</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#web-apis-for-native-modules" class="">Web APIs spec for Native Modules</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#leancore-20" class="">LeanCore 2.0</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#nitro-modules---unblocking-view-components-by-exposing-props-as-jsivalues" class="">Nitro Modules - Unblocking View Components by exposing props as jsi::Values</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#out-of-tree-platforms--cocoapods" class="">Out Of Tree Platforms &amp; CocoaPods</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#react-native-on-desktop" class="">React Native on Desktop</a></li>
</ul>
<p>In this blog post, we’d like to give you a sneak peek of the results of this gathering.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="releases">Releases<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases" translate="no">​</a></h2>
<p>We had an extensive discussion about the release process for React Native. Core Team appreciates the value of having contributors from outside Meta involved in releases and emphasizes the importance of having nightly releases, which are particularly beneficial for Out-of-Tree platforms like React Native visionOS, library maintainers (Reanimated) and frameworks (Expo). We discussed the frequency of releases, with some folks asking for more frequent releases to ship fixes faster, while others expressed concerns about the impact on 3rd party libraries and upgrading efforts.</p>
<p>We also brainstormed ways to reduce unintentional breaking changes and improve communication about compatibility between React Native and 3rd party dependencies.</p>
<p>This session showed how complex it is to manage releases for React Native, and how delicate this topic is, given all the different parts of the ecosystem that need to be considered.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next-after-the-new-architecture">What's next after the New Architecture?<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#whats-next-after-the-new-architecture" class="hash-link" aria-label="Direct link to What's next after the New Architecture?" title="Direct link to What's next after the New Architecture?" translate="no">​</a></h2>
<p>Now that the New Architecture has shipped as stable, we discussed what we should focus on next. What could be the next big thing? The topics revolved around:</p>
<ul>
<li class=""><strong>Web compatibility</strong> – concluded in the discussion around direction of the React Strict DOM project, which should be treated as a temporary polyfill, while the Xplat team implements proper cross-platform functionality into the core of React Native.</li>
<li class=""><strong>Stabilizing the core API</strong> – turned out we need more consensus on what this means for app developers, library authors, Out-of-Tree platforms. E.g. it may be necessary to extract platform-native logic for iOS and Android from the shared C++ codebase. Part of which was covered by the LeanCore 2.0 discussion.</li>
<li class=""><strong>Old architecture support</strong> – as expected, the team confirmed that new React 19 features based on concurrent rendering, won’t work in old architecture. New features are primarily targeted for the new architecture. Due to blockers in React 19 release schedule it’s still not clear where to draw the line between functionality supported by both new and old architecture.</li>
<li class=""><strong>3rd party libraries for React Native</strong> – today we library authors can use TurboModules, ExpoModules, recently NitroModules to achieve the same goal of bridging native platform functionality. We need better documentation on how to make it well.</li>
<li class=""><strong>Brownfield docs</strong> – at the time of the summit, the official documentation for integrating React Native into native apps was quite dated. Since then the team has followed through with up-to-date and simpler docs for Android and iOS.</li>
<li class=""><strong>Tree-shaking for Metro web</strong> – core Metro team is open to merge the work from the Expo team in this area.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="web-apis-for-native-modules">Web APIs for Native Modules<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#web-apis-for-native-modules" class="hash-link" aria-label="Direct link to Web APIs for Native Modules" title="Direct link to Web APIs for Native Modules" translate="no">​</a></h2>
<p>This session was dedicated to Microsoft's RFC revolving around the idea of bringing a subset of Web APIs to React Native. It aims to enhance React Native’s scalability and attract more web developers by leveraging familiar APIs. Opening access to a wealth of existing open-source web libraries that don't have explicit React Native support.</p>
<p><img decoding="async" loading="lazy" alt="web-apis" src="https://reactnative.dev/assets/images/react-native-core-contributor-summit-2024-2-139b7ce3d6c35e06c8dc1c9dd1ecaada.jpeg" width="3000" height="2000" class="img_SS3x"></p>
<p>Standardizing on Web API specifications is not only beneficial but also essential for React Native growth, and aligns well with our Many Platforms vision and react-strict-dom project. The web offers a unified interface through its specifications, which React Native community modules currently lack. Microsoft has identified around 200 essential Web APIs that could be implemented first for platforms they support: iOS, Android, Windows and macOS.</p>
<p>We encourage library developers to align their APIs with web specifications whenever possible, as this standardization will improve code portability and developer experience across platforms.</p>
<p>While the proposal seems beneficial for the future of React Native, we're still brainstorming the next steps forward. One concern we noticed is governance of the APIs, and whether they’d need to live in a separate repository from the platform implementations. Another around diverging from the official specification in case a specific platform allows for behaviors not specified by the W3C. We would need to figure out how to avoid bundling unnecessary modules, e.g. with a Babel plugin. Not to mention the scope of such initiative is quite large.</p>
<p>The session conclusion reinforced two key points: First, there is strong alignment across the React Native community on adopting web-compatible specifications where possible. Second, we need to establish a clear technical strategy for how these Web API implementations can be maintained separately for different platforms. Microsoft together with Callstack could work on refining the original RFC and produce a proof of concept implementation for a smaller number of APIs as a community initiative. This incremental approach will help us validate the design and developer experience before expanding the scope.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="leancore-20">LeanCore 2.0<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#leancore-20" class="hash-link" aria-label="Direct link to LeanCore 2.0" title="Direct link to LeanCore 2.0" translate="no">​</a></h2>
<p>In 2019, the React Native team started the Lean Core initiative. The goal was to tackle the surface area of React Native’s core and reduce APIs and components that were outdated and legacy. Since then, the React Native components and API surfaces have been long overdue another round of clean up.</p>
<p>Today, there are many components that are not actively being maintained with better community alternatives. Additionally, there are components that have duplicates that should eventually be consolidated for maintainability.</p>
<p>On the API side, a lot of the JS layer APIs are tied to native iOS &amp; Android implementations, rather than being truly platform agnostic. For example, with Pressable, we have props like <code>android_disableSound</code> and <code>android_ripple</code>. Ideally, React Native components should have the smallest possible API surface that is not tied to any specific platform.</p>
<p>As Out-of-Tree platforms are growing and being adopted more by the ecosystem, there needs to be a path to reduce the component and API surface of React Native core, reducing the load on the React Native core team, and also making it significantly easier for Out-of-Tree platform &amp; library maintainers to stay up-to-date.</p>
<p>As an added bonus, this would make it easier for beginner app developers to pick up React Native, as there are less duplicated components and "gotchas" for them to learn. Where there is a better community alternative, developers can be signposted and encouraged to use the community alternatives available.</p>
<p>During the session, we discussed:</p>
<ul>
<li class="">The high level motivations of Lean Core and the benefits to the parties involved (developers, library maintainers, Meta)</li>
<li class="">An aggregated view of what components are being used in some real-world production React Native apps</li>
<li class="">The criteria of what is a candidate to be removed from core</li>
<li class="">A clear action plan for executing Lean Core 2.0 with:<!-- -->
<ul>
<li class="">The high-level process for deprecation</li>
<li class="">Handling cases where Meta is using components internally that have better community alternatives,</li>
</ul>
</li>
</ul>
<p>As a next step, a group of the core contributors will look at collecting more telemetry and data, assessing community alternatives, and putting together an RFC detailing the proposed changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="nitro-modules---unblocking-view-components-by-exposing-props-as-jsivalues">Nitro Modules - Unblocking View Components by exposing props as jsi::Values<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#nitro-modules---unblocking-view-components-by-exposing-props-as-jsivalues" class="hash-link" aria-label="Direct link to Nitro Modules - Unblocking View Components by exposing props as jsi::Values" title="Direct link to Nitro Modules - Unblocking View Components by exposing props as jsi::Values" translate="no">​</a></h2>
<p>Recently, Marc Rousavy introduced Nitro Modules as an alternative approach to creating Native Modules. Nitro Modules utilize experimental C++ Swift Interop and incorporate a bunch of enhancements that can lead to improved performance in certain scenarios. However, during this session, we discussed the various trade-offs involved between Nitro Modules and existing TurboModules.</p>
<p>While Nitro Modules offer some performance benefits, they also have limitations and considerations that need to be addressed. For example, the use of experimental interop features might introduce complexity or compatibility issues that are not present in TurboModules. Our discussion focused on these trade-offs and the potential for upstreaming some of Nitro Modules' improvements into React Native Core, which could allow developers to benefit from more performant modules for everyone.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="out-of-tree-platforms--cocoapods">Out-of-Tree Platforms &amp; CocoaPods<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#out-of-tree-platforms--cocoapods" class="hash-link" aria-label="Direct link to Out-of-Tree Platforms &amp; CocoaPods" title="Direct link to Out-of-Tree Platforms &amp; CocoaPods" translate="no">​</a></h2>
<p>Out-of-Tree Platforms presents the full power of React Native, where we can share one JS codebase between different platforms running on our mobile devices, desktops or even on VR/XR devices. Creating such a platform currently isn’t the easiest process, actually there are no guidelines on how things should be created, developed and maintained. Also React Native Core in a way is tied to Android and iOS platforms. In the future we could aim for a scenario where all the platforms are treated equally and integrate with a C++/JS core through the same APIs.</p>
<p><img decoding="async" loading="lazy" alt="oot-platforms" src="https://reactnative.dev/assets/images/react-native-core-contributor-summit-2024-3-bc9dcff91273a72b85b10b8ec6e9d5a3.jpeg" width="1842" height="1228" class="img_SS3x"></p>
<p>During this session maintainers of different platforms discussed what are the problems, what they struggle with and what should be the solution to unify the process of creating and maintaining new Out-of-Tree platforms.</p>
<p>Another aspect of this session was to discuss CocoaPods and future plans related to managing native dependencies. Recently the CocoaPods team announced that they’ve moved to maintenance mode and new major improvements or features won’t be shipped. There are various alternatives that could be used and during this session we discussed their pros and cons, and what migration would look like.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="react-native-on-desktop">React Native on Desktop<a href="https://reactnative.dev/blog/2025/02/03/react-native-core-contributor-summit-2024#react-native-on-desktop" class="hash-link" aria-label="Direct link to React Native on Desktop" title="Direct link to React Native on Desktop" translate="no">​</a></h2>
<p>Steven and Saad from Microsoft, maintainers of react-native-windows and react-native-macos, hosted a session to listen and gather feedback from contributors related to Desktop platforms. Topics discussed included exploring how to increase adoption of React Native for Desktop (such as having a dedicated workflow in Visual Studio, or exposing desktop as part of Nx), as well as how to support Expo, which is a continual pain point for more adoption.</p>
<p>There’s a big discrepancy in availability of community modules between macOS and Windows, largely due to the fact that iOS code is mostly compatible with macOS, while RNW needs bespoke implementations. While working on the New Architecture for React Native for Windows, the team sees potential in C++ modules allowing for even more code sharing across platforms which will hopefully ease the burden of targeting desktop platforms. It’s worth noting that on the community side Software Mansion is working on adding desktop support for their most popular modules, such as React Native Screens, Gesture Handler and Reanimated.</p>
<hr>
<p>We’re still impressed by how spending several hours together for a couple of days resulted in so much knowledge-sharing and cross-pollination of ideas. During this summit, we planted the seeds for initiatives that will help us improve and re-shape the React Native ecosystem.</p>
<p>If you’re interested in joining the development of React Native, make sure you join our open initiatives and read the <a href="https://reactnative.dev/contributing/overview" target="_blank" rel="noopener noreferrer" class="">contribution guide</a> we have on our website. We hope to meet you in person as well in the future!</p>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.77 - New Styling Features, Android’s 16KB page support, Swift Template]]></title>
            <link>https://reactnative.dev/blog/2025/01/21/version-0.77</link>
            <guid>https://reactnative.dev/blog/2025/01/21/version-0.77</guid>
            <pubDate>Tue, 21 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.77!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.77!</p>
<p>This release ships several features: new styling capabilities such as support for <code>display: contents</code>, <code>boxSizing</code>, <code>mixBlendMode</code>, and <code>outline</code>-related properties to provide a more powerful layout options; Android 16KB page support to be compatible with the newer Android devices. We are also modernizing the community template by migrating it to Swift, while continuing to support and maintain compatibility with Objective-C for developers who prefer it.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://reactnative.dev/blog/2025/01/21/version-0.77#new-css-features-for-better-layouts-sizing-and-blending" class="">New CSS Features for better layouts, sizing and blending</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/01/21/version-0.77#android-version-15-support--16kb-page-support" class="">Android version 15 support &amp; 16KB page support</a></li>
<li class=""><a href="https://reactnative.dev/blog/2025/01/21/version-0.77#community-cli-and-template-updates" class="">Community CLI and Template Updates</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://reactnative.dev/blog/2025/01/21/version-0.77#removal-of-consolelog-streaming-in-metro" class="">Removal of <code>console.log()</code> streaming in Metro</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-css-features-for-better-layouts-sizing-and-blending">New CSS Features for better layouts, sizing and blending<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#new-css-features-for-better-layouts-sizing-and-blending" class="hash-link" aria-label="Direct link to New CSS Features for better layouts, sizing and blending" title="Direct link to New CSS Features for better layouts, sizing and blending" translate="no">​</a></h3>
<p>React Native 0.77 furthers our goal of aligning React Native with the web. We've added support for new CSS properties to give you more control over your app's layout, sizing, and blending. These changes can help simplify complex layouts, add texture, and make your app more accessible.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>All these new features are available only for the <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#how-to-upgrade">New Architecture</a>.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="simpler-layouts-with-display-contents">Simpler layouts with <code>display: contents</code><a href="https://reactnative.dev/blog/2025/01/21/version-0.77#simpler-layouts-with-display-contents" class="hash-link" aria-label="Direct link to simpler-layouts-with-display-contents" title="Direct link to simpler-layouts-with-display-contents" translate="no">​</a></h4>
<p>The <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display#display_contents" target="_blank" rel="noopener noreferrer" class=""><code>display: contents</code></a> prop allows an element to disappear from the layout structure while its children are still rendered as if they were direct children of the parent element. It can be useful for styling purposes where you want to apply styles to child elements without affecting the layout, when building wrapper components which must handle events, or if you need to interact with the ShadowTree.</p>
<p>Technically speaking, <code>display: contents</code> renders an element without generating a layout box, but it preserves the layout boxes of the element’s children. The element with <code>display: contents</code> is effectively flattened out of the view hierarchy.</p>
<p>Let’s have a look at this example where we want to display an alert when a widget is pressed. We have a red <code>Widget</code> inside of a container view:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">Container.jsx</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">Container</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">styles</span><span class="token tag script language-javascript punctuation" style="color:#657b83">.</span><span class="token tag script language-javascript property-access" style="color:#fc929e">container</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">Widget</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="display contents - setup" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAi4AAAIsCAIAAABa4LWDAAAAA3NCSVQICAjb4U/gAAAAknpUWHRSYXcgcHJvZmlsZSB0eXBlIEFQUDEAAHjaVYw7CsMwEER7nWKPMPvRrPY4wcjBEJLg+xcp5BR+zcBjeO053/M8Nvmen/14zSYiIlLRoqLsAWBgYYArFAYgL8W1rJEIAHr5iRsdLDo1nfpvAbU6sT4ONzfHYBkSUFs+tnsrtHt4VNTVdnoaOztnOgf3jPYDroos+BNFvGwAABIUSURBVHja7NoxDsFgGMfhxkZXLtGBI4hJnEDiIhKzYBCHwgE02kR90UN0sRq7G/oNfZ787/Ab3jdpmq+ZmVnEDRIAiEqKAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCK/lJVrzx/mJlZrNX1p9cpKoricNjvdlszM4u1y+Ucwru/KSrL5+12NTOziLvfryEEt6JkOp2t1xszM+tyWZa5FbWWy9XxeDIzsy43ny+kqJWm6Xg8MTOzLjccjqQIAM/cACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEgBTxY6/ObQAAYSAIZqZxkAOemmnAISKa0bVwWgCkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACninchhVu9MB0GK+KFlNysXezkIUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEwGWv7lWkPMAwDF9nkSrHNqVn4Dl8gSTEIglJmZQiIoo2I2IjWNqJNrrMqqD77e7Miu7O7FgOwsi6yPoD99U/zQsvd0pRkqQUJUlKUZIkpShJUoqSJClFSZJSlCRJKUqSlKIkSUpRkqQUJUlSipIkpShJklKUJClFSZKUouTzLNllxitWNla8YsYuq85kY80RM2bMWZ9nuGDGjAXrTplSlO/Kkn1GFpw6w4qRkTkrX+o1l5hwmX0be1xmwiXeuCjv2WfkiLVPmjNyyKnt1rxlZOTYxVpynwkTbnJ8nuFtJky4y4mNE0ZGFpz2DylF+Sae8zsD1zlwhj0GBv7jwJc65h5THrC0ccIDptzjxEV5wj8MXGVpuyV/MvA3r213xA0G/uKpi7XmJVOmPOf0PMMdpkx58fHwGb8ycJPD/iGlKN/EDlcYuMWhM+wzMPA/cz+2A64y8BvvbDfjFwau8Mh2B/zLwDX2/Hh2+IOBOyz6h5Si5Gv6mZ/AY3Zt95C3YP6BfTtmbTIAAjD8JEZdHMSKJlCoOigubg6FxiGD6KCDCB0ytaODipMu7kKxUPsD4pZZx6pTq6aUaqmKVOtmQNoSNKaQkljnfGQItLSE3vMbDl7u4Hivi23W+ADOkNN/UmRAmlSMRYgUhbCXTjPEEZos6e4VLdCgQl3SP1apgUFO6T9pMiAVKQqRohD22FEucQJUdLHOO1pkaFPlh6Q2n8AAFzim/6Q5FFtRiBSFsF8uMgBmdLFMDYyCdT5LarMABjlPKg50IVIUwr7b4huT3GKYa9znJQ22d/shqcQ4Ba5Q5BkrbNG7cxwHy/yUVKEOimT5xTwtHTaZA1mGJDX5yhRF8hQYp0SVli6WeMJTXvOXGe6Q5wabetLiO9OMMsx1HjFLM7aiECkKB8QG0xR4wAs+8oYpbnKbRdrs3B+eM8IYJd4yT5m75JlgQ6+ynOUwWNShwSx1TnKZqzRZparDF2qkyZHTYY0JCtyjzAJzlBhjhBK/Ja3wkMeUmeQ/+3YXWmUdB3D8c/ac1WqtNnJBbRlooWZqNMyEpWLaalnRLnpjtaC7wCAi0FovQlE3xVKXa/TmhEYhUYuIXkFaoBNFdL5OfAE9vgx1vuLO2dm88uLAw/Hgbob8P/zun7vny4////8iq+jmD4Zc2TnW0sBifqSHf/iEepZwSLwEUfitBCFFwbVhgI95k34m8xSv8iyzuIk/eYOdRussrbzGAaqZTyNNPMpETvIOzfQrSMRDlIH1cvSRYpgGyqlF3HHRZlDBNEoBcIplNHOCu3mMJhqZRxX7eYsvOC1Gmr9ZBaZSQw0R+aX5i/fZRjkPUM/zzGc8nXSErSgIKQqubVm+o4XreYTlrGElq+ngZYbZRDvnRveVX2ghzWQ+opOv+JJOPmU2RXxDO4MKMp1S8C9DANhKP6gjYgYVHGQ7WQB0g3HcB4Ah2mnlOmr5jO9p42t+4EMmMUAbXWSQK0OKOy7najVtlMhnhAN8zh7G8Qrf8hMd/EorjzOYZysKN+iCkKJgjOilhWV5Z4V4u1nOMBN4mwWUgoh7aGYKF1jH9tE9xuzgBCU000glQDlP8x63kWEN2xRkEjeDHRwFuMgm+qlkJgmqmMlJdnIG4Dz/gXImAmAXK0E1S1jELQCVNPEuZRxmLQfFGM9SXmcOU5lBJJ8s6+gmYiGLmU4xuJGHWco88RJhKwpCioKxlqIP8s4K8bo4TJJFzCIhx+28BI6w0dX7n11kWcgzFCHXXBoYIUWXgtzKNCIy9AKk6GOQuVSCMh5khH2kAPo4RpI7qQLAzxwnyRPMISFHgidZQJYt9CBXMTXUUaJQGX4jSzX13CVHEROYLV6CopCiIKQoGCMquJf7884UMdL8ToZi6kiKUQtO0Uva1ciwgWPgOW4Qo5gXwHl6GHBlEbUkybIZYC+X2LmbF6vKOA7gn/syc69zZxrnxVR0MWph45hOWEKYUZZGBUWL/oaIiILWRi1aRZuKghYRtIikclMLoUXaixK+wFA6muOo5VsyDs7YvN57T6u7OHDOcOeOwow8H367A4dzHn6cL+ecH88/4AnyoIV+igxyAeA4KLGNIsAUB5ilmRcpSFDiBXCZASbE5Ommlfrd4mewLuUVKk9RsmwYWwhCFAWLx2N8xv456xMJRrhKRIVjfJFUR1DbBXxCI25ylRnwkFRbyVNllOvqso0cZQ5RpcIAw5R4hBzIs55N/M0ppsCvoBS/nutcIyJLnyS1QznK/MsY4jLm5xqjoItVUoR/RUGIomDxK7GWnjlrjQRjlME0b/NqUu0FmGFKIyaZAlghVRurwQzj6rKZIlWGucwIg9xiB2vIAKyknzKnGa1NrKGFXtSMUwZZOiXL0E4XmGDKQt0kAkVKUoQPdMHtlg9LECweZSKQoUmqJlDQoApVgGakWwYiKurSytPsY4IzdDAEtTnvmk4eIFMbrrvBDbKsY23SaqBJqiyF2H0tyCxAjqwUYWwhCG9FwV2sQBaU+J3BOetjVmhEkWaAm1KVuQLylNRrF5jgJEOcosAWWlBTpI8eBjjPH1TIs4ssakrkQMS4VFOMgGUULFQbwAzT5qeJLlbSFp4sQYiiYOlaThFERKyZs7rIaUQr7eTAWakuMA5a6FCv7WCSEwxyjX7uJy+mh14mOcUAVXI8LKaTVjJUOS9ZlYtMkKGdkoXqpgjGGDU/q3iDj3ieYujmIERRsER10EuOMj8RuSNa6aMdHCCS7EdQ4D5WqNdGVjHNMU6Cfu5F3Go2kOVPjlKhhT4xHdTmIBwkkqDML+AeNtBmobrZAi4xJEFEJFkHe3iZrTSHbg5CFAVLVI6XaGKWfZxDyg7WA1Q1bidrwdecluASn4PlPEdevVp4iirD/EaRPjoQ184mOjnCcapsZSXiaqvhWy5KcJZvwEa2k7NQTTwLznGIMcSNciZ0ahCiKLi77eFRqhzlfYbFVPiBN3mHwxq3mWdo5QJ7GRJzhQ84QY6dPGl+HgfjXGQ9vRRShrB7OMcIEbvJJp1qD1WO8yGXxZznXf6ind08iNsURRsY5zsOMImaG3zJ95LNcpaDXKIaWjkIURQsXd28Rw//8RWv82ltK5r9vMZbHOYKJY0r8Qo7yPqffft5saoO4DD8OBaUqUQZSj+gRrKwEBENFwm18H+IUBNSCyEXRiVFNNQiiCCpVYiarSRcFAMlkUhgCBK0qkRDchNuQpnUKcymZZR30ehMOPQ+fJb38oVzz+WFezlG2cy7fMFhdvMse7nEEl7kdpOzCkwwwYPca7DF3MVlJsBqA8zndZZynr1sYw+HOcR7rOcTbmQN65lnCsxiKU9zM8d5hZf5iM/YzWZ2csZgJ3ierbzNT93KKUWZ0R5hH8sZ43NeZR1PspV9nGI1b/GQa3IfO1nLb3zJCBvZwA4+5RzL2M0KkzbMEjDEYu402EKWcguYw3KDPcweVnKWUV5iA0/xGl/xO2t5k/tNmbmsYxM3cJJdbGMTOxjlNjYyxz9NcJqDfMcRfu4+Ts8VZUabzaOM8iH7OAGARWzhGRYx5JoM8QAH2M/7fM1ZgCVsYDMLruqUm1jDCe5hBXMMNpuVLOQUj3GrwYZYxcd8cMXVWMEWnmA+s0yZWdzNCMt4h+NcAHPZwnN8y0EuXvGuxTzOIVazqPs4kzI2Nn79bNeuPQsW3IGRkTfGxsbbTNkE07SL/MBRjvA9v07PKZc4zTGOcpJxJq7LXeQkRznGj1ye/hMvcJwjfMO5f/H685z5+8f0x7z5fUFm0LZvfwHDw8P79x/4L88tRW1qUtTaXytFpWiS6we6JEn/FSVJSlGSJKUoSVKKkiQpRUmSUpQkSSlKkpSiJElKUZKkFCVJUoqSJKUoSZJSlCQpRUmSlKIkSSlKkqQUJUlKUZIkpShJUoqSJClFSZJSlCRJKUqSlKIkSUpRkqQUJUlSipIkpShJklKUJClFSZKUoiRJKUqSpBQlSUpR/vd+GRvvIiS5akNdgiRJKUqSP9mrAwEAAAAAIP/XRpjQiqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6pK+3VswiAUhWHUIjsHOyEjCGktUgQnECtxBC10D0FsRRttbZ6K5+fMcD+uSZGZmUmRmZmZFJmZmRSZmZndJEVt2+T5H4CQ+r6Tom1lWcTxG4CQ6rqKztgruuTGdZ5WM7NHbBimS0nTb5J8ADhLlv0CX/4lRQCwJ0UASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQBw0AxE4nKw8dxXowAAAABJRU5ErkJggg==" width="558" height="556" class="img_SS3x"></p>
<p>Now, let's build a new <code>Alerting</code> wrapper component, with the goal of alerting the user when a component beneath it is pressed, using <a class="" href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native">experimental pointer events</a>. For clarity, the background of this component is made blue. That might look something like the component below:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">Container.jsx</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">Alerting</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter punctuation" style="color:#657b83">{</span><span class="token parameter">children</span><span class="token parameter punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'blue'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">onPointerDown</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript arrow operator" style="color:#fc929e">=&gt;</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript function" style="color:#79b6f2">alert</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript string" style="color:#8dc891">'Hello World!'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">children</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">Container</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">styles</span><span class="token tag script language-javascript punctuation" style="color:#657b83">.</span><span class="token tag script language-javascript property-access" style="color:#fc929e">container</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">Alerting</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">Widget</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">Alerting</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>This doesn’t do quite what we want it to. <code>Alerting</code> adds a new layout box, with its own bounds, separate from the child <code>Widget</code>. Depending on the styling of the element it is wrapping, this may result in significant visual and functional changes. In this example, the blue background responds to taps with an alert when we want for only the red "Hello World" box to alert when tapped.</p>
<p><img decoding="async" loading="lazy" alt="before display contents" src="https://reactnative.dev/assets/images/0.77-display-contents-2-593d0e47100de84ddad130e44df8e29b.gif" width="387" height="480" class="img_SS3x"></p>
<p>If we try this again, while setting <code>display: contents</code> on the <code>View</code> wrapper of <code>Alerting</code>, we only see alerts when the user presses within the original bounds of the <code>Widget</code>. This is because <code>Alerting</code> no longer adds its own box, but can still observe the pointer events bubbled from <code>Widget</code>.</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">Container.jsx</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">Alerting</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter punctuation" style="color:#657b83">{</span><span class="token parameter">children</span><span class="token parameter punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">display</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'contents'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">onPointerDown</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript arrow operator" style="color:#fc929e">=&gt;</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript function" style="color:#79b6f2">alert</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript string" style="color:#8dc891">'Hello World!'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">children</span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// ... function Container ...</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="after display contents" src="https://reactnative.dev/assets/images/0.77-display-contents-3-84116bf7857e21e84bca5890a2d9e00c.gif" width="387" height="480" class="img_SS3x"></p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="box-sizing">Box sizing<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#box-sizing" class="hash-link" aria-label="Direct link to Box sizing" title="Direct link to Box sizing" translate="no">​</a></h4>
<p>The <code>boxSizing</code> prop defines how the element's various sizing props (<code>width</code>, <code>height</code>, <code>minWidth</code>, <code>minHeight</code>, etc.) are computed. If <code>boxSizing</code> is <code>border-box</code>, these sizes apply to the border box of the element. If it is <code>content-box</code> they apply to the content box of the element. The default value is <code>border-box</code>, this is different from the default value on the web. The <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing" target="_blank" rel="noopener noreferrer" class="">web documentation</a> is a good source of information if you wish to learn more about how this prop works.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p><code>border-box</code> has been the default forever at this point, and has been the only <code>boxSizing</code> value up until we added <code>content-box</code>. Changing the default would have been a breaking change that would suddenly break several layouts. We decided to keep <code>border-box</code> as default value to ensure backward compatibility.</p></div></div>
<p>To understand the difference between <code>border-box</code> and <code>content-box</code>, have a look at these example, where both <code>View</code>s have <code>padding: 20</code> and <code>borderWidth: 10</code>. When using <code>border-box</code>, we consider border and padding for the sizing; when using <code>content-box</code>, we consider only the content for the sizing.</p>
<p><img decoding="async" loading="lazy" alt="after display contents" src="https://reactnative.dev/assets/images/0.77-border-box-cfc6104410ab403e0f7b4809fb2087fe.png" width="552" height="572" class="img_SS3x"></p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="css-mixblendmode">CSS mixBlendMode<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#css-mixblendmode" class="hash-link" aria-label="Direct link to CSS mixBlendMode" title="Direct link to CSS mixBlendMode" translate="no">​</a></h4>
<p>The <code>mixBlendMode</code> prop lets you control how an element blends its colors with the other elements in its <strong>stacking context</strong>. Check out the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode" target="_blank" rel="noopener noreferrer" class="">MDN documentation</a> for a full overview of each blending function.</p>
<p>To help have more granular control about what is blending together, we also added the <code>isolation</code> property. Setting <code>isolation: isolate</code> on a <code>View</code> will force it to form a <strong>stacking context</strong>. So, you can set this on some ancestor <code>View</code> to ensure that some descendent <code>View</code> with <code>mixBlendMode</code> does not blend beyond the <strong>isolated</strong> <code>View</code>.</p>
<h5 class="anchor anchorTargetStickyNavbar_tleR" id="mixblendmode-values">mixBlendMode Values<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#mixblendmode-values" class="hash-link" aria-label="Direct link to mixBlendMode Values" title="Direct link to mixBlendMode Values" translate="no">​</a></h5>
<ul>
<li class=""><code>normal</code>: The element is drawn on top of its background without blending.</li>
<li class=""><code>multiply</code>: The source color is multiplied by the destination color and replaces the destination.</li>
<li class=""><code>screen</code>: Multiplies the complements of the backdrop and source color values, then complements the result.</li>
<li class=""><code>overlay</code>: Multiplies or screens the colors, depending on the backdrop color value.</li>
<li class=""><code>darken</code>: Selects the darker of the backdrop and source colors.</li>
<li class=""><code>lighten</code>: Selects the lighter of the backdrop and source colors.</li>
<li class=""><code>color-dodge</code>: Brightens the backdrop color to reflect the source color. Painting with black produces no changes.</li>
<li class=""><code>color-burn</code>: Darkens the backdrop color to reflect the source color. Painting with white produces no change.</li>
<li class=""><code>hard-light</code>: Multiplies or screens the colors, depending on the source color value. The effect is similar to shining a harsh spotlight on the backdrop.</li>
<li class=""><code>soft-light</code>: Darkens or lightens the colors, depending on the source color value. The effect is similar to shining a diffused spotlight on the backdrop.</li>
<li class=""><code>difference</code>: Subtracts the darker of the two constituent colors from the lighter color.</li>
<li class=""><code>exclusion</code>: Produces an effect similar to that of the Difference mode but lower in contrast.</li>
<li class=""><code>hue</code>: Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color.</li>
<li class=""><code>saturation</code>: Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color.</li>
<li class=""><code>color</code>: Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color. This preserves the gray levels of the backdrop and is useful for coloring monochrome images or tinting color images.</li>
<li class=""><code>luminosity</code>: Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color. This produces an inverse effect to that of the Color mode.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="blend mode" src="https://reactnative.dev/assets/images/0.77-blend-mode-434273fec000ab313596eb9c0b4c856b.png" width="866" height="214" class="img_SS3x"></p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="outline-props">Outline props<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#outline-props" class="hash-link" aria-label="Direct link to Outline props" title="Direct link to Outline props" translate="no">​</a></h4>
<p>We’ve also introduced <code>outlineWidth</code>, <code>outlineStyle</code>, <code>outlineSpread</code> and <code>outlineColor</code>. These outline props work very similar to the respective <code>border</code> props, but it is rendered around the <strong>border box</strong> as opposed to around the <strong>padding box</strong>. These props allow to highlight elements by drawing their outline without affecting their layout.</p>
<p>Check out the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/outline" target="_blank" rel="noopener noreferrer" class="">MDN documentation</a> for more details.</p>
<p><img decoding="async" loading="lazy" alt="outline props" src="https://reactnative.dev/assets/images/0.77-outline-props-4f2aec2904024a80275f98a9f2bb7b92.png" width="656" height="478" class="img_SS3x"></p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-version-15-support--16kb-page-support">Android version 15 support &amp; 16KB page support<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#android-version-15-support--16kb-page-support" class="hash-link" aria-label="Direct link to Android version 15 support &amp; 16KB page support" title="Direct link to Android version 15 support &amp; 16KB page support" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="forced-edge-to-edge-on-android-15">Forced edge-to-edge on Android 15<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#forced-edge-to-edge-on-android-15" class="hash-link" aria-label="Direct link to Forced edge-to-edge on Android 15" title="Direct link to Forced edge-to-edge on Android 15" translate="no">​</a></h4>
<p>We’ve already done some work to support Android 15 on the prior release. One of the noticeable changes in Android 15 is forced edge-to-edge display when you build apps with <code>targetSdk</code> 35.</p>
<p>If you have not looked into this yet, please refer to our prior <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/827" target="_blank" rel="noopener noreferrer" class="">recommendation</a> on how this should be handled as ignoring this can potentially break your UI in the app.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>If you are using the <a href="https://www.npmjs.com/package/react-native-safe-area-context" target="_blank" rel="noopener noreferrer" class=""><code>react-native-safe-area-context</code></a> in your app, the library is already handling the forced edge-to-edge for you.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="16-kb-page-size-support-for-android">16 KB page size support for Android<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#16-kb-page-size-support-for-android" class="hash-link" aria-label="Direct link to 16 KB page size support for Android" title="Direct link to 16 KB page size support for Android" translate="no">​</a></h4>
<p>Android 15 introduces support for 16KB memory page size enabling <a href="https://developer.android.com/guide/practices/page-sizes#benefits" target="_blank" rel="noopener noreferrer" class="">performance improvements</a> for apps and more, but making previous 4KB-based apps potentially incompatible on future devices; it's currently an opt-in feature for developers to test on select devices to prepare for 16 KB page size being the OS default.</p>
<p>With the 0.77 release, React Native is ready to fully support 16 KB page size and developers will be able to test and ship apps for 16 KB devices using it.</p>
<p>Please refer to <a href="https://developer.android.com/guide/practices/page-sizes" target="_blank" rel="noopener noreferrer" class="">the official Android Developers site</a> for further information on 16 KB support.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="community-cli-and-template-updates">Community CLI and Template Updates<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#community-cli-and-template-updates" class="hash-link" aria-label="Direct link to Community CLI and Template Updates" title="Direct link to Community CLI and Template Updates" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="community-cli-react-native-init-deprecation">Community CLI: react-native init deprecation<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#community-cli-react-native-init-deprecation" class="hash-link" aria-label="Direct link to Community CLI: react-native init deprecation" title="Direct link to Community CLI: react-native init deprecation" translate="no">​</a></h4>
<p>This version fully completes the deprecation of the <code>react-native init</code> command that was <a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#sunsetting-react-native-init">introduced in React Native 0.75</a>.</p>
<p>As a reminder, you won’t be able to use the <code>react-native init</code> command anymore, but you’ll have to either:</p>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps">Use a framework</a> such as Expo, with its own dedicated command to create a new project: <code>npx create-expo-app</code></li>
<li class="">Invoke the Community CLI directly with <code>npx @react-native-community/cli init</code></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="community-cli-removal-of-run-on-iosandroid-key-handlers-from-metro">Community CLI: Removal of "run on iOS/Android" key handlers from Metro<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#community-cli-removal-of-run-on-iosandroid-key-handlers-from-metro" class="hash-link" aria-label="Direct link to Community CLI: Removal of &quot;run on iOS/Android&quot; key handlers from Metro" title="Direct link to Community CLI: Removal of &quot;run on iOS/Android&quot; key handlers from Metro" translate="no">​</a></h4>
<p>In this version, we removed the ‘a’ and ‘i’ keyboard shortcuts from Metro. Those shortcuts were used to invoke the <code>run-android</code> &amp; <code>run-ios</code> community CLI commands.
Those keyboard shortcuts provided worse developer experience and were rarely used. Moreover, we believe that frameworks are better suited to orchestrate the terminal outputs.</p>
<p>You can read more about this change <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/821" target="_blank" rel="noopener noreferrer" class="">in this dedicated post</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="community-template-swift-as-programming-language-for-ios-apps">Community Template: Swift as programming language for iOS apps<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#community-template-swift-as-programming-language-for-ios-apps" class="hash-link" aria-label="Direct link to Community Template: Swift as programming language for iOS apps" title="Direct link to Community Template: Swift as programming language for iOS apps" translate="no">​</a></h4>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Projects using Expo should not be affected by this change.</p></div></div>
<p>This change let us slim down the community template by replacing three files (<code>main.m</code>, <code>AppDelegate.h</code> and <code>AppDelegate.mm</code>) with a single, new <a href="https://github.com/react-native-community/template/blob/main/template/ios/HelloWorld/AppDelegate.swift" target="_blank" rel="noopener noreferrer" class=""><code>AppDelegate.swift</code></a>.</p>
<p>This is technically a breaking change: you’ll see the change from Objective-C to Swift in the upgrade helper like this:</p>
<p><img decoding="async" loading="lazy" alt="Swift Upgrade Helper" src="https://reactnative.dev/assets/images/0.77-swift-upgrade-helper-abe4ca2c5be24c5d4f7612250042b077.png" width="1600" height="835" class="img_SS3x"></p>
<p>You don’t have to migrate to Swift: the Objective-C++ variant of the iOS community template is still supported (note that you still need to integrate the <a href="https://reactnative.dev/blog/2025/01/21/version-0.77#rctappdependencyprovider" class=""><code>RCTAppDependencyProvider</code></a>). New projects will be generated by using Swift as the iOS app language, although you can always migrate back to Objective-C if you need to.</p>
<h5 class="anchor anchorTargetStickyNavbar_tleR" id="limitations">Limitations<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#limitations" class="hash-link" aria-label="Direct link to Limitations" title="Direct link to Limitations" translate="no">​</a></h5>
<p>If your app has some local modules that are written in C++, you would not be able to register them in Swift as shown in <a class="" href="https://reactnative.dev/docs/next/the-new-architecture/pure-cxx-modules#3-registering-the-cxx-turbo-native-module-in-your-app">this guide</a>.</p>
<p>If your app falls in this category, please skip the migration of the AppDelegate to Swift, and keep using Objective-C++ for your app.</p>
<p>React Native core is mostly developed using C++ to encourage code sharing between iOS and Android and other platforms. The interoperability between Swift and C++ is not mature nor stable, yet. We are looking into ways to fill this gap and let you migrate to Swift too.</p>
<h5 class="anchor anchorTargetStickyNavbar_tleR" id="rctappdependencyprovider">RCTAppDependencyProvider<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#rctappdependencyprovider" class="hash-link" aria-label="Direct link to RCTAppDependencyProvider" title="Direct link to RCTAppDependencyProvider" translate="no">​</a></h5>
<p>React Native 0.77 slightly changes how the app loads third party dependencies. This is a new line in the community template that, if missed, can cause some runtime issues. Make sure to add it to your app.</p>
<p>The equivalent Objective-C lines are the following:</p>
<div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockTitle_kY6l">AppDelegate.mm</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property string" style="color:#8dc891">"AppDelegate.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">React</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">RCTBundleURLProvider</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">import</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression operator" style="color:#fc929e">&lt;</span><span class="token macro property expression" style="color:#2aa198">ReactAppDependencyProvider</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">RCTAppDependencyProvider</span><span class="token macro property expression punctuation" style="color:#657b83">.</span><span class="token macro property expression" style="color:#2aa198">h</span><span class="token macro property expression operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">@implementation</span><span class="token plain"> AppDelegate</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">BOOL</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">application</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UIApplication </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">application didFinishLaunchingWithOptions</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">NSDictionary </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">launchOptions</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">self</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">moduleName </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">@"&lt;Your app Name&gt;"</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">self</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">dependencyProvider </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">RCTAppDependencyProvider new</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// You can add your custom initial props in the dictionary below.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// They will be passed down to the ViewController used by React Native.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">self</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">initialProps </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">@</span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token keyword" style="color:#c5a5c5">super</span><span class="token plain"> application</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">application didFinishLaunchingWithOptions</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">launchOptions</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// remaining of the AppDelegate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking Changes<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removal-of-consolelog-streaming-in-metro">Removal of <code>console.log()</code> streaming in Metro<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#removal-of-consolelog-streaming-in-metro" class="hash-link" aria-label="Direct link to removal-of-consolelog-streaming-in-metro" title="Direct link to removal-of-consolelog-streaming-in-metro" translate="no">​</a></h3>
<p>We want every aspect of React Native debugging to behave reliably and to match the functionality of modern browser tooling. To meet this quality bar, log forwarding via Metro, originally deprecated in 0.76, is removed in 0.77.</p>
<p>This integration relied on a custom approach to communicate with the debugging target on device. With this change, we are moving exclusively to the Chrome DevTools Protocol (CDP).</p>
<ul>
<li class="">To view JS logs, please use <a class="" href="https://reactnative.dev/docs/react-native-devtools">React Native DevTools</a> and its fully featured Console panel — supporting log filtering, rich object inspection, Live Expressions, and more.</li>
<li class="">You can also connect VS Code as a CDP debugger, via third party extensions such as <a href="https://github.com/expo/vscode-expo" target="_blank" rel="noopener noreferrer" class="">Expo Tools</a> and <a href="https://ide.swmansion.com/" target="_blank" rel="noopener noreferrer" class="">Radon IDE</a>.<!-- -->
<ul>
<li class="">Please note that these integrations are not directly supported by the React team. However, we are working on first party VS Code support in 2025.</li>
</ul>
</li>
<li class="">Expo continues to offer log streaming in Expo CLI.</li>
</ul>
<p>For more info, see <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=Why%20are%20JavaScript%20logs%20leaving%20Metro%3F" target="_blank" rel="noopener noreferrer" class=""><em>Why are JavaScript logs leaving Metro?</em></a></p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="general">General<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#general" class="hash-link" aria-label="Direct link to General" title="Direct link to General" translate="no">​</a></h4>
<ul>
<li class="">Animation<!-- -->
<ul>
<li class="">Native looping animation do not send a React state update every time the loop ends.</li>
</ul>
</li>
<li class="">Layout<!-- -->
<ul>
<li class=""><code>position</code> of sticky headers on <code>ScrollView</code> will now be taken into account.</li>
<li class="">Absolute positioning is now behaving in a more compliant way</li>
</ul>
</li>
<li class="">JS Modules:<!-- -->
<ul>
<li class="">Remove <code>ReactFabricInternals</code> module<!-- -->
<ul>
<li class="">This is not going to be accessible anymore</li>
</ul>
</li>
</ul>
</li>
<li class="">Native Modules<!-- -->
<ul>
<li class=""><code>NativeModules</code> object can now be used to load turbomodules in JS .<!-- -->
<ul>
<li class="">This improves compatibility between Native Modules and Turbo Native Modules</li>
</ul>
</li>
</ul>
</li>
<li class="">Packages<!-- -->
<ul>
<li class="">dev-middleware: Frameworks should specify <code>serverBaseUrl</code> relative to the middleware host</li>
</ul>
</li>
<li class="">API Changes:<!-- -->
<ul>
<li class="">Removed type for <code>useConcurrentRoot</code> from <code>AppRegistry</code>, as it was already ignored</li>
<li class="">Removed <code>refs</code> property from <code>NativeMethods</code> TypeScript definition.</li>
</ul>
</li>
<li class="">UX Changes:<!-- -->
<ul>
<li class="">Remove "run on iOS" and "run on Android" from the dev server key commands</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class="">Kotlin<!-- -->
<ul>
<li class="">This is the first version of React Native that builds against Kotlin 2.0.21. You can read more about the changes coming with Kotlin 2.0 on the <a href="https://kotlinlang.org/docs/whatsnew2020.html" target="_blank" rel="noopener noreferrer" class="">language release notes</a>.</li>
</ul>
</li>
<li class="">API Changes:<!-- -->
<ul>
<li class="">Nullability:<!-- -->
<ul>
<li class="">Non-primitive getters in <code>ReadableArray</code> are now correctly typed as optional</li>
<li class="">Make <code>ReactHost.createSurface()</code> method non nullable</li>
</ul>
</li>
<li class="">Renamed:<!-- -->
<ul>
<li class=""><code>DevSupportManagerBase.getCurrentContext()</code> to <code>DevSupportManagerBase.getCurrentReactContext()</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Additionally, several APIs have been removed or restricted in visibility, so they can’t be accessed anymore. Those APIs were internal and not needed to React Native developers directly. You can find the full list below:</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary>List of Removed Android APIs:</summary><div><div class="collapsibleContent_Fd2D"><p>The following packages are now internal and can’t be accessed anymore:</p><ul>
<li class=""><code>com.facebook.react.views.progressbar</code></li>
<li class=""><code>com.facebook.react.views.safeareaview</code></li>
<li class=""><code>com.facebook.react.modules.accessibilityinfo</code></li>
<li class=""><code>com.facebook.react.modules.appstate</code></li>
<li class=""><code>com.facebook.react.modules.clipboard</code></li>
<li class=""><code>com.facebook.react.modules.devmodule</code></li>
<li class=""><code>com.facebook.react.modules.reactdevtoolssettings</code></li>
<li class=""><code>com.facebook.react.views.unimplementedview</code></li>
</ul><p>The following classes are now either internal or have been removed, so can’t be accessed anymore:</p><ul>
<li class=""><code>BackHandler.removeEventListener</code></li>
<li class=""><code>BaseViewManagerInterface</code></li>
<li class=""><code>BindingImpl</code></li>
<li class=""><code>CompositeReactPackage</code></li>
<li class=""><code>DebugOverlayTags</code></li>
<li class="">Method <code>create()</code> from <code>DefaultDevSupportManagerFactory</code></li>
<li class=""><code>DevToolsReactPerfLogger</code></li>
<li class=""><code>FabricComponents</code></li>
<li class=""><code>ImageStoreManager</code></li>
<li class=""><code>InteropModuleRegistry</code></li>
<li class=""><code>NativeModulePerfLogger</code></li>
<li class=""><code>NoopPrinter</code></li>
<li class=""><code>NotThreadSafeViewHierarchyUpdateDebugListener</code></li>
<li class=""><code>OkHttpCallUtil</code></li>
<li class=""><code>PrinterHolder</code></li>
<li class=""><code>Printer</code></li>
<li class=""><code>ReactDebugOverlayTags</code></li>
<li class=""><code>ReactNativeFlipper</code></li>
<li class=""><code>ReactViewBackgroundManager</code></li>
<li class=""><code>ReactViewGroup.getBackgroundColor()</code></li>
<li class=""><code>ReactVirtualTextShadowNode</code></li>
<li class=""><code>ReactVirtualTextViewManager</code></li>
<li class=""><code>SimpleSettableFuture</code></li>
<li class=""><code>SwipeRefreshLayoutManager</code></li>
<li class=""><code>TaskCompletionSource</code></li>
<li class="">Parameter <code>jsBundleLoader</code> from DefaultReactHost.getDefaultReactHost()</li>
</ul></div></div></details>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<ul>
<li class="">API Changes<!-- -->
<ul>
<li class="">Removed<!-- -->
<ul>
<li class=""><code>RCTConstants.RCTGetMemoryPressureUnloadLevel</code></li>
<li class=""><code>partialBatchDidFlush</code></li>
<li class=""><code>RCTRuntimeExecutor</code></li>
<li class=""><code>UseNativeViewConfigsInBridgelessMode</code>
<ul>
<li class="">Replaced by a proper feature flag</li>
</ul>
</li>
<li class=""><code>UseTurboModuleInteropForAllTurboModules</code>
<ul>
<li class="">Interop layer is always on for TMs</li>
</ul>
</li>
</ul>
</li>
<li class="">Changed<!-- -->
<ul>
<li class="">Replace uses of <code>CGColorRef</code> with <code>UIColor</code></li>
</ul>
</li>
</ul>
</li>
<li class=""><code>RCTAppDelegate</code> now requires to use the <code>RCTDependencyProvider</code> to load third party dependencies</li>
<li class="">CocoaPods sets C++ version for all the 3rd party dependencies to avoid compilation issues.</li>
</ul>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>React 19?</strong></summary><div><div class="collapsibleContent_Fd2D"><p>React 19 was released the 6th of December 2024.
At the time, we already cut the branch for React Native 0.77 and we already released three RCs for React Native 0.77.
It was too late in the release of React Native 0.77 to introduce React 19 in this release.</p><p>React 19 will be shipped in React Native 0.78, and we already cut the branch for this version. You can try it by creating a new app with the command:</p><div class="language-no-syntax codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-no-syntax codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli init YourReact19App --version 0.78.0-rc.0</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.77 contains over <strong>1061</strong> commits from <strong>161</strong> contributors. Thanks for all your hard work!</p>
<p>Thanks to all the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/j-piasecki" target="_blank" rel="noopener noreferrer" class="">Jakub Piasecki</a> for contributing to the <code>display: contents</code> feature</li>
<li class=""><a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer" class="">Nick Gerleman</a>, <a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer" class="">Joe Vilches</a> and <a href="https://github.com/jorge-cab" target="_blank" rel="noopener noreferrer" class="">Jorge Cabiedes Acosta</a> for releasing the new styling features</li>
<li class=""><a href="https://github.com/alanleedev" target="_blank" rel="noopener noreferrer" class="">Alan Lee</a> for the Android 16Kb page support content</li>
<li class=""><a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> and <a href="https://github.com/okwasniewski" target="_blank" rel="noopener noreferrer" class="">Oskar Kwaśniewski</a> for supporting the migration of the template to Swift</li>
<li class=""><a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer" class="">Nicola Corti</a> for the <code>react-native init</code> deprecation cycle content</li>
<li class=""><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for the content on the removal of <code>console.log</code> from metro</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-077">Upgrade to 0.77<a href="https://reactnative.dev/blog/2025/01/21/version-0.77#upgrade-to-077" class="hash-link" aria-label="Direct link to Upgrade to 0.77" title="Direct link to Upgrade to 0.77" translate="no">​</a></h3>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.77 will be supported in Expo SDK 52 (instructions on how to update React Native inside your Expo project to 0.77.0 will be available in a separate Expo blog post in the near future).</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.77 is now the latest stable version of React Native and 0.74.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md#releases-support-policy" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.74 in the near future.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[New Architecture is here]]></title>
            <link>https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here</link>
            <guid>https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here</guid>
            <pubDate>Wed, 23 Oct 2024 16:01:00 GMT</pubDate>
            <description><![CDATA[React Native 0.76 with the New Architecture by default is now available on npm!]]></description>
            <content:encoded><![CDATA[<p>React Native 0.76 with the New Architecture by default is now available on npm!</p>
<p>In the <a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture">0.76 release blog post</a>, we shared a list of significant changes included in this version. In this post, we provide an overview of the New Architecture and how it shapes the future of React Native.</p>
<p>The New Architecture adds full support for modern React features, including <a href="https://react.dev/blog/2022/03/29/react-v18#new-suspense-features" target="_blank" rel="noopener noreferrer" class="">Suspense</a>, <a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-transitions" target="_blank" rel="noopener noreferrer" class="">Transitions</a>, <a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching" target="_blank" rel="noopener noreferrer" class="">automatic batching</a>, and <a href="https://react.dev/reference/react/useLayoutEffect" target="_blank" rel="noopener noreferrer" class=""><code>useLayoutEffect</code></a>. The New Architecture also includes new <a class="" href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Module</a> and <a class="" href="https://reactnative.dev/docs/next/fabric-native-components-introduction">Native Component</a> systems that let you write type-safe code with direct access to native interfaces without a bridge.</p>
<p>This release is the result of a ground-up rewrite of React Native we’ve been working on since 2018, and we’ve taken extra care to make the New Architecture a gradual migration for most apps. In 2021, we created <a href="https://github.com/reactwg/react-native-new-architecture/" target="_blank" rel="noopener noreferrer" class="">the New Architecture Working Group</a> to collaborate with the community on ensuring a smooth upgrade experience for the entire React ecosystem.</p>
<p>Most apps will be able to adopt React Native 0.76 with the same level of effort as any other release. The most popular React Native libraries already support the New Architecture. The New Architecture also includes an automatic interoperability layer to enable backward compatibility with libraries targeting the old architecture.</p>
<p>Over the past several years of development, our team has publicly shared our vision for the New Architecture. If you missed any of these talks, check them out here:</p>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=52El0EUI6D0" target="_blank" rel="noopener noreferrer" class="">React Native EU 2019 - The New React Native</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=FZ0cG47msEk" target="_blank" rel="noopener noreferrer" class="">React Conf 2021 - React 18 Keynote</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=Q6TkkzRJfUo" target="_blank" rel="noopener noreferrer" class="">App.js 2022 - Bringing the New React Native Architecture to the OSS Community</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=Q5SMmKb7qVI" target="_blank" rel="noopener noreferrer" class="">React Conf 2024 - Day 2 Keynote</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="what-is-the-new-architecture">What is the New Architecture<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#what-is-the-new-architecture" class="hash-link" aria-label="Direct link to What is the New Architecture" title="Direct link to What is the New Architecture" translate="no">​</a></h2>
<p>The New Architecture is a complete rewrite of the major systems that underpin React Native, including how components are rendered, how JavaScript abstractions communicates with native abstractions, and how work is scheduled across different threads. Although most users should not have to think about how these systems work, these changes bring improvements and new capabilities.</p>
<p>In the old architecture, React Native communicated with the native platform using an asynchronous bridge. To render a component or call a native function, React Native needed to serialize and enqueue native functions calls with the bridge, which would be processed asynchronously. The benefit of this architecture is that the main thread was never blocked for rendering updates or handling native module function calls, since all work was done on a background thread.</p>
<p>However, users expect immediate feedback to interactions to feel like a native app. This means some updates need to render synchronously in response to user input, potentially interrupting any in-progress render. Since the old architecture was only asynchronous, we needed to rewrite it to allow for both asynchronous and synchronous updates.</p>
<p>Additionally, in the old architecture, serializing function calls over the bridge quickly became a bottleneck, especially for frequent updates or large objects. This made it hard for apps to achieve 60+ FPS reliably. There were also synchronization issues: when the JavaScript and native layer got out of sync, it was impossible to reconcile them synchronously, resulting bugs like lists showing frames of empty space and visual UI jumps due to intermediate states rendering.</p>
<p>Finally, since the old architecture kept a single copy of the UI using the native hierarchy, and mutated that copy in place, layout could only be computed on a single thread. This made it impossible to process urgent updates like user inputs, and layout could not be read synchronously, such as reading in a layout effect to update the position of a tooltip.</p>
<p>All of these problems meant that it was not possible to properly support React’s concurrent features. To solve these problems, the New Architecture includes four main parts:</p>
<ul>
<li class="">The New Native Module System</li>
<li class="">The New Renderer</li>
<li class="">The Event Loop</li>
<li class="">Removing the Bridge</li>
</ul>
<p>The New Module system allows the React Native Renderer to have synchronous access to the native layer, which allows it to handle events, schedule updates, and read layout both asynchronously and synchronously. The new Native Modules are also lazily loaded by default, giving apps a significant performance gain.</p>
<p>The New Renderer can handle multiple in progress trees across multiple threads, which allows React to process multiple concurrent update priorities, either on the main thread or a background thread. It also supports reading layout from multiple threads synchronously or asynchronously, to support more responsive UIs without jank.</p>
<p>The new Event Loop can process tasks on the JavaScript thread in a well-defined order. This allows React to interrupt rendering to process events so urgent user events can take priority over lower priority UI transitions. The Event Loop also aligns with web specifications, so we can support for browser features like microtasks, <code>MutationObserver</code>, and <code>IntersectionObserver</code>.</p>
<p>Finally, removing the bridge allows for faster startup and direct communication between JavaScript and the native runtime, so that the cost of switching work is minimized. This also allows for better error reporting, debugging, and reducing crashes from undefined behavior.</p>
<p>The New Architecture is now ready to be used in production. It is already used at scale at Meta in the Facebook app and in other products. We successfully used React Native and the New Architecture in the Facebook and Instagram app we developed for our <a href="https://engineering.fb.com/2024/10/02/android/react-at-meta-connect-2024/" target="_blank" rel="noopener noreferrer" class="">Quest devices</a>.</p>
<p>Our partners have already been using the New Architecture in production for months now: have a look at these success stories by <a href="https://blog.swmansion.com/sunrising-new-architecture-in-the-new-expensify-app-729d237a02f5" target="_blank" rel="noopener noreferrer" class="">Expensify</a> and <a href="https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture" target="_blank" rel="noopener noreferrer" class="">Kraken</a>, and give <a href="https://github.com/bluesky-social/social-app/releases/tag/1.92.0-na-rc.2" target="_blank" rel="noopener noreferrer" class="">Bluesky</a> a shot with their new release.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-native-modules">New Native Modules<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#new-native-modules" class="hash-link" aria-label="Direct link to New Native Modules" title="Direct link to New Native Modules" translate="no">​</a></h3>
<p>The new Native Module System is a major rewrite of how JavaScript and the native platform communicate. It’s written entirely in C++, which unlocks many new capabilities:</p>
<ul>
<li class="">Synchronous access to and from the native runtime</li>
<li class="">Type safety between JavaScript and native code</li>
<li class="">Code sharing across platforms</li>
<li class="">Lazy module loading by default</li>
</ul>
<p>In the new Native Module system, JavaScript and the native layer can now synchronously communicate with each other through the JavaScript Interface (JSI), without the need to use an asynchronous bridge. This means your custom Native Modules can now synchronously call a function, return a value, and pass that value back to another Native Module function.</p>
<p>In the old architecture, in order to handle a response from native function calls, you needed to provide a callback, and the value returned needed to be serializable:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ❌ Sync callback from Native Module</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">nativeModule</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">getValue</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">value </span><span class="token operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ❌ value cannot reference a native object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  nativeModule</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">doSomething</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>In the New Architecture, you can make synchronous calls to native functions:</p>
<div class="language-ts codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-ts codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ✅ Sync response from Native Module</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> value </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> nativeModule</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">getValue</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// ✅ value can be a reference to a native object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">nativeModule</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">doSomething</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>With the New Architecture, you can finally leverage the full power of a C++ native implementation while still accessing it from JavaScript/TypeScript APIs. The New Module System supports <a class="" href="https://reactnative.dev/docs/next/the-new-architecture/pure-cxx-modules">modules written in C++</a> so you can write your module once, and it works across all platforms, including Android, iOS, Windows, and macOS. Implementing modules in C++ allows for more fine-grained memory management and performance optimizations.</p>
<p>Additionally, with <a class="" href="https://reactnative.dev/docs/next/the-new-architecture/what-is-codegen">Codegen</a>, your modules can define a strongly typed contract between the JavaScript layer and the native layer. From our experience, cross-boundary type errors are one of the most common sources of crashes in cross-platform apps. Codegen lets you overcome those problems while also generating boilerplate code for you.</p>
<p>Finally, modules are now lazily loaded: they are loaded in memory only when they’re effectively needed rather than at startup. This reduces the app startup time and keeps it low as the application grows in complexity.</p>
<p>Popular libraries such as <a href="https://github.com/mrousavy/react-native-mmkv" target="_blank" rel="noopener noreferrer" class="">react-native-mmkv</a> have already seen benefits from migrating to the new Native Modules:</p>
<blockquote>
<p>“The new Native Modules greatly simplified setup, autolinking, and initialization for <code>react-native-mmkv</code>. Thanks to the New Architecture, <code>react-native-mmkv</code> is now a pure C++ Native Module, which allows it to work on any platform. The new Codegen allows MMKV to be fully type-safe, which fixed a long-standing <code>NullPointerReference</code> issue by enforcing null-safety, and being able to call Native Module functions synchronously allowed us to replace custom JSI access with the new Native Module API.”</p>
<p><a href="https://twitter.com/mrousavy" target="_blank" rel="noopener noreferrer" class="">Marc Rousavy</a>, creator of <code>react-native-mmkv</code></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-renderer">New Renderer<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#new-renderer" class="hash-link" aria-label="Direct link to New Renderer" title="Direct link to New Renderer" translate="no">​</a></h3>
<p>We've also completely rewritten the Native Renderer, adding several benefits:</p>
<ul>
<li class="">Updates can be rendered on different threads at different priorities.</li>
<li class="">Layout can be read synchronously and across different threads.</li>
<li class="">The renderer is written in C++ and shared across all platforms.</li>
</ul>
<p>The updated Native Renderer now stores the view hierarchy in an immutable tree structure. This means that the UI is stored in a way that cannot be changed directly, allowing for thread-safe processing of updates. This allows it to handle multiple in-progress trees, each representing a different version of the user interface. As a result, updates can be rendered in the background without blocking the UI (such as during transitions) or on the main thread (in response to user input).</p>
<p>By supporting multiple threads, React can interrupt a low-priority update to render an urgent one, such as those generated by user inputs, and then resume the low-priority update as needed. The new renderer can also read layout information synchronously and across different threads. This enables background computation for low-priority updates and synchronous reads when needed, such as repositioning a tooltip.</p>
<p>Finally, rewriting the renderer in C++ allows it to be shared across all platforms. This ensures that the same code runs on iOS, Android, Windows, macOS, and any other React Native-supported platform, providing consistent rendering capabilities without needing re-implementation for each platform.</p>
<p>This is a significant step towards our <a class="" href="https://reactnative.dev/blog/2021/08/26/many-platform-vision">Many Platform Vision</a>. For example, View Flattening was an Android-only optimisation to avoid deep layout trees. The new renderer, with shared C++ core, <a href="https://github.com/reactwg/react-native-new-architecture/discussions/110" target="_blank" rel="noopener noreferrer" class="">brings this feature to iOS</a>. This optimisation is automatic and does not require setup, it comes for free with the shared renderer.</p>
<p>With these changes, React Native now fully supports Concurrent React features like Suspense and Transitions, making it easier to build complex user interfaces that respond quickly to user input without jank, delays, or visual jumps. In the future, we will leverage these new capabilities to bring more improvements to built-in components such as FlatList and TextInput.</p>
<p>Popular libraries like <a href="https://docs.swmansion.com/react-native-reanimated/" target="_blank" rel="noopener noreferrer" class="">Reanimated</a> are already taking advantage of the New Renderer:</p>
<blockquote>
<p>“Reanimated 4, currently in development, introduces a new animation engine that works directly with the New Renderer, allowing it to handle animations and manage layout across different threads. The New Renderer’s design is what truly enables these features to be built without relying on numerous workarounds. Moreover, because it’s implemented in C++ and shared across platforms, large portions of Reanimated can be written once, reducing platform-specific issues, minimizing the codebase, and streamlining adoption for out-of-tree platforms.”</p>
<p><a href="https://x.com/kzzzf" target="_blank" rel="noopener noreferrer" class="">Krzysztof Magiera</a>, creator of <a href="https://docs.swmansion.com/react-native-reanimated/" target="_blank" rel="noopener noreferrer" class="">Reanimated</a></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="the-event-loop">The Event Loop<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#the-event-loop" class="hash-link" aria-label="Direct link to The Event Loop" title="Direct link to The Event Loop" translate="no">​</a></h3>
<p>The New Architecture allowed us to implement a well-defined event loop processing model, as described in this <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0744-well-defined-event-loop.md" target="_blank" rel="noopener noreferrer" class="">RFC</a>. This RFC follows the specifications described in the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model" target="_blank" rel="noopener noreferrer" class="">HTML Standard</a>, and it describes how React Native should perform tasks on the JavaScript thread.</p>
<p>Implementing a well-defined event loop closes gaps between React DOM and React Native: the behavior of a React Native application is now closer to the behavior of a React DOM application, making it easier to learn once, and write anywhere.</p>
<p>The event loop brings many benefits to React Native:</p>
<ul>
<li class="">The ability to interrupt rendering to process events and tasks</li>
<li class="">Closer alignment with web specifications</li>
<li class="">Foundation for more browser features</li>
</ul>
<p>With the Event Loop, React is able to predictably order updates and events. This allows React to interrupt a low priority update with an urgent user event, and the New Renderer allows us to render those updates independently.</p>
<p>The Event Loops also aligns the behavior of events and task like timers with web specifications, which means React Native works more like what users are familiar with in the Web, and allows for better code sharing between React DOM and React Native.</p>
<p>It also allows for the implementation of more compliant browser features like microtasks, <code>MutationObserver</code>, and <code>IntersectionObserver</code>. These features are not ready to use in React Native yet, but we are working on bringing them to you in the future.</p>
<p>Finally, the Event Loop and the New Renderer changes to support reading layout synchronously allow React Native to add proper support for <code>useLayoutEffect</code> to read layout information synchronously and update the UI in the same frame. This allows you to position elements correctly before they are displayed to the user.</p>
<p>See <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#uselayouteffect"><code>useLayoutEffect</code></a> for more details.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removing-the-bridge">Removing the Bridge<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#removing-the-bridge" class="hash-link" aria-label="Direct link to Removing the Bridge" title="Direct link to Removing the Bridge" translate="no">​</a></h3>
<p>In the New Architecture, we've also fully removed React Native's dependency on the bridge, replacing it with direct, efficient communication between JavaScript and native code using JSI:</p>
<p><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/0.76-bridge-diagram-4e31abb22d5626336e548fa646c8cfc4.png" width="1143" height="736" class="img_SS3x"></p>
<p>Removing the bridge improves startup time by avoiding bridge initialization. For example, in the old architecture, in order to provide global methods to JavaScript, we would need to initialize a module in JavaScript on startup, causing a small delay in app startup time:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ❌ Slow initialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">NativeTimingModule</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'NativeTimingModule'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">global</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">setTimeout</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token parameter">timer</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token maybe-class-name">NativeTimingModule</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">setTimeout</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">timer</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// App.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">setTimeout</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">100</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>In the New Architecture, we can directly bind methods from C++:</p>
<div class="language-cpp codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-cpp codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ✅ Initialize directly in C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">runtime</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">global</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">setProperty</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">runtime</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"setTimeout"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> createTimer</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// App.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">setTimeout</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">100</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>The rewrite also improves error reporting, particularly for JavaScript crashes at startup, and reduces crashes from undefined behavior. If crashes occur, the new <a class="" href="https://reactnative.dev/docs/next/react-native-devtools">React Native DevTools</a> simplify debugging and support the New Architecture.</p>
<p>The bridge remains for backward compatibility to support gradual migration to the New Architecture. In the future, we will remove the bridge code completely.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="gradual-migration">Gradual Migration<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#gradual-migration" class="hash-link" aria-label="Direct link to Gradual Migration" title="Direct link to Gradual Migration" translate="no">​</a></h3>
<p>We expect most apps can upgrade to 0.76 with the same effort as any other release.</p>
<p>When you upgrade to 0.76, the New Architecture and React 18 are enabled by default. However, to use concurrent features and gain the full benefits of the New Architecture, your app and libraries will need to be gradually migrated to fully support the New Architecture.</p>
<p>When you first upgrade, your app will run on the New Architecture with an automatic interoperability layer with the old architecture. For most apps, this will work without any changes, but there are <a href="https://github.com/reactwg/react-native-new-architecture/discussions/237" target="_blank" rel="noopener noreferrer" class="">known limitations</a> with the interop layer, as it does not support accessing custom Shadow Nodes or concurrent features.</p>
<p>To use concurrent features, apps will also need to be updated to support <a href="https://react.dev/blog/2022/03/29/react-v18#what-is-concurrent-react" target="_blank" rel="noopener noreferrer" class="">Concurrent React</a> by following the <a href="https://react.dev/reference/rules" target="_blank" rel="noopener noreferrer" class="">Rules of React</a>. To migrate your JavaScript code to React 18 and its semantics, follow the <a href="https://react.dev/blog/2022/03/08/react-18-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">React 18 Upgrade guide</a>.</p>
<p>The overall strategy is to get your application running on the New Architecture without breaking existing code. You can then gradually migrate your app at your own pace. For new surfaces that have migrated all modules to the New Architecture, you can start using concurrent features immediately. For existing surfaces, you may need to address some issues and migrate modules before adding concurrent features.</p>
<p>We've collaborated with the most popular React Native libraries to ensure support for the New Architecture. More than 850 libraries are already compatible, including all libraries with over 200K weekly downloads (~10% of downloaded libraries). You can check library compatibility with the New Architecture on the <a href="https://reactnative.directory/" target="_blank" rel="noopener noreferrer" class="">reactnative.directory</a> website:</p>
<p><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/0.76-directory-301eb7410932204b4c5149cdd20f604c.png" width="1999" height="785" class="img_SS3x"></p>
<p>For more details on upgrading, see <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#how-to-upgrade">How to Upgrade</a> below.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-features">New Features<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h2>
<p>The New Architecture includes full support for React 18, concurrent features, and <code>useLayoutEffect</code> in React Native. For a full list of React 18 features, please see the <a href="https://react.dev/blog/2021/12/17/react-conf-2021-recap#react-18-and-concurrent-features" target="_blank" rel="noopener noreferrer" class="">React 18 blog post</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="transitions">Transitions<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#transitions" class="hash-link" aria-label="Direct link to Transitions" title="Direct link to Transitions" translate="no">​</a></h3>
<p>Transitions are a new concept in React 18 to distinguish between urgent and non-urgent updates.</p>
<ul>
<li class=""><strong>Urgent updates</strong> reflect direct interaction, like typing and pressing.</li>
<li class=""><strong>Transition updates</strong> transition the UI from one view to another.</li>
</ul>
<p>Urgent updates need immediate response to match our intuitions about how physical objects behave. However, transitions are different because the user doesn’t expect to see every intermediate value on screen. In the New Architecture, React Native is able to support rendering urgent updates and transition updates separately.</p>
<p>Typically, for the best user experience, a single user input should result in both an urgent update and a non-urgent one. Similar to ReactDOM, events like <code>press</code> or <code>change</code> are handled as urgent and rendered immediately. You can use the <code>startTransition</code> API inside an input event to inform React which updates are “transitions” and can be deferred to the background:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports">startTransition</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Urgent: Show the slider value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">setCount</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Mark any state updates inside as transitions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">startTransition</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// Transition: Show the results</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">setNumberOfTiles</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>Separating urgent events from transitions allows for a more responsive user interface, and a more intuitive user experience.</p>
<p>Here's a comparison of the old architecture without transitions and the new architecture with transitions. Imagine that each tile isn't a trivial view with a background color, but a rich component containing images and other components that are expensive to render. <strong>After</strong> using <code>useTransition</code> you avoid thrashing your app with updates and falling behind.</p>
<div class="TwoColumns TwoFigures"><figure><img src="https://reactnative.dev/img/new-architecture/without-transitions.gif" alt="A video demonstrating an app rendering many views (tiles) according to a slider input. The views are rendered in batches as the slider is quickly adjusted from 0 to 1000."><figcaption><b>Before:</b> rendering tiles without marking it as a transition.</figcaption></figure><figure><img src="https://reactnative.dev/img/new-architecture/with-transitions.gif" alt="A video demonstrating an app rendering many views (tiles) according to a slider input. The views are rendered in batches as the slider is quickly adjusted from 0 to 1000. There are less batch renders in comparison to the next video."><figcaption><b>After:</b> rendering tiles <em>with transitions</em> to interrupt in-progress renders of stale state.</figcaption></figure></div>
<p>For more information, see <a class="" href="https://reactnative.dev/architecture/landing-page#support-for-concurrent-renderer-and-features">Support for Concurrent Renderer and Features</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="automatic-batching">Automatic Batching<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#automatic-batching" class="hash-link" aria-label="Direct link to Automatic Batching" title="Direct link to Automatic Batching" translate="no">​</a></h3>
<p>When upgrading to the New Architecture, you will benefit from automatic batching from React 18.</p>
<p>Automatic batching allows React to batch together more state updates when rendering to avoid the rendering of intermediate states. This allows React Native to be faster and less susceptible to lags, without any additional code from the developer.</p>
<div class="TwoColumns TwoFigures"><figure><img src="https://reactnative.dev/img/new-architecture/legacy-renderer.gif" alt="A video demonstrating an app rendering many views according to a slider input. The slider value is adjusted from 0 to 1000 and the UI slowly catches up to rendering 1000 views."><figcaption><b>Before:</b> rendering frequent state updates with legacy renderer.</figcaption></figure><figure><img src="https://reactnative.dev/img/new-architecture/react18-renderer.gif" alt="A video demonstrating an app rendering many views according to a slider input. The slider value is adjusted from 0 to 1000 and the UI resolves to 1000 views faster than the previous example, without as many intermediate states."><figcaption><b>After:</b> rendering frequent state updates with <em>automatic batching</em>.</figcaption></figure></div>
<p>In the old architecture, more intermediate states are rendered, and the UI keeps updating even when the slider stops moving. The New Architecture, renders fewer intermediate states and completes the rendering much sooner thanks to automatically batching the updates.</p>
<p>For more information, see <a class="" href="https://reactnative.dev/architecture/landing-page#support-for-concurrent-renderer-and-features">Support for Concurrent Renderer and Features</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="uselayouteffect">useLayoutEffect<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#uselayouteffect" class="hash-link" aria-label="Direct link to useLayoutEffect" title="Direct link to useLayoutEffect" translate="no">​</a></h3>
<p>Building on the Event Loop and the ability to read layout synchronously, in the New Architecture we added proper support for <code>useLayoutEffect</code> in React Native.</p>
<p>In the old architecture, you needed to use the asynchronous <code>onLayout</code> event to read layout information of a view (which was also asynchronous). As a result there would be at least one frame where the layout was incorrect until the layout was read and updated, causing issues like tooltips placed in the wrong position:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ❌ async onLayout after commit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> onLayout </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token maybe-class-name">React</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">useCallback</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">event </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ❌ async callback to read layout</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  ref</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">current</span><span class="token operator" style="color:#fc929e">?.</span><span class="token method function property-access" style="color:#79b6f2">measureInWindow</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token function" style="color:#79b6f2">setPosition</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">x</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> width</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">ViewWithTooltip</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">onLayout</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">onLayout</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">ref</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">position</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">position</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e"></span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>The New Architecture fixes this by allowing synchronous access to layout information in <code>useLayoutEffect</code>:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// ✅ sync layout effect during commit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">useLayoutEffect</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#fc929e">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ✅ sync call to read layout</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> rect </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> ref</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">current</span><span class="token operator" style="color:#fc929e">?.</span><span class="token method function property-access" style="color:#79b6f2">getBoundingClientRect</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">setPosition</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">ViewWithTooltip</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">ref</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">position</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">position</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>This change allows you to read layout information synchronously and update the UI in the same frame, allowing you to position elements correctly before they are displayed to the user:</p>
<div class="TwoColumns TwoFigures"><figure><img src="https://reactnative.dev/img/new-architecture/async-on-layout.gif" alt="A view that is moving to the corners of the viewport and center with a tooltip rendered either above or below it. The tooltip is rendered after a short delay after the view moves"><figcaption>In the old architecture, layout was read asynchronously in <code>onLayout</code>, causing the position of the tooltip to be delayed.</figcaption></figure><figure><img src="https://reactnative.dev/img/new-architecture/sync-use-layout-effect.gif" alt="A view that is moving to the corners of the viewport and center with a tooltip rendered either above or below it. The view and tooltip move in unison."><figcaption>In the New Architecture, layout can be read in <code>useLayoutEffect</code> synchronously, updating the tooltip position before displaying.</figcaption></figure></div>
<p>For more information, see the docs for <a class="" href="https://reactnative.dev/docs/0.75/the-new-architecture/landing-page#synchronous-layout-and-effects">Synchronous Layout and Effects</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="full-support-for-suspense">Full Support for Suspense<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#full-support-for-suspense" class="hash-link" aria-label="Direct link to Full Support for Suspense" title="Direct link to Full Support for Suspense" translate="no">​</a></h3>
<p>Suspense lets you declaratively specify the loading state for a part of the component tree if it’s not yet ready to be displayed:</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">Suspense</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">fallback</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript tag punctuation" style="color:#657b83">&lt;</span><span class="token tag script language-javascript tag class-name" style="color:#fac863">Spinner</span><span class="token tag script language-javascript tag" style="color:#fc929e"> </span><span class="token tag script language-javascript tag punctuation" style="color:#657b83">/&gt;</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">Comments</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">Suspense</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><br></span></code></pre></div></div>
<p>We introduced a limited version of Suspense several years ago, and React 18 added full support. Until now, React Native was not able to support concurrent rendering for Suspense.</p>
<p>The New Architecture includes full support for Suspense introduced in React 18. This means that you can now use Suspense in React Native to handle loading states for your components, and the suspended content will render in the background while the loading state is displayed, giving higher priority to user input on visible content.</p>
<p>For more, see the <a href="https://github.com/reactjs/rfcs/blob/main/text/0213-suspense-in-react-18.md" target="_blank" rel="noopener noreferrer" class="">RFC for Suspense in React 18</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-upgrade">How to Upgrade<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#how-to-upgrade" class="hash-link" aria-label="Direct link to How to Upgrade" title="Direct link to How to Upgrade" translate="no">​</a></h2>
<p>To upgrade to 0.76, follow the steps in the <a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#upgrade-to-076">release post</a>. Since this release also upgrades to React 18, you will also need to follow the <a href="https://react.dev/blog/2022/03/08/react-18-upgrade-guide" target="_blank" rel="noopener noreferrer" class="">React 18 Upgrade guide</a>.</p>
<p>These steps should be enough for most apps to upgrade to the New Architecture thanks to the interop layer with the old architecture. However, to take full advantage of the New Architecture and to start using concurrent features, you will need to migrate your custom Native Modules and Native Components to support the new Native Module and Native Component APIs.</p>
<p>Without migrating your custom Native Modules, you will not get the benefits of shared C++, synchronous method calls, or type-safety from codegen. Without migrating your Native Components, you will not be able to use concurrent features. We recommend migrating all Native Components and Native Modules to the New Architecture as soon as possible.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>In a future release, we will remove the interop layer and modules will need to support the New Architecture.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="apps">Apps<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#apps" class="hash-link" aria-label="Direct link to Apps" title="Direct link to Apps" translate="no">​</a></h3>
<p>If you are an app developer, to fully support the New Architecture, you will need to upgrade your libraries, custom Native Components, and custom Native Modules to fully support the New Architecture.</p>
<p>We've collaborated with the most popular React Native libraries to ensure support for the New Architecture. You can check library compatibility with the New Architecture on the <a href="https://reactnative.directory/" target="_blank" rel="noopener noreferrer" class="">reactnative.directory</a> website.</p>
<p>If any of the libraries your app depends on are not compatible yet, you can:</p>
<ul>
<li class="">Open an issue with the library and ask the author to migrate to the New Architecture.</li>
<li class="">If the library is not maintained, consider alternative libraries with the same features.</li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#opt-out">Opt-out from the New Architecture</a> while those libraries are migrated.</li>
</ul>
<p>If your app has custom Native Modules or custom Native Components, we expect them to work fine, thanks to our <a href="https://github.com/reactwg/react-native-new-architecture/discussions/135" target="_blank" rel="noopener noreferrer" class="">interop layer</a>. However, we recommend upgrading them to the new Native Module and Native Component APIs to fully support the New Architecture and adopt concurrent features.</p>
<p>Please follow these guides to migrate your modules and components to the New Architecture:</p>
<ul>
<li class=""><a class="" href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Modules</a></li>
<li class=""><a class="" href="https://reactnative.dev/docs/next/fabric-native-components-introduction">Native Components</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="libraries">Libraries<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#libraries" class="hash-link" aria-label="Direct link to Libraries" title="Direct link to Libraries" translate="no">​</a></h3>
<p>If you are a library maintainer, please first test that your library works with the interop layer. If it does not, please open an issue on the <a href="https://github.com/reactwg/react-native-new-architecture/" target="_blank" rel="noopener noreferrer" class="">New Architecture Working Group</a>.</p>
<p>To fully support the New Architecture, we recommend migrating your library to the new Native Module and Native Component APIs as soon as possible. This will allow users of your library to take full advantage of the New Architecture and support concurrent features.</p>
<p>You can follow these guides to migrate your modules and components to the New Architecture:</p>
<ul>
<li class=""><a class="" href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Modules</a></li>
<li class=""><a class="" href="https://reactnative.dev/docs/next/fabric-native-components-introduction">Native Components</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="opt-out">Opt-out<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#opt-out" class="hash-link" aria-label="Direct link to Opt-out" title="Direct link to Opt-out" translate="no">​</a></h3>
<p>If, for any reason, the New Architecture is not behaving properly in your application, there is always the option to opt-out from it until you are ready to turn it on again.</p>
<p>To opt-out from the New Architecture:</p>
<ul>
<li class="">On Android, modify the <code>android/gradle.properties</code> file and turn off the <code>newArchEnabled</code> flag:</li>
</ul>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token deleted-sign deleted prefix deleted" style="color:#cb4b16">-</span><span class="token deleted-sign deleted line" style="color:#cb4b16">newArchEnabled=true</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token deleted-sign deleted line" style="color:#cb4b16"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">newArchEnabled=false</span><br></span></code></pre></div></div>
<ul>
<li class="">On iOS, you can reinstall the dependencies by running the command:</li>
</ul>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token assign-left variable" style="color:#cb4b16">RCT_NEW_ARCH_ENABLED</span><span class="token operator" style="color:#fc929e">=</span><span class="token number" style="color:#5a9bcf">0</span><span class="token plain"> bundle </span><span class="token builtin class-name" style="color:#fac863">exec</span><span class="token plain"> pod </span><span class="token function" style="color:#79b6f2">install</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="thanks">Thanks<a href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#thanks" class="hash-link" aria-label="Direct link to Thanks" title="Direct link to Thanks" translate="no">​</a></h2>
<p>Delivering the New Architecture to the OSS community has been a huge effort that took us several years of research and development. We want to take a moment to thank all the current and past members of the React team who helped us achieve this result.</p>
<p>We are also extremely grateful to all the partners who collaborated with us to make this happen. Specifically, we would like to call out:</p>
<ul>
<li class=""><a href="https://expo.dev/" target="_blank" rel="noopener noreferrer" class="">Expo</a>, for adopting the New Architecture early on, and for supporting the work on migrating the most popular libraries.</li>
<li class=""><a href="https://swmansion.com/" target="_blank" rel="noopener noreferrer" class="">Software Mansion</a>, for maintaining crucial libraries in the ecosystem, for migrating them to the New Architecture early and for all the help in investigating and fixing various issues.</li>
<li class=""><a href="https://www.callstack.com/" target="_blank" rel="noopener noreferrer" class="">Callstack</a>, for maintaining crucial libraries in the ecosystem, for migrating them to the New Architecture early and for the support with the work on the Community CLI.</li>
<li class=""><a href="https://opensource.microsoft.com/" target="_blank" rel="noopener noreferrer" class="">Microsoft</a>, for adding the New Architecture implementation for <code>react-native-windows</code> and <code>react-native-macos</code> as well as in several other developer tools.</li>
<li class=""><a href="https://www.expensify.com/" target="_blank" rel="noopener noreferrer" class="">Expensify</a>, <a href="https://www.kraken.com/" target="_blank" rel="noopener noreferrer" class="">Kraken</a>, <a href="https://bsky.app/" target="_blank" rel="noopener noreferrer" class="">Bluesky</a> and <a href="https://www.brigad.co/" target="_blank" rel="noopener noreferrer" class="">Brigad</a> for pioneering the adoption of the New Architecture and reporting various issues so that we could fix them for everyone else.</li>
<li class="">All the independent library maintainers and developers who contributed to the New Architecture by testing it, fixing some of the issues, and opening questions on unclear matters so that we could clear them.</li>
</ul>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.76 - New Architecture by default, React Native DevTools, and more]]></title>
            <link>https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture</link>
            <guid>https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture</guid>
            <pubDate>Wed, 23 Oct 2024 16:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.76!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.76!</p>
<p>This is a major milestone for React Native, as we’re enabling the New Architecture by default, and we’re introducing React Native DevTools. This has been the culmination of 6 years of hard work from our team, together with the support of our incredible community of developers.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-new-architecture-by-default">React Native New Architecture by default</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-devtools">React Native DevTools</a></li>
<li class=""><a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#faster-metro-resolution" class="">Faster Metro resolution</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#box-shadow-and-filter-style-props">Box Shadow and Filter style props</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#removed-the-dependency-on-the-react-native-communitycli">Removed the dependency on the react-native-community/cli</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#android-apps-are-38mb-smaller-thanks-to-native-library-merging">Android Apps are ~3.8Mb smaller thanks to Native Library merging</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#updates-to-minimum-ios-and-android-sdk-requirements">Updates to Minimum iOS and Android SDK requirements</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-native-new-architecture-by-default">React Native New Architecture by default<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-new-architecture-by-default" class="hash-link" aria-label="Direct link to React Native New Architecture by default" title="Direct link to React Native New Architecture by default" translate="no">​</a></h3>
<p>Starting from React Native 0.76, the New Architecture is enabled by default in your projects. The New Architecture is a rewrite of the internals of React Native to enable app developers to develop high quality native applications using React.</p>
<p>Today, we’re excited to declare the New Architecture ready for production use.</p>
<p>This change is a milestone in the evolution of React Native, and we invite you to read the dedicated blogpost to understand what's included in the New Architecture and how it will shape the future of React Native: <a class="" href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here">The New Architecture is Here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-native-devtools">React Native DevTools<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-devtools" class="hash-link" aria-label="Direct link to React Native DevTools" title="Direct link to React Native DevTools" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="React Native DevTools front-end" src="https://reactnative.dev/assets/images/0.76-react-native-devtools-0b22a36dd405d34834004e51a3fcce23.jpg" width="1600" height="825" class="img_SS3x"></p>
<p>We're releasing the first stable version of React Native DevTools, our new default debugging experience.</p>
<p>We want the tooling you use to debug React across all platforms to be reliable, familiar, simple, and cohesive. React Native DevTools delivers on these principles —&nbsp;browser-aligned developer tools that are deeply integrated with React Native. Key features include:</p>
<ul>
<li class=""><strong>Familiar, web-aligned tooling</strong> — A fully featured debugger based on Chrome DevTools with reliable breakpoints, watch values, step-through debugging, stack inspection, and a rich JavaScript console. These core features now work reliably and across reloads.</li>
<li class=""><strong>Improved and integrated React DevTools</strong> — The built-in React Components Inspector and Profiler work seamlessly, with faster and more reliable component highlighting.</li>
<li class=""><strong>Improved UX</strong> — See a new <em>Paused in Debugger</em> overlay, making it clear when your app is paused on a breakpoint. Warnings in LogBox are now displayed as a summary, and hidden when DevTools is attached.</li>
<li class=""><strong>Fixed reconnection behaviour</strong> —&nbsp;JavaScript breakpoints now work reliably across reloads and when DevTools is disconnected and reattached. DevTools can even reconnect to the same app after a native rebuild.</li>
<li class=""><strong>Instant launch</strong> — React Native DevTools is ready by default with zero config. Open it from the in-app Dev Menu or via <kbd>j</kbd> to debug in the CLI server, which now supports multiple emulators and devices.</li>
</ul>
<p>React Native DevTools is fundamentally different from our previous debugging options, including being different from the Experimental Debugger experience first shipped in 0.73. It switches to a new backend debugging stack that we’ve rebuilt over the last year. This means that compatibility with previous tooling <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=announcement%20talk%20%F0%9F%8E%AC.-,Compatibility,-React%20Native%20DevTools" target="_blank" rel="noopener noreferrer" class="">has changed</a>, and you should also expect a much more reliable experience end-to-end. We intend to build upon this new stack to allow us to reliably implement more features in future, such as the Performance and Network panels.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="phasing-out-logs-in-metro">Phasing out logs in Metro<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#phasing-out-logs-in-metro" class="hash-link" aria-label="Direct link to Phasing out logs in Metro" title="Direct link to Phasing out logs in Metro" translate="no">​</a></h4>
<p>In our next release, we're removing forwarded logs in Metro to align with modern browser tooling, and remove old debugging integrations. Instead, use React Native DevTools' fully featured Console panel for logging. See more under our <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=point%20is%20deprecated.-,FAQs,-React%20Native%20DevTools" target="_blank" rel="noopener noreferrer" class="">FAQs</a>.</p>
<p><strong>Links</strong></p>
<ul>
<li class=""><a class="" href="https://reactnative.dev/docs/debugging">Updated debugging docs</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=OwivVpg6Luc" target="_blank" rel="noopener noreferrer" class="">Announcement talk at React Universe Conf</a></li>
<li class=""><a href="https://github.com/react-native-community/discussions-and-proposals/discussions/819" target="_blank" rel="noopener noreferrer" class="">Feedback thread and FAQs</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="faster-metro-resolution">Faster Metro resolution<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#faster-metro-resolution" class="hash-link" aria-label="Direct link to Faster Metro resolution" title="Direct link to Faster Metro resolution" translate="no">​</a></h3>
<p>We've shipped several performance improvements to Metro's resolver, the component responsible for finding a module from an import path, making it around <a href="https://x.com/MetroBundler/status/1831709057670861260" target="_blank" rel="noopener noreferrer" class="">15x faster</a>. This improves the overall performance of Metro, particularly for warm builds, which we've seen at around 4x faster.</p>
<div class="tweet"><iframe style="border:none" scrolling="no" width="550" height="870" data-tweet-url="https://twitter.com/MetroBundler/status/1831709057670861260" src="data:text/html;charset=utf-8,%3Cblockquote%20class%3D%22twitter-tweet%22%3E%3Cp%20lang%3D%22en%22%20dir%3D%22ltr%22%3EFaster%20resolution%2C%20faster%20builds%3Cbr%3E%3Cbr%3EYesterday%26%2339%3Bs%20Metro%20release%20included%20a%20bunch%20of%20performance%20improvements%20to%20our%20resolver%2C%20making%20it%20around%2015x%20faster.%20That%26%2339%3Bs%20especially%20good%20news%20for%20warm%20builds.%20%3Ca%20href%3D%22https%3A//t.co/huPD5CW5bu%22%3Epic.twitter.com/huPD5CW5bu%3C/a%3E%3C/p%3E%26mdash%3B%20Metro%20%28@MetroBundler%29%20%3Ca%20href%3D%22https%3A//twitter.com/MetroBundler/status/1831709057670861260%3Fref_src%3Dtwsrc%255Etfw%22%3ESeptember%205%2C%202024%3C/a%3E%3C/blockquote%3E%0A%3Cscript%20async%20src%3D%22https%3A//platform.twitter.com/widgets.js%22%20charset%3D%22utf-8%22%3E%3C/script%3E%0A%0A"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="box-shadow-and-filter-style-props">Box Shadow and Filter style props<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#box-shadow-and-filter-style-props" class="hash-link" aria-label="Direct link to Box Shadow and Filter style props" title="Direct link to Box Shadow and Filter style props" translate="no">​</a></h3>
<p>We’ve added two New Architecture only style props in 0.76 - <code>boxShadow</code> and <code>filter</code>. Both of these props exist on the web, and the team stick to the specs when possible so that these props are predictable, familiar, and ultimately easier to adopt (see the limitations and spec deviations sections for the exceptions).
As a result, you can look up the web documentation to fully understand how these work, but there are a few important differences which are noted below.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="boxshadow"><code>boxShadow</code><a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#boxshadow" class="hash-link" aria-label="Direct link to boxshadow" title="Direct link to boxshadow" translate="no">​</a></h4>
<p><code>boxShadow</code> adds a shadow to an element, with the ability to control the position, color, size, and blurriness of the shadow. Check out the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow" target="_blank" rel="noopener noreferrer" class="">MDN documentation</a> for a full overview of each of these arguments, along with a fiddle to try them out for yourself. Below are a few examples of the shadows you can make.</p>
<p><img decoding="async" loading="lazy" alt="New boxShadow style prop" src="https://reactnative.dev/assets/images/0.76-boxshadow-example-bcdd9211ba98197988fe526954b8b102.png" width="794" height="227" class="img_SS3x"></p>
<p><code>boxShadow</code> can take either a string, which mimics the CSS syntax, or JS objects which can embed variables. For example the string <code>‘5 5 5 0 rgba(255, 0, 0, 0.5)’</code> and the object <code>{offsetX: 5, offsetY: 5, blurRadius: 5, spreadDistance: 0, color: ‘rgba(255, 0, 0, 0.5)’}</code> would yield the same box shadow.</p>
<p>The <a href="https://reactnative.dev/docs/shadow-props" target="_blank" rel="noopener noreferrer" class="">previous shadow functionality</a> had some shortcomings addressed now addressed by <code>boxShadow</code>:</p>
<ul>
<li class="">Does not work on Android</li>
<li class="">Cannot be <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#inset" target="_blank" rel="noopener noreferrer" class="">inset</a></li>
<li class="">Does not have <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#length" target="_blank" rel="noopener noreferrer" class="">spread</a></li>
<li class="">Does not work on <code>View</code>s if there is no background color</li>
<li class="">Is a separate prop, so it cannot share the same web syntax</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="limitations--spec-deviations">Limitations &amp; Spec Deviations<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#limitations--spec-deviations" class="hash-link" aria-label="Direct link to Limitations &amp; Spec Deviations" title="Direct link to Limitations &amp; Spec Deviations" translate="no">​</a></h4>
<ul>
<li class="">The default shadow color is black, not the parent’s color</li>
<li class="">Android normal shadows are supported on <strong>Android 9+</strong></li>
<li class="">Android inset shadows are supported on <strong>Android 10+</strong></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="filter"><code>filter</code><a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#filter" class="hash-link" aria-label="Direct link to filter" title="Direct link to filter" translate="no">​</a></h4>
<p><code>filter</code> adds certain graphical filters to an element. There are a mix of color filters that let you modify things like brightness, saturation, and hue as well as non-color filters that let you add blurs and shadows. Check out the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter" target="_blank" rel="noopener noreferrer" class="">MDN documentation</a> for a full overview of each individual filter function, along with a fiddle to try them out for yourself. Below is a hot dog image with various filters applied to it.</p>
<figure><img alt="Filters demonstration" src="https://reactnative.dev/blog/assets/0.76-filter-example.png"><figcaption>From left to right: no filter, <code>saturate</code> filter, <code>blur</code> filter, <code>invert</code> filter</figcaption></figure>
<p>Like <code>boxShadow</code>, <code>filter</code> can take either a string, which mimics the CSS syntax, or an array of JS objects which can embed variables. For example the string <code>‘saturate(0.5) grayscale(0.25)’</code> and the array <code>[{saturate: 0.5}, {grayscale: 0.25}]</code> would yield the same filter.
<code>filter</code> has a <code>dropShadow</code> value which varies slightly from <code>boxShadow</code>. The biggest difference is that <code>dropShadow</code> is an alpha mask - so the shadow will only be cast by a pixel if it has a nonzero alpha component. <code>boxShadow</code>, on the other hand, will cast around the border box of the element, even if nothing is inside of it. Additionally, dropShadow does not have a spread distance parameter and cannot be inset (shadow cast inside of the element).</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="limitations-and-spec-deviations">Limitations and Spec Deviations<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#limitations-and-spec-deviations" class="hash-link" aria-label="Direct link to Limitations and Spec Deviations" title="Direct link to Limitations and Spec Deviations" translate="no">​</a></h4>
<ul>
<li class="">iOS <code>filter</code> only supports brightness and opacity</li>
<li class="">iOS <code>filter</code> will not apply to shadows, outlines, or any other graphical elements outside the bounds of the element</li>
<li class="">Android <code>blur</code> and <code>drop-shadow</code> are only supported on <strong>Android 12+</strong></li>
<li class=""><code>filter</code> implies <code>overflow: hidden</code>, so children of an element with a <code>filter</code> will be clipped if they are positioned outside of the parents bounds.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking Changes<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removed-the-dependency-on-the-react-native-communitycli">Removed the dependency on the @react-native-community/cli<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#removed-the-dependency-on-the-react-native-communitycli" class="hash-link" aria-label="Direct link to Removed the dependency on the @react-native-community/cli" title="Direct link to Removed the dependency on the @react-native-community/cli" translate="no">​</a></h3>
<p>As previously shared in 0.75, our vision is for React Native to be <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md" target="_blank" rel="noopener noreferrer" class="">framework agnostic</a>. Therefore, we completed the work to remove @react-native-community/cli as a direct dependency of React Native.</p>
<p>Decoupling React Native from the CLI allows us to move faster through releasing these projects independently and to better separate the responsibilities of both projects.</p>
<p>If you are relying on the CLI in your daily workflow, make sure to explicitly <a href="https://react-native-community.github.io/upgrade-helper/?from=0.75.4&amp;to=0.76.0#RnDiffApp-package.json" target="_blank" rel="noopener noreferrer" class="">add the dependency</a> on the CLI in your <code>package.json</code>:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">//…</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> “devDependencies”: {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">  // …</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  “@react-native-community/cli”: “15.0.0”,</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  "@react-native-community/cli-platform-android": “15.0.0”,</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">  "@react-native-community/cli-platform-ios": “15.0.0”,</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> },</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-apps-are-38mb-smaller-thanks-to-native-library-merging">Android Apps are ~3.8Mb smaller thanks to Native Library merging<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#android-apps-are-38mb-smaller-thanks-to-native-library-merging" class="hash-link" aria-label="Direct link to Android Apps are ~3.8Mb smaller thanks to Native Library merging" title="Direct link to Android Apps are ~3.8Mb smaller thanks to Native Library merging" translate="no">​</a></h3>
<p>React Native 0.76 will ship with a reduced number of native libraries, as we merged a lot of our native code into a single library called <code>libreactnative.so</code>.</p>
<p>This change comes with reduction in app size, and improvement in app startup performance on Android. From our benchmarks, we found out that App size will be reduced by ~3.8MB (20% of the total) and median App startup time will be reduced by ~15ms (~8%) (<a href="https://github.com/react-native-community/discussions-and-proposals/discussions/816" target="_blank" rel="noopener noreferrer" class="">source</a>).</p>
<p>On the other hand, this is a breaking change for both app and library developers.</p>
<p>App developers will have to update their Application’s <code>onCreate</code> as follows:</p>
<div class="language-diff codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-diff codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">import com.facebook.react.soloader.OpenSourceMergedSoMapping</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token plain">import com.facebook.soloader.SoLoader</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">class MainApplication : Application(), ReactApplication {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> override fun onCreate() {</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line">   super.onCreate()</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token inserted-sign inserted prefix inserted" style="color:#859900">+</span><span class="token inserted-sign inserted line" style="color:#859900">   SoLoader.init(this, OpenSourceMergedSoMapping)</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token inserted-sign inserted line" style="color:#859900"></span><span class="token deleted-sign deleted prefix deleted" style="color:#cb4b16">-</span><span class="token deleted-sign deleted line" style="color:#cb4b16">   SoLoader.init(this, false)</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token deleted-sign deleted line" style="color:#cb4b16"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token unchanged line"></span><span class="token plain">}</span><br></span></code></pre></div></div>
<p>This change is necessary in order to properly load libreactnative.so and is <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">included in the upgrade-helper</a>.</p>
<p>Library authors won’t be affected by this change, unless you have custom C++ code.</p>
<p>For a technical deep dive into this change, and suggestions for library authors, you can read more about it <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/816" target="_blank" rel="noopener noreferrer" class="">in the dedicated post</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="updates-to-minimum-ios-and-android-sdk-requirements">Updates to Minimum iOS and Android SDK requirements<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#updates-to-minimum-ios-and-android-sdk-requirements" class="hash-link" aria-label="Direct link to Updates to Minimum iOS and Android SDK requirements" title="Direct link to Updates to Minimum iOS and Android SDK requirements" translate="no">​</a></h3>
<p>We have updated our minimum platform and SDK versions:</p>
<ul>
<li class="">iOS - from 13.4 to <a href="https://support.apple.com/en-gb/108051#151" target="_blank" rel="noopener noreferrer" class="">15.1</a></li>
<li class="">Android - from SDK 23 to <a href="https://developer.android.com/tools/releases/platforms#7.0" target="_blank" rel="noopener noreferrer" class="">SDK 24</a> (Android 7)</li>
</ul>
<p>This change was announced earlier in the year when 0.75 <a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#last-version-supporting-minsdk-23-and-miniosversion-134">was released</a>. For more background, please see the dedicated posts for <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/802" target="_blank" rel="noopener noreferrer" class="">Android</a> and <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/812" target="_blank" rel="noopener noreferrer" class="">iOS</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Animation</strong>
<ul>
<li class="">Stop sending state updates to React in looping animation. This was causing unnecessary re-rendering with looping animations.</li>
</ul>
</li>
<li class=""><strong>devtools:</strong>
<ul>
<li class="">Remove Inspector Panel perf + network tabs under New Arch. (<a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0777-remove-legacy-element-inspector-features.md" target="_blank" rel="noopener noreferrer" class="">RFC</a>)</li>
</ul>
</li>
<li class=""><strong>text engine</strong>
<ul>
<li class="">Always use AttributedStringBox instead of AttributedString in TextLayoutManager</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class=""><strong>rendering:</strong>
<ul>
<li class="">View backgrounds are no longer directly <code>ReactViewBackgroundDrawable</code> or <code>CSSBackgroundDrawable</code></li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<ul>
<li class=""><strong>turbomodule</strong>
<ul>
<li class="">Removed the <code>RCT_EXPORT_CXX_MODULE_EXPERIMENTAL</code> Macro for autolinking pure Cxx module.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.76 contains over <a href="https://github.com/facebook/react-native/compare/v0.75.4...v0.76.0" target="_blank" rel="noopener noreferrer" class="">1070 commits</a> from 156 contributors. Thanks for all of your hard work!</p>
<p>Thanks to all the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer" class="">Joe Vilches</a> and <a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer" class="">Nick Gerleman</a> box-shadow and filter style props.</li>
<li class=""><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> React Native DevTools.</li>
<li class=""><a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer" class="">Nicola Corti</a> Android shipping as a single library.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-076">Upgrade to 0.76<a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#upgrade-to-076" class="hash-link" aria-label="Direct link to Upgrade to 0.76" title="Direct link to Upgrade to 0.76" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>If you use Expo, React Native 0.76 will be supported in Expo SDK 52.</p>
<p>If you need to create a new project using the CLI, you can run this command:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx </span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">react</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">native</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">community</span><span class="token operator" style="color:#fc929e">/</span><span class="token plain">cli</span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">latest</span><span class="token plain"> init </span><span class="token maybe-class-name">MyProject</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">--</span><span class="token plain">version latest</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.76 is now the latest stable version of React Native and 0.73.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.73 in the near future.</p></div></div>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.75 - Support for Percentage Values in Layout, New Architecture Stabilization, Template & init Updates, and more]]></title>
            <link>https://reactnative.dev/blog/2024/08/12/release-0.75</link>
            <guid>https://reactnative.dev/blog/2024/08/12/release-0.75</guid>
            <pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are excited to release React Native 0.75!]]></description>
            <content:encoded><![CDATA[<p>Today we are excited to release React Native 0.75!</p>
<p>This release ships several features, such as Yoga 3.1 with support for <code>%</code> values, several stabilization fixes for the New Architecture, and the introduction of the recommendation for users to use a React Native Framework.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#yoga-31-and-layout-improvements">Yoga 3.1 and Layout Improvements</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#new-architecture-stabilization">New Architecture Stabilization</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#using-frameworks">Using Frameworks</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#touchables-in-typescript-cant-be-used-as-types-in-generic-expressions-anymore">Touchables in TypeScript can’t be used as types in Generic expressions anymore</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#last-version-supporting-minsdk-23-and-miniosversion-134">Last version supporting minSdk 23 and minIOSVersion 13.4</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#android-jsimodule-has-been-deleted">Android: JSIModule has been deleted</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#android-popup-menu-moved-to-separate-package">Android: PopUp Menu removed from core</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#ios-finalized-pushnotificationios-deprecation-work">iOS: Finalized Push Notifications deprecation work</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/08/12/release-0.75#community-cli-removal-of-ram-bundle-and-profile-hermes-commands">Community CLI: Removal of ram-bundle and profile-hermes commands</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="yoga-31-and-layout-improvements">Yoga 3.1 and Layout Improvements<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#yoga-31-and-layout-improvements" class="hash-link" aria-label="Direct link to Yoga 3.1 and Layout Improvements" title="Direct link to Yoga 3.1 and Layout Improvements" translate="no">​</a></h3>
<p>Since we last shipped Yoga <a href="https://reactnative.dev/blog/2024/04/22/release-0.74#yoga-30" target="_blank" rel="noopener noreferrer" class="">version 3.0</a> in React Native 0.74, we kept on pushing many improvements and new layout capabilities for your applications. React Native 0.75 ships with Yoga 3.1 and you can learn more about what’s new in the official Yoga’s <a href="https://www.yogalayout.dev/blog/announcing-yoga-3.1" target="_blank" rel="noopener noreferrer" class="">release blog post</a>.</p>
<p>One notable and highly requested feature is the support for <code>%</code> values in various places, such as <code>gaps</code> and <code>translation</code></p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>These features are available only for the New Architecture. If you are keen to use them, please consider migrating to it.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="percentage-values-in-gaps">Percentage Values in Gaps<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#percentage-values-in-gaps" class="hash-link" aria-label="Direct link to Percentage Values in Gaps" title="Direct link to Percentage Values in Gaps" translate="no">​</a></h4>
<p>With 0.75, the <code>gap</code>, <code>columnGap</code> and <code>rowGap</code> props described <a href="https://reactnative.dev/docs/flexbox#row-gap-column-gap-and-gap" target="_blank" rel="noopener noreferrer" class="">here</a> now support a string with a <code>%</code> value.</p>
<p>For example:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">App</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token maybe-class-name">React</span><span class="token punctuation" style="color:#657b83">.</span><span class="token constant" style="color:#5a9bcf">JSX</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access maybe-class-name">Element</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">SafeAreaView</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        marginTop</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">20</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        alignItems</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'center'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        rowGap</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'20%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> columnGap</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'10%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'purple'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'blue'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'green'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> columnGap</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'10%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'lime'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'yellow'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'orange'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> columnGap</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'10%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'red'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'violet'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">          </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'magenta'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">            height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">SafeAreaView</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Will be rendered as follows:</p>
<div class="table-wrapper"><table><thead><tr><th>Android</th><th>iOS</th></tr></thead><tbody><tr><td><img decoding="async" loading="lazy" alt="Android Gaps" src="https://reactnative.dev/assets/images/0.75-android-gaps-666a10baba3b26cae0c48bb2a696a43a.png" width="373" height="768" class="img_SS3x"></td><td><img decoding="async" loading="lazy" alt="iOS Gaps" src="https://reactnative.dev/assets/images/0.75-ios-gaps-e2e421fdbebed0fa1c724113892ff1ed.png" width="378" height="768" class="img_SS3x"></td></tr></tbody></table></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="percentage-values-in-translation">Percentage values in Translation<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#percentage-values-in-translation" class="hash-link" aria-label="Direct link to Percentage values in Translation" title="Direct link to Percentage values in Translation" translate="no">​</a></h4>
<p>The <a href="https://reactnative.dev/docs/transforms" target="_blank" rel="noopener noreferrer" class=""><code>transform</code> prop</a> can also now accept <code>%</code> as values for the <code>translate</code> transformations.</p>
<p>For example, the following component would move the red square’s X coordinate by 100% of its width and the Y coordinate by 100% of its height:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Translated</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">SafeAreaView</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        marginTop</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">20</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        rowGap</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'20%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'red'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          transform</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">[</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">translateY</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'100%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">translateX</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'100%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">]</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">SafeAreaView</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Will be rendered as follows:</p>
<div class="table-wrapper"><table><thead><tr><th>Android</th><th>iOS</th></tr></thead><tbody><tr><td><img decoding="async" loading="lazy" alt="Android Translation" src="https://reactnative.dev/assets/images/0.75-android-translations-88fc4632bc683645cf686b9855356ed1.png" width="373" height="768" class="img_SS3x"></td><td><img decoding="async" loading="lazy" alt="iOS Translation" src="https://reactnative.dev/assets/images/0.75-ios-translation-a38ecabf731f3b27ea02ba45f16f8d93.png" width="384" height="768" class="img_SS3x"></td></tr></tbody></table></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-architecture-stabilization">New Architecture Stabilization<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#new-architecture-stabilization" class="hash-link" aria-label="Direct link to New Architecture Stabilization" title="Direct link to New Architecture Stabilization" translate="no">​</a></h3>
<p>Since our announcement of the <a href="https://github.com/reactwg/react-native-new-architecture/discussions/189" target="_blank" rel="noopener noreferrer" class="">New Architecture being in Beta</a> at React Conf, we shipped several bug fixes and improvements to its stability.</p>
<p>Our goal is for the New Architecture to be considered stable in the near future. Therefore, in the last few months we focused on bridging the gaps between the Old and the New Architecture. Some examples of bugs and missing features we fixed are:</p>
<ul>
<li class="">Fix <code>adjustsFontSizeToFit</code> on Android (<a href="https://github.com/facebook/react-native/pull/44075" target="_blank" rel="noopener noreferrer" class="">#44075</a>)</li>
<li class="">Fix <code>textAlign</code> not working with inline views on Android (<a href="https://github.com/facebook/react-native/pull/44146" target="_blank" rel="noopener noreferrer" class="">#44146</a>)</li>
<li class="">Fix text baseline being moved up on iOS (<a href="https://github.com/facebook/react-native/pull/44932" target="_blank" rel="noopener noreferrer" class="">#44932</a>)</li>
</ul>
<p>Together with the folks at Expo, we also worked on adding information about New Architecture support in the <a href="https://reactnative.directory/" target="_blank" rel="noopener noreferrer" class="">React Native Directory</a>, so it will be immediately clear for you if a library already supports the New Architecture or not:</p>
<p><img decoding="async" loading="lazy" alt="React Native Directory" src="https://reactnative.dev/assets/images/0.75-rn-directory-a5b9d610243d3824942bfff41c0a5656.png" width="970" height="380" class="img_SS3x"></p>
<p>We also invite you to take part in the <a href="https://t.co/ucAA58hnFu" target="_blank" rel="noopener noreferrer" class="">New Architecture survey</a>. This survey is key for us to collect precious feedback on the next steps for the New Architecture rollout.</p>
<p>We also want to share a post we published in the New Architecture Working Group about <a href="https://github.com/reactwg/react-native-new-architecture/discussions/201" target="_blank" rel="noopener noreferrer" class="">Supporting UIManager in the New Architecture</a>. This post offers an API overview of the <code>UIManager</code> API on Android and how it can help the migration of more advanced apps &amp; libraries.</p>
<p>This release contains also a new API which is now the blessed way to access the <code>jsi::Runtime</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="accessing-jsiruntime-in-turbomodules">Accessing <code>jsi::Runtime</code> in TurboModules<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#accessing-jsiruntime-in-turbomodules" class="hash-link" aria-label="Direct link to accessing-jsiruntime-in-turbomodules" title="Direct link to accessing-jsiruntime-in-turbomodules" translate="no">​</a></h4>
<p>In the past, there has never been a recommended way from native modules to access the <code>jsi::Runtime</code>, and consumers would work around the framework to do so in risky ways. In 0.74, we introduced experimental APIs providing safe access to the <code>jsi::Runtime</code>, and we’re happy to announce their stability for 0.75.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary>Examples on how to access the jsi::Runtime</summary><div><div class="collapsibleContent_Fd2D"><p>On iOS, you can make your Turbo Native Module conform to the protocol <code>RCTTurboModuleWithJSIBindings</code>. You can now implement <code>installJSIBindingsWithRuntime</code>, which will give you thread-safe access to the runtime.</p><div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">@interface</span><span class="token plain"> RCTSampleTurbo </span><span class="token function" style="color:#79b6f2">Module</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">RCTTurboModuleWithJSIBindings</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">@end</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token macro property directive-hash" style="color:#2aa198">#</span><span class="token macro property directive keyword" style="color:#c5a5c5">pragma</span><span class="token macro property" style="color:#2aa198"> </span><span class="token macro property expression" style="color:#2aa198">mark </span><span class="token macro property expression operator" style="color:#fc929e">-</span><span class="token macro property expression" style="color:#2aa198"> RCTTurboModuleWithJSIBindings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">installJSIBindingsWithRuntime</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">jsi</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">Runtime </span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">runtime </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  runtime</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">global</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">setProperty</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    runtime</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token string" style="color:#8dc891">"myGlobalFunction"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    jsi</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain"> Function</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">createFromHost </span><span class="token function" style="color:#79b6f2">Function</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>On Android, you can make your Turbo Native Module conform to the interface <code>TurboModuleWithBindings</code>. You can now implement the JNI method <code>getBindingsInstaller</code>, which will give you thread-safe access to the runtime in C++.</p><div class="language-java codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-java codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">SampleTurboModule</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">NativeSampleTurboModuleSpec</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">TurboModuleWithJSIBindings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token annotation punctuation" style="color:#657b83">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">native</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">BindingsInstallerHolder</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getBindingsInstaller</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div><div class="language-cpp codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-cpp codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">jni</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">local_ref</span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">BindingsInstallerHolder</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">javaobject</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">SampleTurboModuleJSIBindings</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token function" style="color:#79b6f2">getBindingsInstaller</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">jni</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">alias_ref</span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">jni</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">object</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain"> jobj</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">BindingsInstallerHolder</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token function" style="color:#79b6f2">newObjectCxxArgs</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">[</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">jsi</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">Runtime</span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token plain"> runtime</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      runtime</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">global</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">setProperty</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        runtime</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        “myGlobalFunction”</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">        jsi</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token class-name" style="color:#fac863">Function</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token function" style="color:#79b6f2">createFromHostFunction</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>If you’re on the UI thread and you need to access the runtime, we introduced a new API: <code>CallInvoker</code>. It consists of a single method, <code>invokeAsync</code>, that will jump onto the JS thread to safely execute some work using the JS runtime. These APIs are forward compatible.</p><p>On iOS, we’ve provided the protocol <code>RCTCallInvokerModule</code>. After conforming to this protocol, our infrastructure will decorate the module with access to the <code>CallInvoker</code>.</p><div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">@interface</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">RCTSampleTurboModule</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">RCTCallInvokerModule</span><span class="token operator" style="color:#fc929e">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">[</span><span class="token keyword" style="color:#c5a5c5">self</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">callInvoker callInvoker</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">invokeAsync</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">[</span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">jsi</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">Runtime</span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token plain"> runtime</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// do stuff on JS thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>On Android, the <code>CallInvoker</code> is accessible through the <code>ReactContext</code> in a JNI wrapper called <code>CallInvokerHolder</code>, where you can then call <code>invokeAsync</code> after crossing the JNI boundary.</p><div class="language-java codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-java codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// Java</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">abstract</span><span class="token plain"> </span><span class="token class-name" style="color:#fac863">CallInvokerHolder</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getJSCallInvokerHolder</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div><div class="language-cpp codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-cpp codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1">// C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">jsCallInvokerHolder</span><span class="token operator" style="color:#fc929e">-&gt;</span><span class="token function" style="color:#79b6f2">cthis</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token operator" style="color:#fc929e">-&gt;</span><span class="token function" style="color:#79b6f2">getCallInvoker</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token operator" style="color:#fc929e">-&gt;</span><span class="token function" style="color:#79b6f2">invokeAsync</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">[</span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">jsi</span><span class="token double-colon punctuation" style="color:#657b83">::</span><span class="token plain">Runtime</span><span class="token operator" style="color:#fc929e">&amp;</span><span class="token plain"> rt</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// do stuff on JS thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="using-frameworks">Using Frameworks<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#using-frameworks" class="hash-link" aria-label="Direct link to Using Frameworks" title="Direct link to Using Frameworks" translate="no">​</a></h3>
<p>As we shared at React Conf earlier this year, the recommended way to build a React Native app is now through a framework, such as Expo.</p>
<p>You can read more about this guidance on our previous blog-post: "<a href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps" target="_blank" rel="noopener noreferrer" class="">Use a framework to build React Native apps</a>".</p>
<p>We want to set up new React Native users for success. We believe that using a framework makes you as productive as possible, and offers you the best developer experience when building new apps.</p>
<p>To reflect those recommendations, this version includes the following changes:</p>
<ul>
<li class="">We moved the <code>/template</code> folder from the <code>react-native</code> package to a separate repository: <a href="https://github.com/react-native-community/template" target="_blank" rel="noopener noreferrer" class=""><code>react-native-community/template</code></a>.</li>
<li class="">We’re sunsetting the <code>react-native init</code> command as of December 31st 2024.</li>
</ul>
<p>If you’re already using a framework such as Expo, those changes won’t impact you at all. You’ll be able to use React Native 0.75 together with Expo SDK 51 (you can find instructions on how to do it in <a href="https://expo.dev/changelog/2024/08-14-react-native-0.75" target="_blank" rel="noopener noreferrer" class="">this dedicated Expo post</a>).</p>
<p>If you’re not using a framework or you’re building your own framework, let’s see how those changes will impact you.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="moving-the-template-to-react-native-communitytemplate">Moving the template to react-native-community/template<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#moving-the-template-to-react-native-communitytemplate" class="hash-link" aria-label="Direct link to Moving the template to react-native-community/template" title="Direct link to Moving the template to react-native-community/template" translate="no">​</a></h4>
<p>Historically, <code>react-native</code> used to ship a <code>/template</code> folder inside the NPM package which was used by the Community CLI to create new projects. This made updating the template quite slow as we needed a new React Native release for every template change.</p>
<p>With our latest recommendation to use a framework, we feel that shipping an opinionated template inside our core NPM package was not aligned with <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md" target="_blank" rel="noopener noreferrer" class="">our vision</a>.</p>
<p>Therefore, we decided to move the template to the <a href="https://www.npmjs.com/package/@react-native-community/template" target="_blank" rel="noopener noreferrer" class=""><code>@react-native-community/template</code></a> package.</p>
<p>This will make it easier for the community to maintain and evolve the template, without having to rely on a React Native release for every change. Moreover, this brings the template closer to the Community CLI and will make it easier for everyone to inspect and depend on the template as a separate package.</p>
<p>This change should be completely transparent to users who create new projects using the Community CLI. From now on, new issues related to the template should be reported on the <a href="https://github.com/react-native-community/template/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen" target="_blank" rel="noopener noreferrer" class="">template issue tracker</a>. All the various tools that depend on the template, such as the upgrade-helper, have also been updated accordingly and will continue working as usual.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="sunsetting-react-native-init">Sunsetting react-native init<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#sunsetting-react-native-init" class="hash-link" aria-label="Direct link to Sunsetting react-native init" title="Direct link to Sunsetting react-native init" translate="no">​</a></h4>
<p>Similarly to the template, the <code>react-native init</code> command was also adapted to align with the new recommendation.</p>
<p>Historically, <code>react-native init</code> was the default command to create new React Native projects. However, in 2024, we feel this command does not provide the same onboarding experience that a framework would offer you. That is why we are not recommending it anymore, instead you should use a framework like Expo.</p>
<p>You can still use <code>react-native init</code> to create new projects using the Community CLI &amp; template today, but you will see the following warning:</p>
<p><img decoding="async" loading="lazy" alt="Init Deprecation" src="https://reactnative.dev/assets/images/0.75-deprecation-55d183c728154671a92452650a08275e.png" width="1498" height="214" class="img_SS3x"></p>
<p>Starting from December 31st 2024, the <code>init</code> command won’t create a project anymore. You will have to either:</p>
<ul>
<li class="">Use a framework such as Expo, with its own dedicate command to create a new project, such as <code>npx create-expo-app</code></li>
<li class="">Invoke the Community CLI directly with <code>npx @react-native-community/cli init</code></li>
</ul>
<p>Please note that <code>react-native config</code> and all the other commands than <code>init</code> will continue working as usual.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>In order to offer a smoother migration experience, the <code>react-native@0.75.0</code> package is still depending on <code>@react-native-community/cli</code> but we’re planning on removing this dependency in the near future.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="auto-linking-performance-improvements">Auto-linking performance improvements<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#auto-linking-performance-improvements" class="hash-link" aria-label="Direct link to Auto-linking performance improvements" title="Direct link to Auto-linking performance improvements" translate="no">​</a></h4>
<p>During this work in updating the <code>init</code> command, we also spent time rewriting the auto-linking logic to be more performant. This results in faster build speed for both Android and iOS.</p>
<p>With React Native 0.75, if you are using Expo, the auto-linking step could now run ~6.5x faster on Android and ~1.5x faster on iOS. You can read more about these improvements <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/814" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking changes<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h3>
<p>While this upcoming section seems lengthy, we expect that the breaking changes here will mostly impact a small group of users that are using React Native in more advanced ways.</p>
<p>We want to present them here for the sake of completeness and for reference.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="touchables-in-typescript-cant-be-used-as-types-in-generic-expressions-anymore">Touchables in TypeScript can’t be used as types in Generic expressions anymore<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#touchables-in-typescript-cant-be-used-as-types-in-generic-expressions-anymore" class="hash-link" aria-label="Direct link to Touchables in TypeScript can’t be used as types in Generic expressions anymore" title="Direct link to Touchables in TypeScript can’t be used as types in Generic expressions anymore" translate="no">​</a></h4>
<p><code>TouchablesOpacity</code> and <code>TouchableHighlights</code> components have been converted to functional components. This means that they cannot be used as <code>value &amp; type</code> anymore. So, for example, the following is not valid anymore:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">TouchableHighlight</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> ref </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#79b6f2">useRef</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&lt;</span><span class="token generic-function generic class-name" style="color:#fac863">TouchableHighlight</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">//                ^^^ TS2749: TouchableHighlight refers to a value, but is being used as a type here.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">//                            Did you mean typeof TouchableHighlight?</span><br></span></code></pre></div></div>
<p>Instead, you should use the built-in React type <code>React.ElementRef</code> or, alternatively, the <code>View</code> type:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports maybe-class-name">TouchableHighlight</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> ref1 </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token generic-function function" style="color:#79b6f2">useRef</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&lt;</span><span class="token generic-function generic class-name" style="color:#fac863">React</span><span class="token generic-function generic class-name punctuation" style="color:#657b83">.</span><span class="token generic-function generic class-name" style="color:#fac863">ElementRef</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&lt;</span><span class="token generic-function generic class-name keyword" style="color:#c5a5c5">typeof</span><span class="token generic-function generic class-name" style="color:#fac863"> TouchableHighlight</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&gt;&gt;</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// or</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> ref2 </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#79b6f2">useRef</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&lt;</span><span class="token generic-function generic class-name" style="color:#fac863">View</span><span class="token generic-function generic class-name operator" style="color:#fc929e">&gt;</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="last-version-supporting-minsdk-23-and-miniosversion-134">Last version supporting minSdk 23 and minIOSVersion 13.4<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#last-version-supporting-minsdk-23-and-miniosversion-134" class="hash-link" aria-label="Direct link to Last version supporting minSdk 23 and minIOSVersion 13.4" title="Direct link to Last version supporting minSdk 23 and minIOSVersion 13.4" translate="no">​</a></h4>
<p>These are not breaking changes in 0.75 <em>per se</em>, but we want to share that React Native 0.75 will be the last version of React Native to support minSdk 23 (Android 6.0) and minIOSVersion 13.4.</p>
<p>Starting from React Native 0.76, the minSdk version will be 24 (Android 7.0) and the minIOSVersion will be 15.1.</p>
<p>You can read more about it in our official announcement <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/802" target="_blank" rel="noopener noreferrer" class="">for Android</a> and <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/812" target="_blank" rel="noopener noreferrer" class="">for iOS</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android-jsimodule-has-been-deleted">Android: JSIModule has been deleted<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#android-jsimodule-has-been-deleted" class="hash-link" aria-label="Direct link to Android: JSIModule has been deleted" title="Direct link to Android: JSIModule has been deleted" translate="no">​</a></h4>
<p>The <code>com.facebook.react.bridge.JSIModule</code> (<a href="https://github.com/facebook/react-native/blob/0.73-stable/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java" target="_blank" rel="noopener noreferrer" class="">source</a>) was an API that we temporarily introduced to allow a Native Module to access JSI directly on Android.
The accessors for this API <a href="https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes" target="_blank" rel="noopener noreferrer" class="">were deprecated in 0.74</a>, and we verified that there was no meaningful usage of this API in Open Source so we’re removing it in 0.75.
You can use <a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/turbo-modules.md" target="_blank" rel="noopener noreferrer" class="">Turbo Native Modules</a> instead as an alternative.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android-popup-menu-moved-to-separate-package">Android: PopUp Menu moved to separate package<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#android-popup-menu-moved-to-separate-package" class="hash-link" aria-label="Direct link to Android: PopUp Menu moved to separate package" title="Direct link to Android: PopUp Menu moved to separate package" translate="no">​</a></h4>
<p>In 0.74, <a href="https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes" target="_blank" rel="noopener noreferrer" class="">we moved the Android’s <code>PopUpMenu</code> to a separate package</a> under the <code>@react-native</code> scope.
In 0.75, we are removing the remaining methods that were still in core:</p>
<ul>
<li class=""><code>UIManagerModule.showPopupMenu()</code></li>
<li class=""><code>UIManagerModule.dismissPopupMenu()</code></li>
</ul>
<p>As an alternative, please use the please use the <code>&lt;PopupMenuAndroid /&gt;</code> component, which lives in the <a href="https://www.npmjs.com/search?q=%40react-native%2Fpopup-menu-android" target="_blank" rel="noopener noreferrer" class=""><code>@react-native/popup-menu-android</code></a> package.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios-finalized-pushnotificationios-deprecation-work">iOS: Finalized PushNotificationIOS deprecation work<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#ios-finalized-pushnotificationios-deprecation-work" class="hash-link" aria-label="Direct link to iOS: Finalized PushNotificationIOS deprecation work" title="Direct link to iOS: Finalized PushNotificationIOS deprecation work" translate="no">​</a></h4>
<p>In 0.74, we <a href="https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes-to-pushnotificationios-deprecated" target="_blank" rel="noopener noreferrer" class="">deprecated</a> some APIs from the <code>PushNotificationIOS</code> module.</p>
<p>In 0.75, we’ve deleted these APIs to migrate off legacy representations of notifications metadata.</p>
<p>The APIs that have been deleted are:</p>
<div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objc codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token operator" style="color:#fc929e">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">didReceiveLocalNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UILocalNotification </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token operator" style="color:#fc929e">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">didReceiveRemoteNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">NSDictionary </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>Instead, use <code>didReceiveNotification:(UNNotification *)notification</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="community-cli-removal-of-ram-bundle-and-profile-hermes-commands">Community CLI: Removal of ram-bundle and profile-hermes commands<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#community-cli-removal-of-ram-bundle-and-profile-hermes-commands" class="hash-link" aria-label="Direct link to Community CLI: Removal of ram-bundle and profile-hermes commands" title="Direct link to Community CLI: Removal of ram-bundle and profile-hermes commands" translate="no">​</a></h4>
<p>We would like to announce two significant removals coming from the Community CLI: the commands <code>ram-bundle</code> and <code>profile-hermes</code>.</p>
<p>The <code>ram-bundle</code> command was introduced in React Native 0.59 to let you run your bundles by loading them directly in memory. This functionality is now superseded by Hermes, our default JS engine. You should not use the <code>ram-bundle</code> command.</p>
<p>The <code>profile-hermes</code> command was a tool to help you profile the CPU performance of your JavaScript code. This used the old <code>.cpuprofile</code> format, which is no longer supported in recent versions of Chrome. Including this capability as a standalone command is also something we are moving away from as we work on raising the quality bar of our debugging tools. CPU profiling can now be accessed from the "Profiler" panel in the <a href="https://reactnative.dev/docs/0.74/debugging?js-debugger=new-debugger#opening-the-debugger" target="_blank" rel="noopener noreferrer" class="">Experimental New Debugger</a> (Note: this is not accessible if connecting to Hermes from Chrome).</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking changes<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking changes" title="Direct link to Other Breaking changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="general">General<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#general" class="hash-link" aria-label="Direct link to General" title="Direct link to General" translate="no">​</a></h3>
<ul>
<li class=""><strong>Codegen</strong>
<ul>
<li class="">Changed slightly the name of pure C++ TurboModules generated classes and structs. We dropped the <code>Cxx</code> token from their names</li>
<li class="">Float enums are not supported anymore due to possible precision errors</li>
<li class="">Throw an error when passing <code>null</code> in JS to a non nullable argument in Native</li>
</ul>
</li>
<li class=""><strong>Linting</strong>
<ul>
<li class="">ESLint config no longer run prettier when linting</li>
</ul>
</li>
<li class=""><strong>C++</strong>
<ul>
<li class=""><code>ScrollViewShadowNode</code> now requires a new <code>bool includeTransform</code> parameter in the constructor</li>
<li class="">Removed <code>executeAsynchronously</code> and <code>executeSynchronously_CAN_DEADLOCK</code> from RuntimeExecutor</li>
<li class="">Renamed <code>JsErrorHandlingFunc</code> to <code>OnJsError</code> in <code>JsErrorHandler.h</code></li>
<li class="">Renamed <code>handleJsError</code> to <code>OnJsError</code> in <code>handleFatalError.h</code></li>
<li class="">Removed unused <code>import</code> from <code>ReactPrimitives.h</code></li>
<li class=""><code>LongLivedObjectCollection</code> and <code>LongLivedObject</code> get methods now accepts a Runtime parameter</li>
<li class="">Renamed the <code>utils/jsi.h</code> file to <code>jsi-utils.h</code></li>
</ul>
</li>
<li class=""><strong>TextInput</strong>
<ul>
<li class="">Removed deprecated <code>onTextInput</code> callback</li>
</ul>
</li>
<li class=""><strong>Pressability</strong>
<ul>
<li class="">Removed <code>onLongPressShouldCancelPress_DEPRECATED</code>, <code>onResponderTerminationRequest_DEPRECATED</code>, and <code>onStartShouldSetResponder_DEPRECATED</code> method</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="android">Android<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android" translate="no">​</a></h4>
<ul>
<li class=""><strong>ReactViewBackgroundDrawable</strong>
<ul>
<li class="">Deprecated in favor of <code>CSSBackgroundDrawable</code>. This also remove some APIs from <code>ReactViewBackgroundDrawable</code> and from <code>ColorUtil</code></li>
</ul>
</li>
<li class=""><strong>ReactContext</strong>
<ul>
<li class=""><code>ReactContext</code> and <code>ReactApplicationContext</code> are now abstract. Use <code>BridgeReactContext</code> and <code>BridgelessReactContext</code> instead</li>
<li class="">Delete <code>ReactContext.initializeWithInstance()</code>. Please use <code>BridgeReactInstance</code> instead</li>
<li class="">Remove <code>BridgelessReactContext.getJavaScriptContextHolder()</code> from. Please use <code>BridgelessCatalystInstance</code> instead</li>
<li class="">Remove <code>ReactContext.getRuntimeExecutor()</code>. Please use <code>BridgelessCatalystInstance</code></li>
</ul>
</li>
<li class=""><strong>Layout</strong>
<ul>
<li class="">Support percentage flex gap values. This changes the parameters of some methods like <code>setGap</code>, <code>setRowGap</code> and <code>setColumnGap</code> from float to dynamic</li>
<li class="">Requires <code>supportsRTL</code> in Android Manifest</li>
</ul>
</li>
<li class=""><strong>Runtime</strong>
<ul>
<li class="">Removed <code>ReactJsExceptionHandler</code> from ReactHostImpl</li>
<li class="">Make the app responsible to return the core turbomodules when not using the default template</li>
</ul>
</li>
<li class=""><strong>DevSupport</strong>
<ul>
<li class="">Changed the <code>DevSupportManagerFactory.create()</code> to accept a new <code>PausedInDebuggerOverlayManager</code> parameter</li>
</ul>
</li>
<li class=""><strong>Measurement</strong>
<ul>
<li class="">Deleted <code>UIManagerModule.measureLayoutRelativeToParent()</code></li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4>
<ul>
<li class=""><strong>Runtime</strong>
<ul>
<li class="">Remove <code>[RCTHost getSurfacePresenter]</code> and <code>[RCTHost getModuleRegistry]</code></li>
<li class="">Remove <code>EventPriority</code> class and always use the default <code>EventPriority::AsynchronousBatched</code>. If build fails, please remove any use of <code>EventPriority</code></li>
</ul>
</li>
<li class=""><strong>Image</strong>
<ul>
<li class="">Remove unused <code>RCTImageLoadingPerfInstrumentationEnabled</code></li>
</ul>
</li>
<li class=""><strong>Error Handling</strong>
<ul>
<li class="">Remove <code>RCTRedBox</code> access through <code>RCTBridge</code></li>
</ul>
</li>
<li class=""><strong>CocoaPods</strong>
<ul>
<li class="">Renamed <code>BUILD_FROM_SOURCE</code> to <code>RCT_BUILD_HERMES_FROM_SOURCE</code></li>
<li class="">Renamed <code>React-Codegen</code> to <code>ReactCodegen</code> for better compatibility with <code>use_frameworks</code> and Swift</li>
</ul>
</li>
<li class=""><strong>TextInput</strong>
<ul>
<li class="">Remove deprecated <code>onTextInput</code> callback</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h3>
<p>React Native 0.75 contains over <strong>1491 commits</strong> from <strong>165 contributors</strong>. Thanks for all your hard work!</p>
<p>Thanks to all the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer" class="">Nick Gerleman</a> and <a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer" class="">Joe Vilches</a> for <em>Yoga 3.1 and Layout Improvements</em></li>
<li class=""><a href="https://github.com/arushikesarwani94" target="_blank" rel="noopener noreferrer" class="">Arushi Kesarwani</a> for Supporting UIManager in the New Architecture</li>
<li class=""><a href="https://github.com/philIip" target="_blank" rel="noopener noreferrer" class="">Phillip Pan</a> for Accessing jsi::Runtime in TurboModules</li>
<li class=""><a href="https://github.com/alanleedev" target="_blank" rel="noopener noreferrer" class="">Alan Lee</a> and <a href="https://github.com/realsoelynn" target="_blank" rel="noopener noreferrer" class="">Soe Lynn</a> for Last version supporting minSdk 23 and minIOSVersion 13.4</li>
<li class=""><a href="https://github.com/kudo" target="_blank" rel="noopener noreferrer" class="">Kudo Chien</a> for Auto-linking performance improvements</li>
<li class=""><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer" class="">Alex Hunt</a> for Removal of <code>ram-bundle</code> and <code>profile-hermes</code> commands</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-075">Upgrade to 0.75<a href="https://reactnative.dev/blog/2024/08/12/release-0.75#upgrade-to-075" class="hash-link" aria-label="Direct link to Upgrade to 0.75" title="Direct link to Upgrade to 0.75" translate="no">​</a></h3>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the Upgrading docs.</p>
<p>To create a new project:</p>
<div class="language-bash codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-bash codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx @react-native-community/cli@latest init MyProject </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> latest</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.75 will be supported in Expo SDK 51 (instructions on how to updated React Native inside your Expo project to 0.75.0 are available <a href="https://expo.dev/changelog/2024/08-14-react-native-0.75" target="_blank" rel="noopener noreferrer" class="">in this dedicated post</a>).</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.75 is now the latest stable version of React Native and 0.72.x moves to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/support.md" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.72 in the near future.</p></div></div>]]></content:encoded>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[Use a framework to build React Native apps]]></title>
            <link>https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps</link>
            <guid>https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps</guid>
            <pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[At React Conf, we updated our guidance on the best tool to get started building React Native apps: a React Native framework - a toolbox with all the necessary APIs to let you build production-ready apps.]]></description>
            <content:encoded><![CDATA[<p>At <a href="https://www.youtube.com/live/0ckOUBiuxVY?si=pU4qP4eB5iWfY0IG&amp;t=2320" target="_blank" rel="noopener noreferrer" class="">React Conf</a>, we updated our guidance on the best tool to get started building React Native apps: a <strong>React Native framework</strong> - a toolbox with all the necessary APIs to let you build production-ready apps.</p>
<p>Using React Native frameworks, such as Expo, is now the <strong>recommended</strong> approach to create new apps.</p>
<p>In this blogpost we want to walk you through what they are in detail and what they mean for you as a React Native developer starting a new project.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="what-is-a-react-native-framework">What is a React Native framework?<a href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps#what-is-a-react-native-framework" class="hash-link" aria-label="Direct link to What is a React Native framework?" title="Direct link to What is a React Native framework?" translate="no">​</a></h2>
<p>If you’ve been building production apps, you probably know that there is a set of common problems you will need to solve sooner or later.</p>
<p>When building any application on either web or native, you probably want your users to navigate through different screens, fetch data, and store the state of your user. But for native apps there is even more to deal with: you need tools to upgrade your native code between React Native versions, manage compatible versions of all of your dependencies, and deal with native build tools.</p>
<p>It takes a village to bring an app from idea to production without the right tools.</p>
<p>We want you to focus on writing beautiful applications and features for your users, and not solving those common problems over and over.</p>
<p>That’s why we believe that the best way for you to experience React Native is through a framework that offers a toolbox with all the necessary tools you need to build production-ready applications.</p>
<p>We’ve found that <strong>you’re either using a framework or you’re building your own framework</strong>.</p>
<p>There is nothing wrong with building your own framework, by crafting your own solutions for routing, navigation, deploying, and so on. Major corporations like Meta and Microsoft build their own frameworks internally to integrate deeply into their brownfield apps. But we believe that most people will be better off by using an existing framework.</p>
<p>If you’ve been using React on web, you’re probably familiar with a similar concept of <a href="https://react.dev/learn/start-a-new-react-project#production-grade-react-frameworks" target="_blank" rel="noopener noreferrer" class="">production-grade React frameworks</a>.</p>
<p>As of today, the only recommended community framework for React Native is <a href="https://docs.expo.dev/" target="_blank" rel="noopener noreferrer" class="">Expo</a>. Folks at Expo have been investing in the React Native ecosystem since the early days of React Native and as of today, we believe the developer experience offered by Expo is best in class.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>Expo, the framework, is and will remain free and open source, while Expo Application Services (EAS) is an optional paid service.</p></div></div>
<p>If you haven’t used Expo recently, make sure you don’t miss <a href="https://www.youtube.com/live/0ckOUBiuxVY?si=N-WSfmAJSMfd6wDL&amp;t=3888" target="_blank" rel="noopener noreferrer" class="">this talk from Kadi @ Expo</a> where she’s showcasing what you can do with Expo in 2024.</p>
<p>We’ve also updated the <a href="https://reactnative.dev/docs/environment-setup" target="_blank" rel="noopener noreferrer" class="">Getting Started page</a> on the website to reflect this recommendation.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-will-frameworks-affect-you">How will frameworks affect you?<a href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps#how-will-frameworks-affect-you" class="hash-link" aria-label="Direct link to How will frameworks affect you?" title="Direct link to How will frameworks affect you?" translate="no">​</a></h2>
<p>If you’re already using a recommended framework such as Expo, you’re already good to go!</p>
<p>If you'd like to migrate your existing app to Expo, you can find instructions on <a href="https://docs.expo.dev/bare/overview/" target="_blank" rel="noopener noreferrer" class="">the official Expo website</a>. Expo offers many benefits, such as an easier way to <a href="https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/" target="_blank" rel="noopener noreferrer" class="">upgrade your React Native version</a>, a better developer experience, and much more.</p>
<p>However, if you can't or don't want to migrate to Expo, that's fine too. Using React Native without an official framework will continue to be supported. The tools you’ve been using such as React Native Community CLI, Template and <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">Upgrade Helper</a> will keep on working as usual.</p>
<p>The <code>react-native init</code> command has moved out of core and is now accessible via:</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx </span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">react</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">native</span><span class="token operator" style="color:#fc929e">-</span><span class="token plain">community</span><span class="token operator" style="color:#fc929e">/</span><span class="token plain">cli</span><span class="token decorator at operator" style="color:#fc929e">@</span><span class="token decorator function" style="color:#79b6f2">latest</span><span class="token plain"> init</span><br></span></code></pre></div></div>
<p>and on GitHub at <a href="https://github.com/react-native-community/cli" target="_blank" rel="noopener noreferrer" class="">react-native-community/cli</a>.</p>
<p>If you’re a React Native library developer, we collected a list of recommendations on which APIs to use. <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md#what-do-we-recommend-to-react-native-library-developers" target="_blank" rel="noopener noreferrer" class="">Read more in the RFC</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="further-reading">Further reading<a href="https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading" translate="no">​</a></h2>
<p>If you’re interested in learning more about the reasoning behind this decision, we invite you to read the <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md#what-do-we-recommend-to-react-native-library-developers" target="_blank" rel="noopener noreferrer" class="">RFC0759: React Native Frameworks</a>. This RFC is a result of a multi-month effort involving countless discussions and brainstorming among different partners and players of the React Native ecosystem.</p>
<p>While Expo today is the only recommended framework, the RFC also contains <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md#becoming-a-react-native-framework" target="_blank" rel="noopener noreferrer" class="">guidelines</a> on how to become a recommended framework, as we hope to see more competition and innovation in this space.</p>
<p>Moreover, you should check out the talk <a href="https://www.youtube.com/watch?v=lifGTznLBcw" target="_blank" rel="noopener noreferrer" class="">useFrameworks()</a> at App.js 2024 where we presented this RFC and the necessary changes in a short format.</p>
<p>We believe that by clarifying the respective responsibilities of React Native Core and the Frameworks, we can foster a healthier ecosystem and drive growth &amp; innovation for React Native.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.74 - Yoga 3.0, Bridgeless New Architecture, and more]]></title>
            <link>https://reactnative.dev/blog/2024/04/22/release-0.74</link>
            <guid>https://reactnative.dev/blog/2024/04/22/release-0.74</guid>
            <pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're releasing React Native 0.74! This release adds Yoga 3.0, Bridgeless by default under the New Architecture, batched onLayout updates (New Architecture), and Yarn 3 as the default package manager for new projects.]]></description>
            <content:encoded><![CDATA[<p>Today we're releasing React Native 0.74! This release adds Yoga 3.0, Bridgeless by default under the New Architecture, batched <code>onLayout</code> updates (New Architecture), and Yarn 3 as the default package manager for new projects.</p>
<p>We are also removing deprecated APIs, with the removal of <code>PropTypes</code> and breaking changes to <code>PushNotificationIOS</code>. On Android, SDK 23 (Android 6.0) is now the minimum supported version.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#yoga-30">Yoga 3.0</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-architecture-bridgeless-by-default">New Architecture: Bridgeless by Default</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-architecture-batched-onlayout-updates">New Architecture: Batched <code>onLayout</code> Updates</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#yarn-3-for-new-projects">Yarn 3 for New Projects</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#android-minimum-sdk-bump-android-60">Android Minimum SDK Bump (Android 6.0)</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes-to-pushnotificationios-deprecated">API Changes to PushNotificationIOS (Deprecated)</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#removal-of-deprecated-proptypes">Removal of Deprecated <code>PropTypes</code></a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#removal-of-flipper-react-native-plugin">Removal of Flipper React Native Plugin</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes">Other Breaking Changes</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="yoga-30">Yoga 3.0<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#yoga-30" class="hash-link" aria-label="Direct link to Yoga 3.0" title="Direct link to Yoga 3.0" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="new-layout-behaviors">New Layout Behaviors<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-layout-behaviors" class="hash-link" aria-label="Direct link to New Layout Behaviors" title="Direct link to New Layout Behaviors" translate="no">​</a></h4>
<p>React Native 0.74 includes <a href="https://yogalayout.dev/blog/announcing-yoga-3.0" target="_blank" rel="noopener noreferrer" class="">Yoga 3.0</a>, the newest version of our layout engine. Yoga 3.0 improves layout by making styling more predictable, and supports rendering components written for the web.</p>
<p>React Native continues to intentionally preserve some incorrect layout behaviors, where fixing them was found to effect a significant number of real-world components. Layout conformance will be able to be configured more granularly in future versions of React Native.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>React Native <a href="https://yogalayout.dev/blog/announcing-yoga-3.0#correct-handling-of-logical-edges-in-row-reverse-containers" target="_blank" rel="noopener noreferrer" class="">previously flipped</a> <code>left</code>/<code>right</code> (and <code>start</code>/<code>end</code>) edges when dealing with <code>margin</code>, <code>padding</code>, or <code>border</code>, set on a <code>row-reverse</code> container. Now, behavior of these properties lines up with web. Code which previously relied on edges being inverted may need to be updated to continue rendering correctly.</p><table><tbody><tr><th>Style</th><th>Before</th><th>After</th></tr><tr><td width="350"><div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'red'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">margin</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">10</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">200</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">  </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">    </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row-reverse'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'blue'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">marginLeft</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">50</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'green'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'50%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">flex</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">marginLeft</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">50</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">    </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><br></span></code></pre></div></div></td><td><p><img decoding="async" loading="lazy" alt="Previous layout" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkAgMAAAC+6JeYAAAACVBMVEX/AAAAgAIAAP/8wXIfAAAANklEQVR42u3LoQ0AIAwAsJ2I4T8MhiuxM8v0ktY3XnJ3YUWmKIqiKIqiTCy9oyiKoiiKoowuHxexOPfpM7ojAAAAAElFTkSuQmCC" width="200" height="100" class="img_SS3x"></p></td><td><p><img decoding="async" loading="lazy" alt="New layout" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkAgMAAAC+6JeYAAAACVBMVEX/AAAAgAIAAP/8wXIfAAAAMklEQVR42u3LoQ0AMAgAsOn9x5NcicUQNEnr+7qfTUwURVEURVGU+2WnKIqiKIqinCsFTv3+UKPaRfkAAAAASUVORK5CYII=" width="200" height="100" class="img_SS3x"></p></td></tr></tbody></table></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="support-for-align-content-space-evenly">Support for <code>align-content: 'space-evenly'</code><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#support-for-align-content-space-evenly" class="hash-link" aria-label="Direct link to support-for-align-content-space-evenly" title="Direct link to support-for-align-content-space-evenly" translate="no">​</a></h4>
<p>Yoga 3.0 brings support for <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/align-content#space-evenly" target="_blank" rel="noopener noreferrer" class=""><code>alignContent: 'space-evenly'</code></a>. <code>space-evenly</code> distributes the lines in a multi-line flex container using evenly spaced gaps, placed between line and container edges.</p>
<figure><img alt="Visual reference for alignContent behaviors" src="https://reactnative.dev/blog/assets/0.74-align-content.png" width="360"><figcaption><small>Source: <a href="https://www.w3.org/TR/css-align-3/#distribution-values" target="_blank" rel="noopener noreferrer" class="">World Wide Web Consortium</a></small></figcaption></figure>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="support-for-position-static">Support for <code>position: 'static'</code><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#support-for-position-static" class="hash-link" aria-label="Direct link to support-for-position-static" title="Direct link to support-for-position-static" translate="no">​</a></h4>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p><code>position: 'static'</code> is supported only in the New Architecture.</p></div></div>
<p>Elements marked as <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/position#static" target="_blank" rel="noopener noreferrer" class=""><code>position: 'static'</code></a> may not be offset, and are not considered when determining the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block" target="_blank" rel="noopener noreferrer" class="">containing block</a> of an absolutely positioned element. This allows positioning an element relative to an ancestor which is not its direct parent.</p>
<table><tbody><tr><td width="350"><div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">  </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'blue'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">200</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">200</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">flexDirection</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'row-reverse'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">  </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">    </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'red'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">100</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">position</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'static'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">    </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">      </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'green'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">width</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">25</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">height</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'25%'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">left</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">25</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">top</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript number" style="color:#5a9bcf">25</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript literal-property property" style="color:#2aa198">position</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'absolute'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">,</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">      </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">    </span><span class="token tag punctuation" style="color:#657b83">/&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><br></span></code></pre></div></div></td><td width="300"><p><img decoding="async" loading="lazy" alt="Static Example" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGOCAMAAACOvaUVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAABkKADAAQAAAABAAABjgAAAAA32yssAAAACXBIWXMAAAsTAAALEwEAmpwYAAACymlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yODg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI4NjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoqdD14AAACTFBMVEUAAP8Afz//ACgAgSoAiQAAfEIAfEH/ACAAiAAAe0L3ADLZAIAAgCb2ADIAhwDWAIQAgCH/ABcAfyUAhgDVAIMAgBsAfyAAgBoAfx8AhQD/ABAAgBkAfx4AgBgAfScAgBcAfSYAgBb/AAwAfxr/AAsAhAAAfCkAgBQAgBMAfCf+AAsAgBIAfCbOAIgAfxYAfCUAgBAAgwAAfxQAgA4AfxMAgA0AfxIAgAwAfxEAgAsAfxAAggAAgAr/AAAAgAkAbWn+AAAAgQAAgAUAanUAgAMAgAIAa24AaH0AgAEAZoYAgAD7AAAAZoUAbGYAam8Aam4AZYcAam0AZYYAZYUAZ3oAaW8AdDMAb0oAczUAczQAczMAZ28AcjUAdxoAcDcAWKkAVq4AdQ0AVLEAU7IAU7EAWosAVJ6sAImrAIerAIYAUaMAT6iuAHQAT6MATqgAS7AATKoATKgARcKMAKwAPMNnANdlANlhANkAMtJYAOAAMsJXAN8AMsEAMsBXANwAMr4AMcIAMcEAKekAMMEAKOoAL8MAJ+sAJuwAJusAJesAJOwAI+wAJ9QAIutEAOcAH/AAHu48AOgAHPAAHeUAFfMlAPokAPsjAPoAEfYADP4YAPgWAP0VAP0ACv4SAP8TAPwRAP8ACfsQAP8ACfkACP4QAP0ACfgACPwACPsAB/4ABv8ABf8ABf4ABf0IAP8ABP8HAP4AA/8GAP4AA/4AA/0EAP8AAv8AAv4AAv0CAP8AAf8CAP4AAf4BAP8AAP4AAP0AAPgAAPcAAPMAAPJvRcS8AAAD2klEQVR42u3dT2scZQDH8d8zM7ubuI0WE6uCClLx6sFXoEjFV+Hb8nVYECxGTx5EPHoQxINQFaSlrUk2+2dmPLRCwcuMMLIJn88hgTyHwO/LPLu3CQAAAAAAAAAAAAAAAAAAAABcTyWjfbVLnzFK85Ghh2oy2vmmzyhlaecpg8wXu5H/obHzdFfWvaYupc8Ipe/6Dyw90RPyxZ3Pfm7XTdoMVff1wRu5u7hj7CmCbHP5eN33bdtkoO7w4rV1LmpbTxHk68fZ/Prkx9s5y2APH366ytmRrSf6UC/Ln179vZ7vMkh1cP+976vK0NMFSTdfrl5+YViQrpr/Oa9LMfR0QfrdYU5emWWo2WYnyJRBkrZq2lmXIdrMOiOPUeW/OMtQvlyNDjKp2sf5SAYTBEEEQRBBEEQQBBEEQRBEEAQRBEEEQRBBEARBBEEQQRBEEAQRBEEQRBAEEQRBBEEQQRAEQQRBEEEQRBAEEQRBEEQQBBEEQQRBEEEQBEEEQRBBEEQQBBEEQRBEEAQRBEEEQRBBEARBBEEQQRBEEAQRBEEQRBAEuf5BasNNpclYZZEsK4/W3gRJ384ebG6sM0C1axbbNGaeMki/Ot/99eSgyyBVs0tr5kmDbN787u2ziww0P/qh3W6y29p6kiBVDm+fN7c2WWWYZdsvjo+ynNl6iiAfJifvrt4pZddkkG1pZ/MXb+b4E1tPdGWdLLbreUqfJCl59rtP8q+/lPSlz2ZxYx49uJpKRru77kpG6Kul5wMAAAAAAAAAAAAAAAAAAACA/13JNXF6uU2Vq6/JNdE9ukjxgO2L01NX1j758uPP/zh7tHVl7YvzPFjdX29LEWQ/nOXyt3tvfZOkTvvPj7ZOm6eeHdQZfdDWzx3U7XMHyYiD9unpgIPrEWSXrvvl5vtxZe2NUpp8+9LxhSB7oUqfWWav32q9HWGfbFqvq9grnfeHIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIggiCIIAgiCIIgiCAIIgiCCIIggiAIggiCIIIgiCAIIgiCIIggCCIIggiCIIIgCIIIgiCCIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIggiCIIAgiCIIIgiAIIgiCCIIggiCIIAiCIIIgiCAIIgiCCIIgCCIIggiCIIIgiCAIgiCCIIggCCIIggiCIAgiCIIIgiCCIIggCIIggiCIIAgiCIIIgiAIIgiCCIIggiCIIAiCIIIgiCAIIgiCCIIgCCIIggiCIIIgiCAIIgiCIIggCCIIggiCIIIgCIIIgiCCIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIgV9nfQaK7IvVKYtEAAAAASUVORK5CYII=" width="400" height="398" class="img_SS3x"></p></td></tr></tbody></table>
<p>Notice how the green <code>&lt;View&gt;</code> declares <code>left</code> and <code>top</code> and it is positioned relative to the blue <code>&lt;View&gt;</code>, not its parent.</p>
<p>React Native continues to default to <code>position: 'relative'</code> when no <code>position</code> is set.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-architecture-bridgeless-by-default">New Architecture: Bridgeless by Default<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-architecture-bridgeless-by-default" class="hash-link" aria-label="Direct link to New Architecture: Bridgeless by Default" title="Direct link to New Architecture: Bridgeless by Default" translate="no">​</a></h3>
<p>In this release, we are making Bridgeless Mode the default when the New Architecture is enabled. You can learn more about our switch to Bridgeless as the default in <a href="https://github.com/reactwg/react-native-new-architecture/discussions/174" target="_blank" rel="noopener noreferrer" class="">this post</a>. To make the transition smoother we enhanced the interop layers to cover Bridgeless and worked with several libraries to make sure they will work in Bridgeless from day one.</p>
<p>Bridgeless is not the only interop layer we worked on: we improved the New Renderer Interop layers too. The most exciting bit is that it is now enabled by default: you don't need to specify the components that have to go through it! You can read more about them <a href="https://github.com/reactwg/react-native-new-architecture/discussions/175" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>Finally, if you want to learn more about the New Architecture, you can find documentation in the <a href="https://github.com/reactwg/react-native-new-architecture/tree/main/docs" target="_blank" rel="noopener noreferrer" class="">react-native-new-architecture</a> repo. When the New Architecture becomes the default, this information will be incorporated into <a href="https://reactnative.dev/" target="_blank" rel="noopener noreferrer" class="">reactnative.dev</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-architecture-batched-onlayout-updates">New Architecture: Batched <code>onLayout</code> updates<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-architecture-batched-onlayout-updates" class="hash-link" aria-label="Direct link to new-architecture-batched-onlayout-updates" title="Direct link to new-architecture-batched-onlayout-updates" translate="no">​</a></h3>
<p>State updates in <code>onLayout</code> callbacks are now batched. Previously, each state update in the <code>onLayout</code> event would result in a new render commit.</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-jsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#79b6f2">MyComponent</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">state1</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> setState1</span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useState</span><span class="token punctuation" style="color:#657b83">(</span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">state2</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> setState2</span><span class="token punctuation" style="color:#657b83">]</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useState</span><span class="token punctuation" style="color:#657b83">(</span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">        </span><span class="token tag attr-name" style="color:#c5a5c5">onLayout</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript arrow operator" style="color:#fc929e">=&gt;</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript function" style="color:#79b6f2">setState1</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript boolean" style="color:#ff8b50">true</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">;</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">       </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag" style="color:#fc929e">         </span><span class="token tag attr-name" style="color:#c5a5c5">onLayout</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript arrow operator" style="color:#fc929e">=&gt;</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript comment" style="color:#93a1a1">// When this event is executed, state1's new value is no longer observable here.</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">          </span><span class="token tag script language-javascript function" style="color:#79b6f2">setState2</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript boolean" style="color:#ff8b50">true</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">;</span><span class="token tag script language-javascript" style="color:#fc929e"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token tag script language-javascript" style="color:#fc929e">        </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#657b83">&lt;/</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">  );</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain-text">}</span><br></span></code></pre></div></div>
<p>In 0.74, <code>setState1</code> and <code>setState2</code> updates are batched together. This change is <a href="https://react.dev/learn/queueing-a-series-of-state-updates#react-batches-state-updates" target="_blank" rel="noopener noreferrer" class="">expected behavior in React</a> and allows for less re-renders.</p>
<div class="theme-admonition theme-admonition-danger admonition_WCGJ alert alert--danger"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_pbrs"><p>This change <strong>may break code</strong> that has relied on un-batched state updates. You'll need to refactor this code to use <a href="https://react.dev/learn/queueing-a-series-of-state-updates#updating-the-same-state-multiple-times-before-the-next-render" target="_blank" rel="noopener noreferrer" class="">updater functions</a> or equivalent.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="yarn-3-for-new-projects">Yarn 3 for New Projects<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#yarn-3-for-new-projects" class="hash-link" aria-label="Direct link to Yarn 3 for New Projects" title="Direct link to Yarn 3 for New Projects" translate="no">​</a></h3>
<p><a href="https://yarnpkg.com/blog/release/3.0" target="_blank" rel="noopener noreferrer" class="">Yarn 3</a> is now the default JavaScript package manager for new projects initialized with React Native Community CLI.</p>
<p>Yarn 3.x will be used with <code>nodeLinker: node-modules</code>, a mode providing compatibility with React Native libraries. This replaces Yarn Classic (1.x, deprecated) as the previous default. To upgrade Yarn version inside your existing app you can follow this <a href="https://yarnpkg.com/migration/guide" target="_blank" rel="noopener noreferrer" class="">guide</a>.</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">$ </span><span class="token function" style="color:#79b6f2">yarn</span><span class="token plain"> </span><span class="token parameter variable" style="color:#cb4b16">--help</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">━━━ Yarn Package Manager - </span><span class="token number" style="color:#5a9bcf">3.6</span><span class="token plain">.4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  $ </span><span class="token function" style="color:#79b6f2">yarn</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">&lt;</span><span class="token plain">command</span><span class="token operator" style="color:#fc929e">&gt;</span><br></span></code></pre></div></div>
<p>The Community CLI also supports initializing projects with other package managers via the <code>--pm</code> flag (<a href="https://github.com/react-native-community/cli/blob/main/docs/init.md" target="_blank" rel="noopener noreferrer" class="">read more</a>).</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking Changes<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-minimum-sdk-bump-android-60">Android Minimum SDK Bump (Android 6.0)<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#android-minimum-sdk-bump-android-60" class="hash-link" aria-label="Direct link to Android Minimum SDK Bump (Android 6.0)" title="Direct link to Android Minimum SDK Bump (Android 6.0)" translate="no">​</a></h3>
<p>React Native 0.74 has a minimum Android SDK version requirement of 23 (Android 6.0). Previously, this was Android 5.0 (API 21). See our context for this change <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/740" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="bonus-android-app-size-reduction">Bonus: Android app size reduction<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#bonus-android-app-size-reduction" class="hash-link" aria-label="Direct link to Bonus: Android app size reduction" title="Direct link to Bonus: Android app size reduction" translate="no">​</a></h4>
<p>The minimum SDK bump, together with several improvements at our native build, allowed us to greatly reduce the app size on user devices.</p>
<p>For example a newly created app with React Native 0.74 occupies ~13% less space on user device, resulting in ~4MB saved on device.</p>
<p><img decoding="async" loading="lazy" alt="Side-by-side comparison of a new React Native app in the Android system storage view" src="https://reactnative.dev/assets/images/0.74-android-app-size-0dc90c5494d274e5c4691287866bf518.jpg" width="1600" height="608" class="img_SS3x"></p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removal-of-deprecated-proptypes">Removal of Deprecated <code>PropTypes</code><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#removal-of-deprecated-proptypes" class="hash-link" aria-label="Direct link to removal-of-deprecated-proptypes" title="Direct link to removal-of-deprecated-proptypes" translate="no">​</a></h3>
<p>Before 0.74, React Native continued to ship with <code>PropTypes</code>, an API that has been deprecated since React 15.5 in 2017! We are now removing all built-in <code>PropTypes</code> from React Native, reducing app size (26.4kB in a minified bundle) and memory overhead.</p>
<p>The following <code>PropTypes</code> properties are removed: <code>Image.propTypes</code>, <code>Text.propTypes</code>, <code>TextInput.propTypes</code>, <code>ColorPropType</code>, <code>EdgeInsetsPropType</code>, <code>PointPropType</code>, <code>ViewPropTypes</code> (see <a href="https://github.com/facebook/react-native/commit/228cb80af9ded20107f3c7a30ffe00e24471bfeb" target="_blank" rel="noopener noreferrer" class="">commit</a>).</p>
<p>If your app or library relies on <code>PropTypes</code>, we highly recommend migrating to a type system like TypeScript.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="api-changes-to-pushnotificationios-deprecated">API Changes to PushNotificationIOS (Deprecated)<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes-to-pushnotificationios-deprecated" class="hash-link" aria-label="Direct link to API Changes to PushNotificationIOS (Deprecated)" title="Direct link to API Changes to PushNotificationIOS (Deprecated)" translate="no">​</a></h3>
<p>In React Native 0.74, we are making steps to remove the deprecated <a href="https://reactnative.dev/docs/pushnotificationios" target="_blank" rel="noopener noreferrer" class="">PushNotificationIOS</a> library. The changes in this release are focused on removing references to older iOS APIs. PushNotificationIOS has been migrated onto Apple’s <a href="https://developer.apple.com/documentation/usernotifications?language=objc" target="_blank" rel="noopener noreferrer" class="">User Notifications</a> framework and exposes new APIs for scheduling and handling notifications.</p>
<p>In the next release (0.75), we are planning to <strong>remove this library</strong>, relocating it out of React Native core and into the community package, <a href="https://github.com/react-native-push-notification/ios" target="_blank" rel="noopener noreferrer" class="">@react-native-community/push-notification-ios</a>. If you are still relying on PushNotificationIOS, you’ll need to migrate over before the next release.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="api-changes">API Changes<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes" class="hash-link" aria-label="Direct link to API Changes" title="Direct link to API Changes" translate="no">​</a></h4>
<p>The <code>didRegisterUserNotificationSettings:</code> callback on <code>RCTPushNotificationManager</code> was a no-op and has been deleted.</p>
<p>The following callbacks on <code>RCTPushNotificationManager</code> have been deprecated and will be removed in 0.75:</p>
<div class="language-objectivec codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objectivec codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token operator" style="color:#fc929e">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">didReceiveLocalNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UILocalNotification </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token operator" style="color:#fc929e">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">didReceiveRemoteNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">NSDictionary </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>In order to retrieve the notification which launched the app using <code>getInitialNotification()</code>, you’ll now need to explicitly set the <code>initialNotification</code> on <code>RCTPushNotificationManager</code>:</p>
<div class="language-objectivec codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objectivec codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">RCTPushNotificationManager setInitialNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">response</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>On the JS side, properties on <code>Notification</code> have changed. <code>alertAction</code> and <code>repeatInterval</code> are now deprecated and will be removed in 0.75:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">type </span><span class="token maybe-class-name">Notification</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token spread operator" style="color:#fc929e">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// NEW: Seconds from now to display the notification.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  fireIntervalSeconds</span><span class="token operator" style="color:#fc929e">?</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">?</span><span class="token plain">number</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// CHANGED: Used only for scheduling notifications. Will be null when</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// retrieving notifications using `getScheduledLocalNotifications` or</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// `getDeliveredNotifications`.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  soundName</span><span class="token operator" style="color:#fc929e">?</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">?</span><span class="token plain">string</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// DEPRECATED: This was used for iOS's legacy UILocalNotification.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  alertAction</span><span class="token operator" style="color:#fc929e">?</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">?</span><span class="token plain">string</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// DEPRECATED: Use `fireDate` or `fireIntervalSeconds` instead.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  repeatInterval</span><span class="token operator" style="color:#fc929e">?</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">?</span><span class="token plain">string</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>Finally, the <code>handler</code> parameter on <code>PushNotificationIOS.removeEventListener</code> is unused and has been removed.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>💡 How to Migrate</strong></summary><div><div class="collapsibleContent_Fd2D"><h4 class="anchor anchorTargetStickyNavbar_tleR" id="ios">iOS<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#ios" class="hash-link" aria-label="Direct link to iOS" title="Direct link to iOS" translate="no">​</a></h4><p>Your <code>AppDelegate</code> will need to implement <code>UNUserNotificationCenterDelegate</code>. This should be done on app startup in <code>application:willFinishLaunchingWithOptions:</code> or <code>application:didFinishLaunchingWithOptions:</code> (see <a href="https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate?language=objc" target="_blank" rel="noopener noreferrer" class="">Apple Docs</a> for more details).</p><div class="language-objectivec codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objectivec codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">BOOL</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">application</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UIApplication </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">application didFinishLaunchingWithOptions</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">NSDictionary </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">launchOptions</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  UNUserNotificationCenter </span><span class="token operator" style="color:#fc929e">*</span><span class="token plain">center </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">UNUserNotificationCenter currentNotificationCenter</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  center</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">delegate </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">self</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> YES</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>Implement <code><a href="https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649518-usernotificationcenter?language=objc" target="_blank" rel="noopener noreferrer" class="">userNotificationCenter:willPresentNotification:withCompletionHandler:</a></code>, which is called when a notification arrives and the app is in the <em>foreground</em>. Use the <code>completionHandler</code> to determine if the notification will be shown to the user and notify <code>RCTPushNotificationManager</code> accordingly:</p><div class="language-objectivec codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objectivec codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">userNotificationCenter</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNUserNotificationCenter </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">center</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">       willPresentNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNNotification </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">notification</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">         withCompletionHandler</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token operator" style="color:#fc929e">^</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNNotificationPresentationOptions options</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">completionHandler</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// This will trigger 'notification' and 'localNotification' events on PushNotificationIOS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">RCTPushNotificationManager didReceiveNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// Decide if and how the notification will be shown to the user</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">completionHandler</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNNotificationPresentationOptionNone</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>To handle when a notification is tapped, implement <code><a href="https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649501-usernotificationcenter?language=objc" target="_blank" rel="noopener noreferrer" class="">userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:</a></code>. Note that if you set foreground notifications to be shown in <code>userNotificationCenter:willPresentNotification:withCompletionHandler:</code>, you should only notify <code>RCTPushNotificationManager</code> in one of these callbacks.</p><p>If the tapped notification resulted in app launch, call <code>setInitialNotification:</code>. If the notification was not previously handled by <code>userNotificationCenter:willPresentNotification:withCompletionHandler:</code>, call <code>didReceiveNotification:</code> as well:</p><div class="language-objectivec codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-objectivec codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token operator" style="color:#fc929e">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">  userNotificationCenter</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNUserNotificationCenter </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">center</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  didReceiveNotificationResponse</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">UNNotificationResponse </span><span class="token operator" style="color:#fc929e">*</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">response</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">           withCompletionHandler</span><span class="token punctuation" style="color:#657b83">:</span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token operator" style="color:#fc929e">^</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">(</span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain">completionHandler</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// This condition passes if the notification was tapped to launch the app</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">response</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">actionIdentifier isEqualToString</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">UNNotificationDefaultActionIdentifier</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// Allow the notification to be retrieved on the JS side using getInitialNotification()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">RCTPushNotificationManager setInitialNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">response</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"> </span><span class="token comment" style="color:#93a1a1">// This will trigger 'notification' and 'localNotification' events on PushNotificationIOS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">[</span><span class="token plain">RCTPushNotificationManager didReceiveNotification</span><span class="token punctuation" style="color:#657b83">:</span><span class="token plain">response</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">notification</span><span class="token punctuation" style="color:#657b83">]</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token function" style="color:#79b6f2">completionHandler</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div><p>Finally, delete the following methods and adapt the logic into the callbacks above which will be called instead:</p><ol>
<li class=""><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622930-application?language=objc" target="_blank" rel="noopener noreferrer" class="">application:didReceiveLocalNotification:</a></code> [deprecated]</li>
<li class=""><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623117-application?language=objc" target="_blank" rel="noopener noreferrer" class="">application:didReceiveRemoteNotification:</a></code> [deprecated]</li>
<li class=""><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application?language=objc" target="_blank" rel="noopener noreferrer" class="">application:didReceiveRemoteNotification:fetchCompletionHandler:</a></code> [not deprecated, but is superseded by the <code>UNUserNotificationCenterDelegate</code> methods]</li>
</ol><p>Delete any usages of <code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623022-application?language=objc" target="_blank" rel="noopener noreferrer" class="">application:didRegisterUserNotificationSettings:</a></code> and <code>RCTPushNotificationManager</code>’s corresponding <code>didRegisterUserNotificationSettings:</code> as well.</p><p><strong>Example:</strong> See the RNTester <code><a href="https://github.com/facebook/react-native/blob/main/packages/rn-tester/RNTester/AppDelegate.mm" target="_blank" rel="noopener noreferrer" class="">AppDelegate.mm</a></code>.</p><h4 class="anchor anchorTargetStickyNavbar_tleR" id="js">JS<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#js" class="hash-link" aria-label="Direct link to JS" title="Direct link to JS" translate="no">​</a></h4><ol>
<li class="">Remove any references to <code>alertAction</code>.</li>
<li class="">Remove the <code>handler</code> argument on any calls to <code>removeEventListener</code>.</li>
<li class="">Replace any usages of <code>repeatInterval</code> by firing multiple notifications using <code>fireDate</code> or <code>fireIntervalSeconds</code> instead.</li>
<li class="">Note that <code>soundName</code> will be null when it is accessed on a <code>Notification</code> returned from <code>getScheduledLocalNotifications()</code> and <code>getDeliveredNotifications()</code>.</li>
</ol></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="removal-of-flipper-react-native-plugin">Removal of Flipper React Native Plugin<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#removal-of-flipper-react-native-plugin" class="hash-link" aria-label="Direct link to Removal of Flipper React Native Plugin" title="Direct link to Removal of Flipper React Native Plugin" translate="no">​</a></h3>
<p>Use of <a href="https://fbflipper.com/" target="_blank" rel="noopener noreferrer" class="">Flipper</a> for inspecting React Native layouts, network requests, and <a href="https://fbflipper.com/docs/features/react-native/" target="_blank" rel="noopener noreferrer" class="">other React Native plugin features</a>, is now unsupported. In 0.74, we have removed the native Flipper libraries and setup code from new React Native projects. This means fewer dependencies and quicker local setup (see <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0641-decoupling-flipper-from-react-native-core.md" target="_blank" rel="noopener noreferrer" class="">original RFC</a>).</p>
<p>The diff for removing Flipper in your app can be seen in the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">Upgrade Helper</a>. If you want to preserve Flipper in an existing app, ignore the relevant diff lines.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary><strong>💡 To re-integrate Flipper</strong></summary><div><div class="collapsibleContent_Fd2D"><p>Flipper can still be used as a standalone tool for debugging an Android or iOS app, and can be manually integrated by following the Flipper docs (<a href="https://fbflipper.com/docs/getting-started/android-native/" target="_blank" rel="noopener noreferrer" class="">Android guide</a>, <a href="https://fbflipper.com/docs/getting-started/ios-native/" target="_blank" rel="noopener noreferrer" class="">iOS guide</a>).</p><p>We recommend that teams invest in switching to native debugging tooling in Android Studio and Xcode.</p></div></div></details>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_pbrs"><h4 class="anchor anchorTargetStickyNavbar_tleR" id="replacing-flipper">Replacing Flipper<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#replacing-flipper" class="hash-link" aria-label="Direct link to Replacing Flipper" title="Direct link to Replacing Flipper" translate="no">​</a></h4><p>There are a number of dedicated debugging tools which replace Flipper features. For more information, we recommend reading the excellent <a href="https://shift.infinite.red/why-you-dont-need-flipper-in-your-react-native-app-and-how-to-get-by-without-it-3af461955109" target="_blank" rel="noopener noreferrer" class=""><em>Why you don't need Flipper in your React Native app</em></a> article by Jamon Holmgren.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="javascript-debugging">JavaScript debugging<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#javascript-debugging" class="hash-link" aria-label="Direct link to JavaScript debugging" title="Direct link to JavaScript debugging" translate="no">​</a></h4>
<p>Using the <a href="https://reactnative.dev/docs/debugging?js-debugger=hermes#opening-the-debugger" target="_blank" rel="noopener noreferrer" class="">Hermes Debugger</a> remains our recommended debugging option for 0.74. You can also try the <a href="https://reactnative.dev/docs/debugging?js-debugger=new-debugger#opening-the-debugger" target="_blank" rel="noopener noreferrer" class="">Experimental New Debugger</a>, which is also the default in Expo. This continues to be an early preview —&nbsp;known issues and updates can be followed <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/733" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<p><strong>General</strong></p>
<ul>
<li class="">Make <code>start</code>/<code>end</code> in styles always refer to writing direction (<a href="https://github.com/facebook/react-native/pull/42251" target="_blank" rel="noopener noreferrer" class="">#42251</a>).</li>
</ul>
<p><strong>Android</strong></p>
<ul>
<li class="">Remove of <code>JSIModule*</code> from <code>FabricUIManagerProvider</code> (<a href="https://github.com/facebook/react-native/pull/42059" target="_blank" rel="noopener noreferrer" class="">#42059</a>).<!-- -->
<ul>
<li class="">This API was unused in open source — use <a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/turbo-modules.md" target="_blank" rel="noopener noreferrer" class="">TurboModules</a> instead.</li>
</ul>
</li>
<li class="">Deprecate <code>UIManagerModule.showPopupMenu</code> and <code>UIManagerModule.dismissPopupMenu</code> (<a href="https://github.com/facebook/react-native/pull/42441" target="_blank" rel="noopener noreferrer" class="">#42441</a>)<!-- -->
<ul>
<li class="">This API has been moved to the <a href="https://www.npmjs.com/package/@react-native/popup-menu-android" target="_blank" rel="noopener noreferrer" class=""><code>@react-native/popup-menu-android</code></a> npm package and will be removed in 0.75.</li>
</ul>
</li>
</ul>
<p><strong>iOS</strong></p>
<ul>
<li class="">Delete <code>configFilename</code> and <code>configKey</code> arguments from iOS codegen CLI (<a href="https://github.com/facebook/react-native/pull/41533" target="_blank" rel="noopener noreferrer" class="">#41533</a>).</li>
<li class="">Change how <a href="https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29" target="_blank" rel="noopener noreferrer" class=""><code>bundleURL</code></a> is handled (<a href="https://github.com/facebook/react-native/pull/43994" target="_blank" rel="noopener noreferrer" class="">#43994</a>).<!-- -->
<ul>
<li class="">Before, <code>bundleURL</code> was set when React Native was started in an instance variable and it was not possible to update it.</li>
<li class="">Now, <a href="https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29" target="_blank" rel="noopener noreferrer" class=""><code>bundleUrl</code> is a function</a> which is re-evaluated when needed, enabling the use of a different URL across refreshes.</li>
<li class="">This change will affect your app only if you were changing the <code>bundleURL</code> variable after the app is started. In this case, move the logic that updates the variable to the <a href="https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29" target="_blank" rel="noopener noreferrer" class=""><code>bundleURL</code> function</a> in <code>AppDelegate</code>.</li>
</ul>
</li>
</ul>
<p>Please see the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">full changelog</a> for a complete list of breaking changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="known-issues">Known Issues<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#known-issues" class="hash-link" aria-label="Direct link to Known Issues" title="Direct link to Known Issues" translate="no">​</a></h2>
<p><strong>iOS</strong></p>
<ul>
<li class="">Edge case when using multiple windows: When the main window is inactive and the system tries to present a dialog, the dialog is not presented in the right position on the screen. A fix is incoming in <a href="https://github.com/facebook/react-native/pull/44167" target="_blank" rel="noopener noreferrer" class="">#44167</a> and will ship in 0.74.1.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.74 contains over <a href="https://github.com/facebook/react-native/compare/v0.73.6...v0.74.0" target="_blank" rel="noopener noreferrer" class="">1673 commits</a> from 57 contributors. Thanks for all your hard work!</p>
<p>Thanks to all the additional authors that worked on documenting features in this release post:</p>
<ul>
<li class=""><a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer" class="">Nick Gerleman</a> for <em>Yoga 3.0</em></li>
<li class=""><a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer" class="">Joe Vilches</a> for <em>Yoga 3.0</em></li>
<li class=""><a href="https://twitter.com/CipolleschiR" target="_blank" rel="noopener noreferrer" class="">Riccardo Cipolleschi</a> for <em>New Architecture: Bridgeless by Default</em></li>
<li class=""><a href="https://twitter.com/SamuelSusla" target="_blank" rel="noopener noreferrer" class="">Samuel Susla</a> for <em>New Architecture: Batched <code>onLayout</code> updates</em></li>
<li class=""><a href="https://twitter.com/yungsters" target="_blank" rel="noopener noreferrer" class="">Tim Yung</a> for <em>Removal of Deprecated <code>PropTypes</code></em></li>
<li class=""><a href="https://github.com/ingridwang" target="_blank" rel="noopener noreferrer" class="">Ingrid Wang</a> for <em>API Changes to PushNotificationIOS (Deprecated)</em></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-074">Upgrade to 0.74<a href="https://reactnative.dev/blog/2024/04/22/release-0.74#upgrade-to-074" class="hash-link" aria-label="Direct link to Upgrade to 0.74" title="Direct link to Upgrade to 0.74" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a class="" href="https://reactnative.dev/docs/upgrading">Upgrading docs</a>.</p>
<p>To create a new project:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">npx react-native@latest init MyProject</span><br></span></code></pre></div></div>
<p>If you use Expo, React Native 0.74 will be supported in Expo SDK 51.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.74 is now the latest stable version of React Native and <strong>0.71.x moves to unsupported</strong>. For more information see <a href="https://github.com/reactwg/react-native-releases#releases-support-policy" target="_blank" rel="noopener noreferrer" class="">React Native's support policy</a>. We aim to publish a final end-of-life update of 0.71 at the beginning of May.</p></div></div>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
            <category>yoga</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.73 - Debugging Improvements, Stable Symlink Support, and more]]></title>
            <link>https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks</link>
            <guid>https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks</guid>
            <pubDate>Wed, 06 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're releasing React Native 0.73! This release adds improvements to debugging with Hermes, stable symlink support, Android 14 support, and new experimental features. We are also deprecating legacy debugging features, and are releasing the next pillar of the New Architecture: Bridgeless Mode!]]></description>
            <content:encoded><![CDATA[<p>Today we're releasing React Native 0.73! This release adds improvements to debugging with Hermes, stable symlink support, Android 14 support, and new experimental features. We are also deprecating legacy debugging features, and are releasing the next pillar of the New Architecture: Bridgeless Mode!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#debugging-improvements">Debugging Improvements</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#stable-symlink-support-in-metro">Stable Symlink Support in Metro</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#kotlin-template-on-android">Kotlin Template on Android</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#android-14-support">Android 14 Support</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#new-architecture-updates">New Architecture Updates</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#deprecated-debugging-features">Deprecated Debugging Features</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#babel-package-renames">Babel Package Renames</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#other-breaking-changes">Other Breaking Changes</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#react-native-cli-changes">React Native CLI Changes</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#deprecated-typesreact-native">Deprecated @types/react-native</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="debugging-improvements">Debugging Improvements<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#debugging-improvements" class="hash-link" aria-label="Direct link to Debugging Improvements" title="Direct link to Debugging Improvements" translate="no">​</a></h3>
<p>The React Native and Hermes teams are committed to improving the debugging experience in React Native. In 0.73, we're happy to share some initial progress out of this ongoing investment.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="console-log-history-in-hermes">Console Log History in Hermes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#console-log-history-in-hermes" class="hash-link" aria-label="Direct link to Console Log History in Hermes" title="Direct link to Console Log History in Hermes" translate="no">​</a></h4>
<p><code>console.log()</code> is an ever popular way for developers to quickly debug their JavaScript code. In previous releases, console logs in React Native apps would not be recorded until a debugger was connected. This made it hard to observe logs that occur early during app load.</p>
<p>In React Native 0.73 we've addressed this issue. Hermes now captures all <code>console.log()</code> calls in the background, which will be sent to the Console tab when a debugger is first connected — matching the debugging experience in web browsers. This new behaviour works across Flipper, Chrome DevTools connected to Hermes, and the experimental New Debugger.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="updated-debugging-docs">Updated Debugging Docs<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#updated-debugging-docs" class="hash-link" aria-label="Direct link to Updated Debugging Docs" title="Direct link to Updated Debugging Docs" translate="no">​</a></h4>
<p>We've refreshed the <a class="" href="https://reactnative.dev/docs/debugging">Debugging</a> section of our docs, which now includes up-to-date information on how to connect all supported debuggers, more info on React DevTools, and refreshed visuals.</p>
<p><img decoding="async" loading="lazy" alt="Overview of the Debugging docs as of 0.73" src="https://reactnative.dev/assets/images/0.73-debugging-docs-b1aed77a7676fb519118e13ce67677f7.jpg" width="1600" height="700" class="img_SS3x"></p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-new-debugger">Experimental New Debugger<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#experimental-new-debugger" class="hash-link" aria-label="Direct link to Experimental New Debugger" title="Direct link to Experimental New Debugger" translate="no">​</a></h4>
<p>The React Native team is working on a new JavaScript debugger experience, intended to replace Flipper, with a Technical Preview available as of React Native 0.73. The new debugger opens immediately, and features a stripped-back Chrome DevTools UI customized for debugging React Native with Hermes.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>The new debugger is <strong>experimental</strong> and has some <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/733" target="_blank" rel="noopener noreferrer" class="">known issues</a> we are actively working to solve in a future release of React Native. If you are trying it out, please use the <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/733" target="_blank" rel="noopener noreferrer" class="">same discussion thread</a> to report feedback.</p></div></div>
<p><img decoding="async" loading="lazy" alt="The new debugger frontend opened to the &amp;quot;Welcome&amp;quot; pane" src="https://reactnative.dev/assets/images/debugging-debugger-welcome-f17b086109690d6ae376ca5096cc55f4.jpg" width="1600" height="740" class="img_SS3x"></p>
<p>Learn more about enabling this experience <a class="" href="https://reactnative.dev/docs/next/debugging?js-debugger=new-debugger#opening-the-debugger">in the docs</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="stable-symlink-support-in-metro">Stable Symlink Support in Metro<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#stable-symlink-support-in-metro" class="hash-link" aria-label="Direct link to Stable Symlink Support in Metro" title="Direct link to Stable Symlink Support in Metro" translate="no">​</a></h3>
<p>Support for resolving symlinks in Metro is now <strong>enabled by default</strong>. Symlink support enables React Native to work with monorepo setups when containing directories are configured with <a href="https://metrobundler.dev/docs/configuration/#watchfolders" target="_blank" rel="noopener noreferrer" class=""><code>watchFolders</code></a>.</p>
<p>Symlinks are deeply represented in Metro's internals, meaning they work with features such as <a class="" href="https://reactnative.dev/docs/fast-refresh">Fast Refresh</a>, and incur little performance overhead during bundling. Symlinks are supported on all desktop platforms, with and without Watchman.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><h4 class="anchor anchorTargetStickyNavbar_tleR" id="monorepo-workarounds">Monorepo workarounds<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#monorepo-workarounds" class="hash-link" aria-label="Direct link to Monorepo workarounds" title="Direct link to Monorepo workarounds" translate="no">​</a></h4><p>We are aware there are still edge cases when using React Native in a monorepo layout. We have planned work to address some of these, which didn't quite make it into 0.73 —&nbsp;but which we aim to ship as soon as possible.</p><p><strong>For React Native template projects (<code>npx react-native init</code>)</strong>, you will need to configure any <a href="https://metrobundler.dev/docs/configuration/#watchfolders" target="_blank" rel="noopener noreferrer" class=""><code>watchFolders</code></a> outside of the project root in order for Metro to discover them (<a href="https://metrobundler.dev/docs/configuration/#unstable_enablesymlinks-experimental" target="_blank" rel="noopener noreferrer" class="">more info</a>). You may also need to update file paths if your <code>react-native</code> dependency is installed to a folder at a different level.</p><p><strong>For Expo apps</strong>, support for Yarn (Classic) workspaces is configured out of the box. See also the <a href="https://docs.expo.dev/guides/monorepos/" target="_blank" rel="noopener noreferrer" class="">Work with monorepos</a> guide in the Expo docs.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="kotlin-template-on-android">Kotlin Template on Android<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#kotlin-template-on-android" class="hash-link" aria-label="Direct link to Kotlin Template on Android" title="Direct link to Kotlin Template on Android" translate="no">​</a></h3>
<p>We're excited to announce that, starting from 0.73, Kotlin is now the <strong>recommended language</strong> for Android apps built with React Native. This follows the direction that the Android ecosystem has been moving in for several years and allows you to write your app using a modern language.</p>
<p>We've updated React Native's template on Android to use Kotlin instead of Java. The new <code>MainActivity.kt</code> and <code>MainApplication.kt</code> files are 36% smaller in size.</p>
<p>The <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">Upgrade Helper</a> has also been updated to make it easier to migrate your <code>.java</code> files to <code>.kt</code> files.
If you've previously modified the Java files in your project and you need support migrating them to Kotlin, you can use the <code>Code &gt; Convert Java file to Kotlin File</code> utility of Android Studio (also accessible with the shortcut <kbd>Cmd ⌘</kbd> + <kbd>Shift ⇧</kbd> + <kbd>Option ⌥</kbd> + <kbd>K</kbd>).</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="android-14-support">Android 14 Support<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#android-14-support" class="hash-link" aria-label="Direct link to Android 14 Support" title="Direct link to Android 14 Support" translate="no">​</a></h3>
<p>We've updated React Native to fully support Android 14. Starting from 0.73, React Native developers can now target the latest Android SDK version, <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element?hl=en#ApiLevels" target="_blank" rel="noopener noreferrer" class="">API Level 34</a> (<em>Upside Down Cake</em>).</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="java-17-and-android-gradle-plugin-upgrade">Java 17 and Android Gradle Plugin upgrade<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#java-17-and-android-gradle-plugin-upgrade" class="hash-link" aria-label="Direct link to Java 17 and Android Gradle Plugin upgrade" title="Direct link to Java 17 and Android Gradle Plugin upgrade" translate="no">​</a></h4>
<p>In order to support Android 14, we've updated the version of Android Gradle Plugin (AGP) used to build Android apps from <code>7.4.x</code> to <code>8.1.x</code>.</p>
<p>This major version bump of AGP comes with a series of breaking changes that are available in the release notes from Google (<a href="https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes" target="_blank" rel="noopener noreferrer" class="">8.0.0</a> and <a href="https://developer.android.com/build/releases/past-releases/agp-8-1-0-release-notes" target="_blank" rel="noopener noreferrer" class="">8.1.0</a>).</p>
<p>Most importantly, <strong>Java 17</strong> is now a requirement to build Android apps. You can update your Java version to 17 by running:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">brew </span><span class="token function" style="color:#79b6f2">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#cb4b16">--cask</span><span class="token plain"> zulu@17</span><br></span></code></pre></div></div>
<p>and by updating your <code>JAVA_HOME</code> as documented in the <a href="https://reactnative.dev/docs/environment-setup" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a>.</p>
<p>If you're a library developer, your libraries should work with React Native 0.73 without changes. Earlier this year, <a href="https://github.com/react-native-community/discussions-and-proposals/issues/671" target="_blank" rel="noopener noreferrer" class="">we published a note</a> with a clarification on what the AGP bump means for you as a library author.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="grant-partial-access-to-photos-and-videos">Grant partial access to photos and videos<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#grant-partial-access-to-photos-and-videos" class="hash-link" aria-label="Direct link to Grant partial access to photos and videos" title="Direct link to Grant partial access to photos and videos" translate="no">​</a></h4>
<p><a href="https://developer.android.com/about/versions/14/changes/partial-photo-video-access" target="_blank" rel="noopener noreferrer" class="">Selected Photos Access</a> allows Android 14 users to grant apps access to specific items in their media library, rather than access to all media. In 0.73, React Native apps now support this capability, by using the <code>READ_MEDIA_VISUAL_USER_SELECTED</code> permission in the <a class="" href="https://reactnative.dev/docs/permissionsandroid"><code>PermissionsAndroid</code></a> API.</p>
<p><img decoding="async" loading="lazy" alt="Selected Photos Access in Android 14" src="https://reactnative.dev/assets/images/0.73-android-media-picker-e5f99ca2d5d41618686d78e49343621c.jpg" width="1600" height="900" class="img_SS3x"></p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="min-sdk-bump">Min SDK bump<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#min-sdk-bump" class="hash-link" aria-label="Direct link to Min SDK bump" title="Direct link to Min SDK bump" translate="no">​</a></h4>
<p>React Native 0.73 will be the final version which supports Android 5.0 (API Level 21). The next version of React Native will have a minimum SDK version of 23 (Android 6.0). Read more about the upcoming changes to min SDK bump <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/740" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-architecture-updates">New Architecture Updates<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#new-architecture-updates" class="hash-link" aria-label="Direct link to New Architecture Updates" title="Direct link to New Architecture Updates" translate="no">​</a></h3>
<p>We continue the rollout of React Native's New Architecture, to make it available to everyone in the Open Source community.</p>
<p>Since React Native 0.68, both the New Renderer (Fabric) and the New Native Module System (TurboModules) were available to users to experiment and evaluate. We want to thank the community for the feedback we've received so far.</p>
<p>Today we're releasing another piece of the New Architecture: <a href="https://github.com/reactwg/react-native-new-architecture/discussions/154" target="_blank" rel="noopener noreferrer" class=""><strong>Bridgeless Mode</strong></a>. Up until now, when you enable the New Architecture in your app, the Bridge would still be available to support backward compatibility with older components and modules. However, our vision is to fully sunset the bridge. Starting from React Native 0.73, you can enable Bridgeless Mode which will disable the creation of the bridge entirely.</p>
<p>Together with Bridgeless Mode, we're shipping a Native Module Interop Layer, that will allow you to reuse your old modules when in Bridgeless Mode. The <a href="https://github.com/reactwg/react-native-new-architecture/discussions/135" target="_blank" rel="noopener noreferrer" class="">Renderer Interop Layer</a> introduced in React Native 0.72 has also been adapted to work with Bridgeless Mode.</p>
<p>As with the rest of the New Architecture, Bridgeless Mode is initially experimental. We invite interested users to enable it and report any problems and incompatibilities you face in the <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer" class="">New Architecture working group</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="deprecated-debugging-features">Deprecated Debugging Features<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#deprecated-debugging-features" class="hash-link" aria-label="Direct link to Deprecated Debugging Features" title="Direct link to Deprecated Debugging Features" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="flipper--react-native-integration">Flipper ↔ React Native integration<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#flipper--react-native-integration" class="hash-link" aria-label="Direct link to Flipper ↔ React Native integration" title="Direct link to Flipper ↔ React Native integration" translate="no">​</a></h4>
<p>We are gradually moving away from Flipper as the default tool for debugging React Native apps. In 0.73, this begins by deprecating the native Flipper integration included with React Native (bootstrap code which wires up Flipper's core plugins). We will be removing this integration and dependency in the next release —&nbsp;meaning parts of Flipper such as the Network plugin will cease to work.</p>
<p><strong>Unchanged</strong>: Flipper as a standalone product for native app debugging will continue to exist. Even after its removal from new React Native projects in the future, developers will be able to <a href="https://fbflipper.com/docs/getting-started/android-native/" target="_blank" rel="noopener noreferrer" class="">manually add Flipper to their app</a> if they wish.</p>
<p>For more information on why we are moving away from Flipper, <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0641-decoupling-flipper-from-react-native-core.md" target="_blank" rel="noopener noreferrer" class="">view the RFC</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="remote-javascript-debugging">Remote JavaScript Debugging<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#remote-javascript-debugging" class="hash-link" aria-label="Direct link to Remote JavaScript Debugging" title="Direct link to Remote JavaScript Debugging" translate="no">​</a></h4>
<p>Remote JavaScript Debugging is a legacy debugging mode that connects an external web browser (Chrome) to your app and runs your JavaScript code inside a web page, i.e. <code>http://localhost:8081/debugger-ui</code>. This model could lead to inconsistent app behaviour while debugging, and is incompatible with native modules under the New Architecture.</p>
<p>In 0.73, <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/734" target="_blank" rel="noopener noreferrer" class="">Remote JavaScript Debugging is deprecated</a> and has been removed from the Dev Menu. Enabling the remote debugger must now be done manually via the <code>NativeDevSettings</code> API. Doing this is covered in the <a class="" href="https://reactnative.dev/docs/next/other-debugging-methods#remote-js-debugging">Other Debugging Methods docs</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Remote JavaScript Debugging was previously the default debugging experience for apps using JavaScriptCore (JSC). We recommend <a class="" href="https://reactnative.dev/docs/next/other-debugging-methods#safari-developer-tools-direct-jsc-debugging">Safari Developer Tools (direct JSC debugging)</a> instead, for iOS apps.</p><p>We recommend using <a class="" href="https://reactnative.dev/docs/hermes">Hermes</a> for a consistent debugging experience on all platforms.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking Changes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="babel-package-renames">Babel Package Renames<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#babel-package-renames" class="hash-link" aria-label="Direct link to Babel Package Renames" title="Direct link to Babel Package Renames" translate="no">​</a></h3>
<p>We've relocated two Babel-related packages out of Metro and into React Native's repository and versioning scheme, enabling us to simplify maintenance and upgrades. The new versions of these packages support New Architecture features in 0.73, meaning these dependencies must be updated.</p>
<p>Please follow the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">Upgrade Helper</a> when upgrading, to ensure you have updated these dependencies. Some packages have been renamed:</p>
<div class="table-wrapper"><table><thead><tr><th>Old Package Name</th><th>New Package Name</th></tr></thead><tbody><tr><td><code>metro-react-native-babel-preset</code></td><td><code>@react-native/babel-preset</code></td></tr><tr><td><code>metro-react-native-babel-transformer</code></td><td><code>@react-native/metro-babel-transformer</code></td></tr></tbody></table></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p><code>@react-native/babel-preset</code> now includes <code>@react-native/babel-plugin-codegen</code>, this no longer needs to be specified separately in your Babel config file.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-breaking-changes">Other Breaking Changes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#other-breaking-changes" class="hash-link" aria-label="Direct link to Other Breaking Changes" title="Direct link to Other Breaking Changes" translate="no">​</a></h3>
<p>These are some of the key breaking changes in 0.73. Please consult the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">full changelog</a> for the complete list of breaking changes.</p>
<ul>
<li class="">Raise minimum Node.js requirement to 18.x (<a href="https://github.com/facebook/react-native/pull/37709" target="_blank" rel="noopener noreferrer" class="">#37709</a>) (see also <a href="https://nodejs.org/en/blog/announcements/nodejs16-eol" target="_blank" rel="noopener noreferrer" class="">Node.js 16 EOL</a>).</li>
<li class="">The template now uses TypeScript 5.0 (<a href="https://github.com/facebook/react-native/pull/36862" target="_blank" rel="noopener noreferrer" class="">#36862</a>).<!-- -->
<ul>
<li class="">React Native types continue working on TypeScript 4.8.</li>
</ul>
</li>
<li class=""><strong>Android</strong>: Java 17 is now a requirement to build Android apps (<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#java-17-and-android-gradle-plugin-upgrade" class="">see above</a>).</li>
<li class=""><strong>Android</strong>: Major bump of Fresco to 3.0 (<a href="https://github.com/facebook/react-native/pull/38275" target="_blank" rel="noopener noreferrer" class="">#38275</a>).</li>
<li class=""><strong>iOS</strong>: Raise minimum iOS version to 13.4 (<a href="https://github.com/facebook/react-native/pull/36795" target="_blank" rel="noopener noreferrer" class="">#36795</a>).</li>
<li class=""><strong>iOS</strong>: Metro will no longer be automatically started when running builds via Xcode (<a href="https://github.com/facebook/react-native/pull/38242" target="_blank" rel="noopener noreferrer" class="">#38242</a>).</li>
</ul>
<p>For library authors:</p>
<ul>
<li class=""><strong>Android</strong>: Bump to AGP 8.1.1 (<a href="https://github.com/react-native-community/discussions-and-proposals/issues/671" target="_blank" rel="noopener noreferrer" class="">discussion</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="react-native-cli-changes">React Native CLI Changes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#react-native-cli-changes" class="hash-link" aria-label="Direct link to React Native CLI Changes" title="Direct link to React Native CLI Changes" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="highlighted-breaking-changes">Highlighted breaking changes<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#highlighted-breaking-changes" class="hash-link" aria-label="Direct link to Highlighted breaking changes" title="Direct link to Highlighted breaking changes" translate="no">​</a></h4>
<ul>
<li class="">Change default task prefix in <code>build-android</code> command. From now on, when you run <code>build-android</code>, the <code>bundle</code> task will be run instead of <code>assemble</code> (<a href="https://github.com/react-native-community/cli/pull/1913" target="_blank" rel="noopener noreferrer" class="">#1913</a>).</li>
<li class="">Remove fallback flow for Metro config defaults (<a href="https://github.com/react-native-community/cli/pull/1972" target="_blank" rel="noopener noreferrer" class="">#1972</a>).<!-- -->
<ul>
<li class="">The <a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#new-metroconfigjs-setup">updated <code>metro.config.js</code> format</a> from 0.72 is now required in 0.73, as we have removed the fallback copy of these defaults from CLI.</li>
</ul>
</li>
<li class="">Remove <code>--configuration</code> option from <code>run-ios</code> (replaced with <code>--mode</code>) (<a href="https://github.com/react-native-community/cli/pull/2028" target="_blank" rel="noopener noreferrer" class="">#2028</a>).</li>
<li class="">Remove <code>--variant</code> option from <code>build-android</code> command (replaced with <code>--mode</code>) (<a href="https://github.com/react-native-community/cli/pull/2026" target="_blank" rel="noopener noreferrer" class="">#2026</a>).</li>
</ul>
<p><a href="https://github.com/react-native-community/cli/releases/tag/v12.0.0" target="_blank" rel="noopener noreferrer" class="">See full changelog for v12.0.0</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="deprecated-typesreact-native">Deprecated <code>@types/react-native</code><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#deprecated-typesreact-native" class="hash-link" aria-label="Direct link to deprecated-typesreact-native" title="Direct link to deprecated-typesreact-native" translate="no">​</a></h3>
<p>As mentioned in <a class="" href="https://reactnative.dev/blog/2023/01/03/typescript-first#declarations-shipped-with-react-native">First-class Support for TypeScript</a>, we have shipped TypeScript types with <code>react-native</code> since 0.71 and we are now deprecating <code>@types/react-native</code> for 0.73.</p>
<p>We will not ship any future patches for existing versions. The guidance is to migrate away from <code>@types/react-native</code>. See instructions on <a class="" href="https://reactnative.dev/blog/2023/01/03/typescript-first#how-to-migrate">how to migrate</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>React Native 0.73 contains over <a href="https://github.com/facebook/react-native/compare/v0.72.7...v0.73.0" target="_blank" rel="noopener noreferrer" class="">2259 commits</a> from 68 contributors. Thanks for all your hard work!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-073">Upgrade to 0.73<a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#upgrade-to-073" class="hash-link" aria-label="Direct link to Upgrade to 0.73" title="Direct link to Upgrade to 0.73" translate="no">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a class="" href="https://reactnative.dev/docs/upgrading">Upgrading docs</a>. You can also create a new project with <code>npx react-native@latest init MyProject</code>.</p>
<p>If you use Expo, React Native 0.73 will be supported in the Expo SDK 50 release.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.73 is now the latest stable version of React Native and <strong>0.70.x now moves to unsupported</strong>. For more information see <a href="https://github.com/reactwg/react-native-releases#releases-support-policy" target="_blank" rel="noopener noreferrer" class="">React Native’s support policy</a>.</p></div></div>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
            <category>debugging</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.72 - Symlink Support, Better Errors, and more]]></title>
            <link>https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks</link>
            <guid>https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks</guid>
            <pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we’re releasing 0.72!]]></description>
            <content:encoded><![CDATA[<p>Today we’re releasing 0.72!</p>
<p>This release adds highly requested features for Metro, better error handling, and other developer experience improvements. So much of this work was prioritized from your feedback on the <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/528" target="_blank" rel="noopener noreferrer" class="">2022 community survey</a> -- thank you to all those that participated!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="highlights">Highlights<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#new-metro-features">New Metro Features</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#developer-experience-improvements">Developer Experience Improvements</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#moving-new-architecture-updates">Moving New Architecture Updates</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking Changes<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#deprecated-component-removals">Deprecated Component Removals</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#package-renames">Package Renames</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="highlights-1">Highlights<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#highlights-1" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-metro-features">New Metro Features<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#new-metro-features" class="hash-link" aria-label="Direct link to New Metro Features" title="Direct link to New Metro Features" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="symlink-support-beta">Symlink Support (Beta)<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#symlink-support-beta" class="hash-link" aria-label="Direct link to Symlink Support (Beta)" title="Direct link to Symlink Support (Beta)" translate="no">​</a></h4>
<p>Symlink support continues to be one of the top-requested features in Metro and, in React Native 0.72, we are happy to announce beta support for it.</p>
<p>Symlink support enables React Native to work transparently with monorepo setups and pnpm, removing the need for workarounds. See <a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#enabling-beta-features">Enabling Beta Features</a> to use in your app.</p>
<p>It is currently in beta to collect feedback on developer experience given varying workflows, see more details <a href="https://twitter.com/robjhogan/status/1672293540632641554" target="_blank" rel="noopener noreferrer" class="">here</a>. We plan to default enable symlinks in 0.73.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="package-exports-support-beta">Package Exports Support (Beta)<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#package-exports-support-beta" class="hash-link" aria-label="Direct link to Package Exports Support (Beta)" title="Direct link to Package Exports Support (Beta)" translate="no">​</a></h4>
<p><a href="https://nodejs.org/api/packages.html#exports" target="_blank" rel="noopener noreferrer" class="">Package Exports</a> is the modern alternative to the package.json <code>"main"</code> field and provides new capabilities for npm packages to define their public API and target React Native.</p>
<p>By enabling Package Exports support in your Metro config, your app will be compatible with the wider JavaScript ecosystem, including via the new <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions" target="_blank" rel="noopener noreferrer" class="">"react-native" community condition</a>. See <a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#enabling-beta-features">Enabling Beta Features</a> to use in your app.</p>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_pbrs"><p>See <a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support">Package Exports Support in React Native</a> to learn more about this feature and our plans for stable rollout.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="enabling-beta-features">Enabling Beta Features<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#enabling-beta-features" class="hash-link" aria-label="Direct link to Enabling Beta Features" title="Direct link to Enabling Beta Features" translate="no">​</a></h4>
<p>To enable these features in your project, update your app’s <code>metro.config.js</code> file and set either the <code>resolver.unstable_enableSymlinks</code> or <code>resolver.unstable_enablePackageExports</code> options.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> config </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token literal-property property" style="color:#2aa198">resolver</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">unstable_enableSymlinks</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">unstable_enablePackageExports</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="new-metroconfigjs-setup">New <code>metro.config.js</code> Setup<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#new-metroconfigjs-setup" class="hash-link" aria-label="Direct link to new-metroconfigjs-setup" title="Direct link to new-metroconfigjs-setup" translate="no">​</a></h4>
<p>In React Native 0.72, we’ve changed the config loading setup for Metro in React Native CLI. Please update your project’s <code>metro.config.js</code> file to match the <a href="https://github.com/facebook/react-native/blob/76a42c292de838a0dd537935db792eaa81410b9b/packages/react-native/template/metro.config.js" target="_blank" rel="noopener noreferrer" class="">template’s version</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Please update your config file to the following <a href="https://github.com/facebook/react-native/blob/76a42c292de838a0dd537935db792eaa81410b9b/packages/react-native/template/metro.config.js" target="_blank" rel="noopener noreferrer" class="">format</a>. You can also follow the <a href="https://react-native-community.github.io/upgrade-helper/?from=0.71.8&amp;to=0.72.0" target="_blank" rel="noopener noreferrer" class="">upgrade-helper</a>.</p><p>These format changes to <code>metro.config.js</code> will become required in 0.73. For 0.72, we will log a warning if not updated.</p></div></div>
<p>This moves control over extending the base React Native Metro config into your project, and we’ve cleaned up the leftover defaults. In addition, this means that standalone Metro CLI commands, such as <code>metro get-dependencies</code>, will now work.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="developer-experience-improvements">Developer Experience Improvements<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#developer-experience-improvements" class="hash-link" aria-label="Direct link to Developer Experience Improvements" title="Direct link to Developer Experience Improvements" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="no-more-redboxes-with-invalid-style-properties">No more redboxes with invalid style properties<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#no-more-redboxes-with-invalid-style-properties" class="hash-link" aria-label="Direct link to No more redboxes with invalid style properties" title="Direct link to No more redboxes with invalid style properties" translate="no">​</a></h4>
<p>Prior to this release, providing an invalid style property in StyleSheet would result in a redbox. This is a high signal error that disrupts the developer workflow for a relatively low-risk error.</p>
<p>In 0.72, we’ve relaxed this expectation to fail silently, like providing an invalid CSS property in the browser, and have updated types such that some errors may be caught in build-time vs. run-time.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="better-error-readability-for-hermes">Better error readability for Hermes<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#better-error-readability-for-hermes" class="hash-link" aria-label="Direct link to Better error readability for Hermes" title="Direct link to Better error readability for Hermes" translate="no">​</a></h4>
<p>Hermes has added a better error message when invoking an undefined callable.</p>
<div class="language-tsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-tsx codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token keyword" style="color:#c5a5c5">var</span><span class="token plain"> x </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">undefined</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">x</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token comment" style="color:#93a1a1">// Before: undefined is not a function</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token comment" style="color:#93a1a1">// After: x is not a function (it is undefined)</span><br></span></code></pre></div></div>
<p>In addition, LogBox stack traces now filter out internal Hermes bytecode frames that are not relevant to app users.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="improved-error-output-of-the-react-native-cli">Improved error output of the React Native CLI<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#improved-error-output-of-the-react-native-cli" class="hash-link" aria-label="Direct link to Improved error output of the React Native CLI" title="Direct link to Improved error output of the React Native CLI" translate="no">​</a></h4>
<p>0.72 ships with React Native CLI v11 which includes improvements to reduce duplication, clarify wording, reduce verbose stack traces, and add deep links to relevant docs in the following commands <code>init</code>, <code>run-android</code>, and <code>run-ios</code>.</p>
<p>You can find other improvements in the <a href="https://github.com/react-native-community/cli/releases" target="_blank" rel="noopener noreferrer" class="">React Native CLI changelogs</a>.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="faster-compilation-and-json-parsing-in-hermes">Faster Compilation and JSON Parsing in Hermes<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#faster-compilation-and-json-parsing-in-hermes" class="hash-link" aria-label="Direct link to Faster Compilation and JSON Parsing in Hermes" title="Direct link to Faster Compilation and JSON Parsing in Hermes" translate="no">​</a></h4>
<p>Hermes has improved the compilation time of large object literals. For example, in one reported issue, <a href="https://github.com/facebook/hermes/issues/852" target="_blank" rel="noopener noreferrer" class="">#852</a>, a user had an entire dataset written out as a large object literal. By improving the de-duplication algorithm Hermes uses, compilation sped up by 97% (<a href="https://github.com/facebook/hermes/commit/221ce21a209e2e32a3eaaa2d9e28ca81842fad20" target="_blank" rel="noopener noreferrer" class="">221c</a>). These improvements will benefit build times for apps that bundle many objects.</p>
<p>Multiple optimizations (<a href="https://github.com/facebook/hermes/commit/de9cff2aa41fc1f297b568848143347823d73659" target="_blank" rel="noopener noreferrer" class="">de9c</a>, <a href="https://github.com/facebook/hermes/commit/6e2dd652c8d90c5d59737a81f66a259efffdcd00" target="_blank" rel="noopener noreferrer" class="">6e2d</a>) to JSON parsing have also landed, benefiting apps using libraries like redux-persist that rely heavily on JSON manipulation.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="more-ecmascript-support-in-hermes">More ECMAScript Support in Hermes<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#more-ecmascript-support-in-hermes" class="hash-link" aria-label="Direct link to More ECMAScript Support in Hermes" title="Direct link to More ECMAScript Support in Hermes" translate="no">​</a></h4>
<p>Support for the following specifications in Hermes has landed in React Native 0.72:</p>
<ul>
<li class=""><code>prototype.at</code> support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at" target="_blank" rel="noopener noreferrer" class="">Array</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/at" target="_blank" rel="noopener noreferrer" class="">TypedArray</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/at" target="_blank" rel="noopener noreferrer" class="">String</a>. See <a href="https://github.com/facebook/hermes/issues/823" target="_blank" rel="noopener noreferrer" class="">#823</a> (<a href="https://github.com/facebook/hermes/commit/ebe2915ac386a6b73dec39c2af4ac7063e68cd99" target="_blank" rel="noopener noreferrer" class="">ebe2</a>).</li>
<li class="">Implement <a href="https://github.com/tc39/proposal-well-formed-stringify" target="_blank" rel="noopener noreferrer" class="">well-formed JSON.stringify</a> (<a href="https://github.com/facebook/hermes/commit/d41decf244aa814b1e58827a9de982f3b71667de" target="_blank" rel="noopener noreferrer" class="">d41d</a>) to prevent ill-formed Unicode strings</li>
<li class="">Implement <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError" target="_blank" rel="noopener noreferrer" class="">AggregateError</a> (<a href="https://github.com/facebook/hermes/commit/9b25a2530eb515f6c4fbd397ae290b6c97c049b2" target="_blank" rel="noopener noreferrer" class="">9b25</a>) that represents several errors wrapped in a single error. Useful for multiple errors like from <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any" target="_blank" rel="noopener noreferrer" class=""><code>Promise.any()</code></a> when all promises passed to it reject.</li>
</ul>
<p>For users on JSC, these features are already available.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="moving-new-architecture-updates">Moving New Architecture Updates<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#moving-new-architecture-updates" class="hash-link" aria-label="Direct link to Moving New Architecture Updates" title="Direct link to Moving New Architecture Updates" translate="no">​</a></h3>
<p>The New Architecture is currently experimental. To keep updates focused to their target audience, we are moving New Architecture updates in 0.72, and future releases, to the dedicated <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer" class="">working group</a>. This change will also allow for more frequent updates, such as work that ships in our nightlies.</p>
<p>You can read the 0.72 updates for the New Architecture <a href="https://github.com/reactwg/react-native-new-architecture/discussions/136" target="_blank" rel="noopener noreferrer" class="">here</a>. Subscribe to the working group GitHub notifications to stay informed on our progress on the New Architecture.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes-1">Breaking Changes<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#breaking-changes-1" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="deprecated-component-removals">Deprecated Component Removals<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#deprecated-component-removals" class="hash-link" aria-label="Direct link to Deprecated Component Removals" title="Direct link to Deprecated Component Removals" translate="no">​</a></h3>
<p>The following packages have been removed from React Native in 0.72. Please migrate to the recommended community package:</p>
<ul>
<li class=""><a href="https://reactnative.dev/docs/0.72/slider" target="_blank" rel="noopener noreferrer" class="">Slider</a> is superseded by <a href="https://github.com/callstack/react-native-slider/tree/main/package" target="_blank" rel="noopener noreferrer" class="">@react-native-community/slider</a></li>
<li class=""><a href="https://reactnative.dev/docs/0.72/datepickerios" target="_blank" rel="noopener noreferrer" class="">DatePickerIOS</a> is superseded by <a href="https://github.com/react-native-datetimepicker/datetimepicker" target="_blank" rel="noopener noreferrer" class="">@react-native-community/datetimepicker</a></li>
<li class=""><a href="https://reactnative.dev/docs/0.72/progressviewios" target="_blank" rel="noopener noreferrer" class="">ProgressViewIOS</a> is superseded by <a href="https://github.com/react-native-progress-view/progress-view" target="_blank" rel="noopener noreferrer" class="">@react-native-community/progress-view</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="package-renames">Package Renames<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#package-renames" class="hash-link" aria-label="Direct link to Package Renames" title="Direct link to Package Renames" translate="no">​</a></h3>
<p>All packages published from the <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer" class=""><code>react-native</code></a> core repository now live under <code>react-native/packages</code>, and are published under the <a href="https://www.npmjs.com/search?q=%40react-native" target="_blank" rel="noopener noreferrer" class="">@react-native npm scope</a> to ensure clear ownership.</p>
<p>There are no changes to the <a href="https://www.npmjs.com/package/react-native" target="_blank" rel="noopener noreferrer" class="">react-native</a> package.</p>
<div class="table-wrapper"><table><thead><tr><th>Old Package Name</th><th>New Package Name</th></tr></thead><tbody><tr><td><code>@react-native-community/eslint-config</code></td><td><code>@react-native/eslint-config</code></td></tr><tr><td><code>@react-native-community/eslint-plugin</code></td><td><code>@react-native/eslint-plugin</code></td></tr><tr><td><code>@react-native/polyfills</code></td><td><code>@react-native/js-polyfills</code></td></tr><tr><td><code>@react-native/normalize-color</code></td><td><code>@react-native/normalize-colors</code></td></tr><tr><td><code>@react-native/assets</code></td><td><code>@react-native/assets-registry</code></td></tr><tr><td><code>react-native-codegen</code></td><td><code>@react-native/codegen</code></td></tr><tr><td><code>react-native-gradle-plugin</code></td><td><code>@react-native/gradle-plugin</code></td></tr></tbody></table></div>
<p>This change will not affect you if you have no direct dependency on a renamed package. Otherwise, when upgrading to React Native 0.72, update any renamed dependency to its ~0.72 version.</p>
<p>You can read the motivation that led to these changes <a href="https://github.com/react-native-community/discussions-and-proposals/pull/480" target="_blank" rel="noopener noreferrer" class="">in the dedicated RFC</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements" translate="no">​</a></h2>
<p>A lot of this release came from the direct feedback from the community. From reports on <a href="https://twitter.com/baconbrix/status/1623039650775371792" target="_blank" rel="noopener noreferrer" class="">noisy redboxes</a>, <a href="https://github.com/facebook/metro/issues/965" target="_blank" rel="noopener noreferrer" class="">bugs with Package Exports</a>, <a href="https://github.com/reactwg/react-native-new-architecture/discussions/85" target="_blank" rel="noopener noreferrer" class="">benchmarks for the New Architecture</a> — all of it is valuable to hear and we appreciate the time it takes to share feedback.</p>
<p>0.72 contains over <a href="https://github.com/facebook/react-native/compare/v0.71.8...v0.72.0" target="_blank" rel="noopener noreferrer" class="">1100 commits</a> from 66 contributors. Thank you for all your hard work!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="upgrade-to-072">Upgrade to 0.72<a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#upgrade-to-072" class="hash-link" aria-label="Direct link to Upgrade to 0.72" title="Direct link to Upgrade to 0.72" translate="no">​</a></h2>
<p>Check out the list of needed changes in the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer" class="">upgrade-helper</a>, or read the <a class="" href="https://reactnative.dev/docs/upgrading">upgrade documentation</a> for how to update your existing project, or create a new project with <code>npx react-native@latest init MyProject</code>.</p>
<p>If you use Expo, React Native version 0.72 will be supported in the Expo SDK 49 release.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>0.72 is now the latest stable version of React Native and 0.69.x version moves now to unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases#releases-support-policy" target="_blank" rel="noopener noreferrer" class="">React Native’s support policy</a>.</p></div></div>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Package Exports Support in React Native]]></title>
            <link>https://reactnative.dev/blog/2023/06/21/package-exports-support</link>
            <guid>https://reactnative.dev/blog/2023/06/21/package-exports-support</guid>
            <pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[With the release of React Native 0.72, Metro — our JavaScript build tool — now includes beta support for the package.json "exports" field. When enabled, it adds the following functionality:]]></description>
            <content:encoded><![CDATA[<p>With the release of <a class="" href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks">React Native 0.72</a>, Metro — our JavaScript build tool — now includes beta support for the <code>package.json</code> <a href="https://nodejs.org/docs/latest-v18.x/api/packages.html#exports" target="_blank" rel="noopener noreferrer" class=""><code>"exports"</code></a> field. When <a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support#enabling-package-exports-beta">enabled</a>, it adds the following functionality:</p>
<ul>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support#for-app-developers">React Native projects will work with more npm packages out-of-the-box</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support#for-package-maintainers-preview">New capabilities for packages to define their API and target React Native</a></li>
<li class=""><a class="" href="https://reactnative.dev/blog/2023/06/21/package-exports-support#breaking-changes">Some breaking changes to package resolution (in edge cases)</a></li>
</ul>
<p>In this post we'll cover how Package Exports works, and what these changes mean for you as a React Native app developer or package maintainer.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="what-is-package-exports">What is Package Exports?<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#what-is-package-exports" class="hash-link" aria-label="Direct link to What is Package Exports?" title="Direct link to What is Package Exports?" translate="no">​</a></h2>
<p>Introduced in Node.js 12.7.0, Package Exports is the modern approach for npm packages to specify <strong>entry points</strong> — the mapping of package subpaths which can be externally imported and which file(s) they should resolve to.</p>
<p>Supporting <code>"exports"</code> improves how React Native projects will work with the wider JavaScript ecosystem (<a href="https://github.com/search?q=path%3A%2A%2A%2Fpackage.json+%22%5C%22access%5C%22%3A+%5C%22public%5C%22%22+%22%5C%22exports%5C%22%22+NOT+path%3A%2A%2A%2Fnode_modules+NOT+is%3Afork+NOT+is%3Aarchived&amp;type=code" target="_blank" rel="noopener noreferrer" class="">used in ~16.6k packages today</a>), and gives package authors a standardised feature set for multiplatform packages to target React Native.</p>
<p><a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#exports" target="_blank" rel="noopener noreferrer" class=""><code>"exports"</code></a> can be used alongside, or instead of, <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#main" target="_blank" rel="noopener noreferrer" class=""><code>"main"</code></a> in a <code>package.json</code> file.</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"name"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"@storybook/addon-actions"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"main"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index.js"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"exports"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"."</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token property" style="color:#2aa198">"node"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index.js"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token property" style="color:#2aa198">"import"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index.mjs"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token property" style="color:#2aa198">"default"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index.js"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"./preview"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token property" style="color:#2aa198">"import"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/preview.mjs"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">      </span><span class="token property" style="color:#2aa198">"default"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/preview.js"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"./package.json"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./package.json"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<p>Here's some app code consuming the above package by importing different subpaths of <code>@storybook/addon-actions</code>.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports">action</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@storybook/addon-actions'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// -&gt; '@storybook/addon-actions/dist/index.js'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#657b83">{</span><span class="token imports">action</span><span class="token imports punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@storybook/addon-actions/preview'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// -&gt; '@storybook/addon-actions/dist/preview.js'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token keyword module" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token imports">helpers</span><span class="token plain"> </span><span class="token keyword module" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'@storybook/addon-actions/src/preset/addArgsHelpers'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token comment" style="color:#93a1a1">// Inaccessible - not listed in "exports"!</span><br></span></code></pre></div></div>
<p>The headlining features of Package Exports are:</p>
<ul>
<li class=""><strong>Package encapsulation</strong>: Only subpaths defined in <code>"exports"</code> can be imported from outside the package — giving packages control over their public API.</li>
<li class=""><strong>Subpath aliases</strong>: Packages can define custom subpaths which map to a different file location (including via <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#subpath-patterns" target="_blank" rel="noopener noreferrer" class="">subpath patterns</a>) — allowing relocation of files while preserving the public API.</li>
<li class=""><strong>Conditional exports</strong>: A subpath may resolve to a different underlying file depending on environment. For example, to target <code>"node"</code>, <code>"browser"</code>, or <code>"react-native"</code> runtimes — replacing the <a href="https://github.com/defunctzombie/package-browser-field-spec" target="_blank" rel="noopener noreferrer" class=""><code>"browser"</code> field spec</a>.</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>The full capabilities for <code>"exports"</code> are detailed in the <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#package-entry-points" target="_blank" rel="noopener noreferrer" class="">Node.js Package Entry Points spec</a>.</p><p>Since these features overlap with existing React Native concepts (such as <a class="" href="https://reactnative.dev/docs/platform-specific-code">platform-specific extensions</a>), and since <code>"exports"</code> had been live in the npm ecosystem for some time, we reached out to the React Native community to make sure our implementation would meet developers' needs (<a href="https://github.com/react-native-community/discussions-and-proposals/pull/534" target="_blank" rel="noopener noreferrer" class="">PR</a>, <a href="https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0534-metro-package-exports-support.md" target="_blank" rel="noopener noreferrer" class="">final RFC</a>).</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="for-app-developers">For app developers<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#for-app-developers" class="hash-link" aria-label="Direct link to For app developers" title="Direct link to For app developers" translate="no">​</a></h2>
<p>Package Exports can be enabled today, in beta.</p>
<ul>
<li class="">Imports against packages that depend on Package Exports features (such as <a href="https://www.npmjs.com/package/firebase" target="_blank" rel="noopener noreferrer" class=""><strong>Firebase</strong></a> and <a href="https://www.npmjs.com/search?q=%40storybook" target="_blank" rel="noopener noreferrer" class=""><strong>Storybook</strong></a>) should now work as designed.</li>
<li class="">React Native for Web projects using Metro will now be able to use the <code>"browser"</code> conditional export, removing the need for workarounds.</li>
</ul>
<p>Enabling Package Exports brings a few <a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#breaking-changes" class="">edge-case breaking changes</a> that may affect specific projects, and which you can <a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#validating-changes-in-your-project" class="">test today</a>.</p>
<p><strong>In a future React Native release, Package Exports will be enabled by default</strong>. In a chicken-and-egg situation, React Native apps were previously a holdout for some packages to migrate to <code>"exports"</code> — or used our <code>"react-native"</code> root field escape hatch. Supporting these features in Metro will allow the ecosystem to move forward.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="enabling-package-exports-beta">Enabling Package Exports (beta)<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#enabling-package-exports-beta" class="hash-link" aria-label="Direct link to Enabling Package Exports (beta)" title="Direct link to Enabling Package Exports (beta)" translate="no">​</a></h3>
<p>Package Exports can be enabled in your app's <a href="https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/template/metro.config.js" target="_blank" rel="noopener noreferrer" class=""><strong>metro.config.js</strong></a> file via the <a href="https://metrobundler.dev/docs/configuration/#unstable_enablepackageexports-experimental" target="_blank" rel="noopener noreferrer" class=""><code>resolver.unstable_enablePackageExports</code></a> option.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-js codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> config </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token comment" style="color:#93a1a1">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token literal-property property" style="color:#2aa198">resolver</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token literal-property property" style="color:#2aa198">unstable_enablePackageExports</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre></div></div>
<p>Metro exposes two further resolver options which configure how conditional exports behave:</p>
<ul>
<li class=""><a href="https://metrobundler.dev/docs/configuration/#unstable_conditionnames-experimental" target="_blank" rel="noopener noreferrer" class=""><code>unstable_conditionNames</code></a> — The set of <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions" target="_blank" rel="noopener noreferrer" class="">condition names</a> to assert when resolving conditional exports. By default, we match <code>['require', 'import', 'react-native']</code>.</li>
<li class=""><a href="https://metrobundler.dev/docs/configuration/#unstable_conditionsbyplatform-experimental" target="_blank" rel="noopener noreferrer" class=""><code>unstable_conditionsByPlatform</code></a> — The additional condition names to assert when resolving for a given platform target. By default, this matches <code>'browser'</code> when the platform is <code>'web'</code>.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_WCGJ alert alert--success"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_pbrs"><p><strong>Remember to use the React Native <a href="https://github.com/facebook/react-native/blob/main/template/jest.config.js#L2" target="_blank" rel="noopener noreferrer" class="">Jest preset</a>!</strong> Jest includes support for Package Exports by default. In tests, you can override which <code>customExportConditions</code> are resolved using the <a href="https://jestjs.io/docs/configuration#testenvironmentoptions-object" target="_blank" rel="noopener noreferrer" class=""><code>testEnvironmentOptions</code></a> option.</p><p><strong>If you are using TypeScript</strong>, resolution behaviour can be matched by setting <a href="https://www.typescriptlang.org/tsconfig#moduleResolution" target="_blank" rel="noopener noreferrer" class=""><code>moduleResolution: 'bundler'</code></a> and <a href="https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports" target="_blank" rel="noopener noreferrer" class=""><code>resolvePackageJsonImports: false</code></a> within your project's <code>tsconfig.json</code>.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="validating-changes-in-your-project">Validating changes in your project<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#validating-changes-in-your-project" class="hash-link" aria-label="Direct link to Validating changes in your project" title="Direct link to Validating changes in your project" translate="no">​</a></h4>
<p>For existing projects, we recommend that early adopters follow these steps to see if resolution changes occur after enabling <code>unstable_enablePackageExports</code>. This is a one-time process. It's likely that there will be no changes at all, but we'd like developers to opt in with certainty.</p>
<details class="details_IpIu alert alert--info details_jERq" data-collapsed="true"><summary>💡 Validating changes in your project</summary><div><div class="collapsibleContent_Fd2D"><div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>If you are not using Yarn, substitute <code>yarn</code> for <code>npx</code> (or the relevant tool used in your project).</p></div></div><ol>
<li class="">
<p>Get all resolved dependencies (before changes):</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token comment" style="color:#93a1a1"># Replace index.js with your entry file if needed, such as App.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain"></span><span class="token function" style="color:#79b6f2">yarn</span><span class="token plain"> metro get-dependencies index.js </span><span class="token parameter variable" style="color:#cb4b16">--platform</span><span class="token plain"> android </span><span class="token parameter variable" style="color:#cb4b16">--output</span><span class="token plain"> before.txt</span><br></span></code></pre></div></div>
<ul>
<li class=""><strong>Expo CLI</strong>: Run <code>npx expo customize metro.config.js</code> if your project doesn't have a <code>metro.config.js</code> file yet.</li>
<li class="">For full coverage, substitute <code>--platform android</code> for the other platforms in use by your app (e.g. <code>ios</code>, <code>web</code>).</li>
</ul>
</li>
<li class="">
<p>Enable <code>resolver.unstable_enablePackageExports</code> in <code>metro.config.js</code>.</p>
</li>
<li class="">
<p>Get all resolved dependencies (after changes):</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token function" style="color:#79b6f2">yarn</span><span class="token plain"> metro get-dependencies index.js </span><span class="token parameter variable" style="color:#cb4b16">--platform</span><span class="token plain"> android </span><span class="token parameter variable" style="color:#cb4b16">--output</span><span class="token plain"> after.txt</span><br></span></code></pre></div></div>
</li>
<li class="">
<p>Compare!</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token function" style="color:#79b6f2">diff</span><span class="token plain"> before.txt after.txt</span><br></span></code></pre></div></div>
</li>
</ol></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking changes<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h3>
<p>We decided on an implementation of Package Exports in Metro that is spec-compliant (necessitating some breaking changes), but backwards compatible otherwise (helping apps with existing imports to migrate gradually).</p>
<p>The key breaking change is that when <code>"exports"</code> is provided by a package, it will be consulted first (before any other <code>package.json</code> fields) — and a matched subpath target will be used directly.</p>
<ul>
<li class="">Metro will not expand <a href="https://metrobundler.dev/docs/configuration/#sourceexts" target="_blank" rel="noopener noreferrer" class=""><code>sourceExts</code></a> against the import specifier.</li>
<li class="">Metro will not resolve <a class="" href="https://reactnative.dev/docs/platform-specific-code">platform-specific extensions</a> against the target file.</li>
</ul>
<p>For more details, please see all <a href="https://metrobundler.dev/docs/package-exports#summary-of-breaking-changes" target="_blank" rel="noopener noreferrer" class=""><strong>breaking changes</strong></a> in the Metro docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="package-encapsulation-is-lenient">Package encapsulation is lenient<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#package-encapsulation-is-lenient" class="hash-link" aria-label="Direct link to Package encapsulation is lenient" title="Direct link to Package encapsulation is lenient" translate="no">​</a></h3>
<p>When Metro encounters a subpath that isn't listed in <code>"exports"</code>, <strong>it will fall back to legacy resolution</strong>. This is a compatibility feature intended to reduce user friction for previously allowable imports in existing React Native projects.</p>
<p>Instead of throwing an error, Metro will log a warning.</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">warn: You have imported the module </span><span class="token string" style="color:#8dc891">"foo/private/fn.js"</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">which</span><span class="token plain"> is not listed </span><span class="token keyword" style="color:#c5a5c5">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">the </span><span class="token string" style="color:#8dc891">"exports"</span><span class="token plain"> of </span><span class="token string" style="color:#8dc891">"foo"</span><span class="token builtin class-name" style="color:#fac863">.</span><span class="token plain"> Consider updating your call site or asking the package</span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">maintainer</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> to expose this API.</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>We plan to implement a strict mode for package encapsulation in future, to align with Node's default behaviour. Therefore, <strong>we recommend that all developers address these warnings</strong> if raised by users.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="for-package-maintainers-preview">For package maintainers (preview)<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#for-package-maintainers-preview" class="hash-link" aria-label="Direct link to For package maintainers (preview)" title="Direct link to For package maintainers (preview)" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Per our <a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#the-future-stable-exports-enabled-by-default" class="">rollout plan</a>, Package Exports will be enabled for most projects in the next React Native release (0.73) later this year.</p><p><strong>We have no plans to remove support for the <code>"main"</code> field and other current package resolution features any time soon.</strong></p></div></div>
<p>Package Exports provides the ability to restrict access to your package's internals, and more predictable capabilities for libraries to target React Native and React Native for Web.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="if-you-are-using-exports-today">If you are using <code>"exports"</code> today<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#if-you-are-using-exports-today" class="hash-link" aria-label="Direct link to if-you-are-using-exports-today" title="Direct link to if-you-are-using-exports-today" translate="no">​</a></h3>
<p>If your package uses <code>"exports"</code> alongside the current <code>"react-native"</code> root field, please bear in mind the <a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#breaking-changes" class="">breaking changes</a> for users above. For users enabling this feature in Metro, <code>"exports"</code> will now be considered first during module resolution.</p>
<p>In practice, we anticipate the main change for users will be the enforcement (via warnings) of any inaccessible subpaths in their apps, from respecting <code>"exports"</code> package encapsulation.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="migrating-to-exports">Migrating to <code>"exports"</code><a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#migrating-to-exports" class="hash-link" aria-label="Direct link to migrating-to-exports" title="Direct link to migrating-to-exports" translate="no">​</a></h3>
<p><strong>Adding an <code>"exports"</code> field to your package is entirely optional</strong>. Existing package resolution features will behave identically for packages which don't use <code>"exports"</code> — and we have no plans to remove this behaviour.</p>
<p>We believe that the new features of <code>"exports"</code> provide a compelling feature set for React Native package maintainers.</p>
<ul>
<li class=""><strong>Tighten your package API</strong>: This is a great time to review the module API of your package, which can now be formally defined via exported subpath aliases. This prevents users from accessing internal APIs, reducing surface area for bugs.</li>
<li class=""><strong>Conditional exports</strong>: If your package targets React Native for Web (i.e. <code>"react-native"</code> and <code>"browser"</code>), we now give packages control of the resolution order of these conditions (see next heading).</li>
</ul>
<p>If you decide to introduce <code>"exports"</code>, <strong>we recommend making this as a breaking change</strong>. We've prepared a <a href="https://metrobundler.dev/docs/package-exports#migration-guide-for-package-maintainers" target="_blank" rel="noopener noreferrer" class=""><strong>migration guide</strong></a> in the Metro docs which includes how to replace features such as platform-specific extensions.</p>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p><strong>Please do not rely on the lenient behaviours of Metro's implementation.</strong> While Metro is backwards-compatible, packages should follow how <code>"exports"</code> is documented in the spec and strictly implemented by other tools.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="the-new-react-native-condition">The new <code>"react-native"</code> condition<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#the-new-react-native-condition" class="hash-link" aria-label="Direct link to the-new-react-native-condition" title="Direct link to the-new-react-native-condition" translate="no">​</a></h3>
<p>We've introduced <code>"react-native"</code> as a community condition (for use with conditional exports). This represents React Native, the framework, sitting alongside other recognised runtimes such as <code>"node"</code> and <code>"deno"</code> (<a href="https://github.com/nodejs/node/pull/45367" target="_blank" rel="noopener noreferrer" class="">RFC</a>).</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p><a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions" target="_blank" rel="noopener noreferrer" class="">Community Conditions Definitions — <strong><code>"react-native"</code></strong></a></p><p><em>Will be matched by the React Native framework (all platforms). To target React Native for Web, "browser" should be specified before this condition.</em></p></div></div>
<p>This replaces the previous <code>"react-native"</code> root field. The priority order for how this was previously resolved was determined by projects, <a href="https://github.com/expo/router/issues/37#issuecomment-1275925758" target="_blank" rel="noopener noreferrer" class="">which created ambiguity when using React Native for Web</a>. Under <code>"exports"</code>, <em>packages concretely define the resolution order for conditional entry points</em> — removing this ambiguity.</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="color:#FFFFFF;background-color:#282C34"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token property" style="color:#2aa198">"exports"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"browser"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index-browser.js"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"react-native"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index-react-native.js"</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token property" style="color:#2aa198">"default"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./dist/index.js"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  </span><span class="token punctuation" style="color:#657b83">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>We chose not to introduce <code>"android"</code> and <code>"ios"</code> conditions, due to the prevalence of other existing platform selection methods, and the complexity of how this behaviour might work across frameworks. Please use the <a class="" href="https://reactnative.dev/docs/platform#select"><code>Platform.select()</code></a> API instead.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="the-future-stable-exports-enabled-by-default">The future: Stable <code>"exports"</code>, enabled by default<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#the-future-stable-exports-enabled-by-default" class="hash-link" aria-label="Direct link to the-future-stable-exports-enabled-by-default" title="Direct link to the-future-stable-exports-enabled-by-default" translate="no">​</a></h2>
<p>In the next React Native release, we are aiming to remove the <code>unstable_</code> prefix for this feature (having addressed planned performance work and any bugs) and will enable Package Exports resolution by default.</p>
<p>With <code>"exports"</code> enabled for everyone, we can begin taking the React Native community forward — for example, React Native's core packages could be updated to better separate public and internal modules.</p>
<p><img decoding="async" loading="lazy" alt="Rollout plan for Package Exports support" src="https://reactnative.dev/assets/images/package-exports-rollout-4d6544def64335059e0d23df72bfa98a.png" width="2364" height="722" class="img_SS3x"></p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="thanks">Thanks<a href="https://reactnative.dev/blog/2023/06/21/package-exports-support#thanks" class="hash-link" aria-label="Direct link to Thanks" title="Direct link to Thanks" translate="no">​</a></h2>
<p>Thanks to members of the React Native community that gave feedback on the RFC: <a href="https://github.com/SimenB" target="_blank" rel="noopener noreferrer" class="">@SimenB</a>, <a href="https://github.com/tido64" target="_blank" rel="noopener noreferrer" class="">@tido64</a>, <a href="https://github.com/byCedric" target="_blank" rel="noopener noreferrer" class="">@byCedric</a>, <a href="https://github.com/thymikee" target="_blank" rel="noopener noreferrer" class="">@thymikee</a>.</p>
<p>Huge thanks to <a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer" class="">@motiz88</a> and <a href="https://github.com/robhogan" target="_blank" rel="noopener noreferrer" class="">@robhogan</a> at Meta for supporting the development of this feature.</p>]]></content:encoded>
            <category>announcement</category>
            <category>metro</category>
        </item>
        <item>
            <title><![CDATA[React Native 0.71-RC0 Android outage postmortem]]></title>
            <link>https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem</link>
            <guid>https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem</guid>
            <pubDate>Fri, 27 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Now that 0.71 is available, we want to share some key information about the incident that broke Android builds for all React Native versions while releasing the first 0.71 release candidate for React Native & Expo Android builds on November 4th, 2022.]]></description>
            <content:encoded><![CDATA[<p>Now that 0.71 is <a class="" href="https://reactnative.dev/blog/2023/01/12/version-071">available</a>, we want to share some key information about the incident that broke Android builds for all React Native versions while releasing the first 0.71 release candidate for React Native &amp; Expo Android builds on November 4th, 2022.</p>
<p>The contributors who helped tackle the incident recently attended a post-mortem meeting to discuss in detail what happened, what we all learned from it, and what actions we are going to take to avoid similar outages in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="what-happened">What happened<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#what-happened" class="hash-link" aria-label="Direct link to What happened" title="Direct link to What happened" translate="no">​</a></h2>
<p>On November 4th 2022, we published the version <code>0.71.0-rc0</code> of React Native, the first release candidate for 0.71, on several public repositories.</p>
<p>A major change made in this release candidate helped to improve build times by publishing artifacts to Maven Central, instead of building them from source. More details on how this was done are available in <a href="https://github.com/react-native-community/discussions-and-proposals/pull/508" target="_blank" rel="noopener noreferrer" class="">RFC#508</a> and <a href="https://github.com/reactwg/react-native-new-architecture/discussions/105" target="_blank" rel="noopener noreferrer" class="">related discussions</a>.</p>
<p>Unfortunately, because of the way we scaffolded new projects from the template, this caused build failures for any Android user on older versions because they would start downloading new artifacts for <code>0.71.0-rc0</code> instead of the version they were using in their project (like <code>0.68.0</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="why-this-happened">Why this happened<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#why-this-happened" class="hash-link" aria-label="Direct link to Why this happened" title="Direct link to Why this happened" translate="no">​</a></h2>
<p>The React Native template provides a <code>build.gradle</code> file to build Android apps. This file contains a dependency on the React Native Android library as follows:
<code>implementation("com.facebook.react:react-native:+")</code>.</p>
<p>Importantly, the <code>+</code> part of this dependency (a <a href="https://docs.gradle.org/current/userguide/dynamic_versions.html" target="_blank" rel="noopener noreferrer" class="">Gradle Dynamic version</a>) tells Gradle to pick the highest available version of React Native. Using Gradle Dynamic versions is considered an antipattern as it exposes users to less-reproducible builds.</p>
<p>We were aware of the issues dynamic versions could cause, so in <code>0.71</code> we cleaned up the new app template and removed all the <code>+</code> dependencies. However, users on older versions of React Native were still using a <code>+</code> version.</p>
<p>This caused builds with React Native versions before <code>0.71.0-rc.0</code> to query all the repositories for the highest available versions of the React Native. Because the newly pushed 0.71.0-rc.0 on Maven Central became the highest version available, builds with React Native versions before 0.71.0-rc.0 started using artifacts from 0.71.0-rc.0. The React Native version mismatch between the local build (e.g <code>0.68.0</code>) and artifacts from Maven Central (<code>0.71.0-rc.0</code>) caused these builds to fail.</p>
<p>Further technical details on this event area are also available <a href="https://github.com/facebook/react-native/issues/35210" target="_blank" rel="noopener noreferrer" class="">on this GitHub issue</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-we-mitigated--resolved">How we mitigated &amp; resolved<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#how-we-mitigated--resolved" class="hash-link" aria-label="Direct link to How we mitigated &amp; resolved" title="Direct link to How we mitigated &amp; resolved" translate="no">​</a></h2>
<p>As soon as we identified the issue on November 4th, the community found and shared a manual workaround to fix the issue which would pin React Native to a specific, correcting the mistake.</p>
<p>Then, over the weekend of November 5th and 6th, the release crew shipped patch releases for all previous React Native versions down to 0.63 which automatically applied the patch, so that users could update to a fixed version of React Native.</p>
<p>At the same time, we <a href="https://issues.sonatype.org/browse/OSSRH-86006" target="_blank" rel="noopener noreferrer" class="">reached out to Sonatype</a> to ask for the removal of the offending artifacts.</p>
<p>The issue was fully resolved on November 8th when the artifacts were fully removed from Maven Central.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="timeline-of-events">Timeline of events<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#timeline-of-events" class="hash-link" aria-label="Direct link to Timeline of events" title="Direct link to Timeline of events" translate="no">​</a></h2>
<p><em>This section contains a brief timeline of the events. All times are GMT/UTC +0</em></p>
<ul>
<li class="">Nov 4th - 5:06 PM: <a href="https://github.com/facebook/react-native/releases/tag/v0.71.0-rc.0" target="_blank" rel="noopener noreferrer" class="">0.71-RC0 is released</a>.</li>
<li class="">Nov 4th - 6:20 PM: <a href="https://github.com/facebook/react-native/issues/35204" target="_blank" rel="noopener noreferrer" class="">First report of build issue is opened</a>.</li>
<li class="">Nov 4th - 7:45 PM: <a href="https://github.com/facebook/react-native/issues/35204#issuecomment-1304090948" target="_blank" rel="noopener noreferrer" class="">Issue is identified by community</a>.</li>
<li class="">Nov 4th - 9:39 PM: <a href="https://github.com/facebook/react-native/issues/35204#issuecomment-1304281740" target="_blank" rel="noopener noreferrer" class="">Workarounds are communicated, Expo </a>deploys fix to all their users.</li>
<li class="">Nov 5th - 03:04 AM: <a href="https://github.com/facebook/react-native/issues/35210" target="_blank" rel="noopener noreferrer" class="">New issue is open to communicate status and workarounds</a>.</li>
<li class="">Nov 6th - 04:11 PM: <a href="https://issues.sonatype.org/browse/OSSRH-86006?focusedCommentId=1216303&amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1216303" target="_blank" rel="noopener noreferrer" class="">Ticket to SonaType</a> asking for removal of the artifacts is open.</li>
<li class="">Nov 6th - 04:40 PM: <a href="https://twitter.com/reactnative/status/1589296764678705155" target="_blank" rel="noopener noreferrer" class="">First tweet</a> from @reactnative with ack + link to issue.</li>
<li class="">Nov 6th - 07:05 PM: Decision to patch React Native versions back to 0.63.</li>
<li class="">Nov 7th - 12:47 AM: Last patched release is released: <a href="https://github.com/facebook/react-native/releases/tag/v0.63.5" target="_blank" rel="noopener noreferrer" class="">0.63.5</a>.</li>
<li class="">Nov 8th - 08:04 PM: Artifacts on Maven Central are <a href="https://issues.sonatype.org/browse/OSSRH-86006?focusedCommentId=1216303&amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1216303" target="_blank" rel="noopener noreferrer" class="">fully removed</a>.</li>
<li class="">Nov 10th - 11:51 AM: Issue about the <a href="https://github.com/facebook/react-native/issues/35210#issuecomment-1310170361" target="_blank" rel="noopener noreferrer" class="">incident is closed</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="lessons-learned">Lessons Learned<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#lessons-learned" class="hash-link" aria-label="Direct link to Lessons Learned" title="Direct link to Lessons Learned" translate="no">​</a></h2>
<p>While in many ways the conditions to trigger this incident has existed since React Native 0.12.0, we want to ensure that the foundations on which we develop and release React Native moving forward are stronger. Here are some of the lessons learned and the actionables on how we’ll adapt our processes and infrastructure to respond faster and stronger in the future.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="incident-response-strategy">Incident response strategy<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#incident-response-strategy" class="hash-link" aria-label="Direct link to Incident response strategy" title="Direct link to Incident response strategy" translate="no">​</a></h3>
<p>This incident highlighted gaps in our incident response strategy for open-source issues related to React Native.</p>
<p>The community quickly found a workaround in less than 2 hours. Due to our lack of visibility on the scope of the impact of this issue, as well as the complexity required to fix it for old versions, we relied on impacted people discovering the workaround on the GitHub issue.</p>
<p>It took us 48 hours to recognize the larger scope of this issue and that we couldn’t rely on everyone finding the GitHub issue. We needed to prioritize more complex active mitigations to automatically fix people’s projects.</p>
<p>We will be revisiting our processes for when to rely on developer-applied-workarounds vs fixes that we can deploy automatically. We will also take a look at our options for getting a better live pulse on the health of our ecosystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="release-support-policy">Release Support Policy<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#release-support-policy" class="hash-link" aria-label="Direct link to Release Support Policy" title="Direct link to Release Support Policy" translate="no">​</a></h3>
<p>As visualized in the <a href="https://rn-versions.github.io/" target="_blank" rel="noopener noreferrer" class="">rn-versions tool</a>, to cover more than 90% of the developer base of React Native at the time of the incident, we had to release patches all the way down to version 0.63.</p>
<p>We believe this is caused by the React Native upgrade experience which has historically been full of frictions. We are currently looking into ways to improve the upgrade experience to make it smoother and faster to mitigate this fragmentation of the ecosystem.</p>
<p>Releasing a newer version of React Native should never have an impact on users on older versions, and we want to apologize for the disruption we caused to your workflow.</p>
<p>Similarly, we want to also stress the importance of being up to date with the latest version of your dependencies and React Native to benefit from the improvements and the safeguards we introduced. This incident happened during a time in which an official <a href="https://github.com/reactwg/react-native-releases#releases-support-policy" target="_blank" rel="noopener noreferrer" class="">release support policy</a> was getting defined and wasn’t broadcasted or enforced yet.</p>
<p>In the future, we will communicate our support policy over our communication channels and we will consider <a href="https://docs.npmjs.com/deprecating-and-undeprecating-packages-or-package-versions" target="_blank" rel="noopener noreferrer" class="">deprecating older versions of React Native on npm</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="improved-testing-and-best-practices-for-3rd-party-libraries">Improved testing and best practices for 3rd party libraries<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#improved-testing-and-best-practices-for-3rd-party-libraries" class="hash-link" aria-label="Direct link to Improved testing and best practices for 3rd party libraries" title="Direct link to Improved testing and best practices for 3rd party libraries" translate="no">​</a></h3>
<p>This incident highlighted the importance of having better release testing and better guidance to 3rd party libraries.</p>
<p>On the testing side, releasing versions down to <code>0.63.x</code> proved to be challenging due to the lack of automation and testing we now have in place for stable releases. We recognize the importance of our release and testing infrastructure and we’re going to invest further in it in the future.</p>
<p>Specifically, we are now encouraging and supporting 3rd party library testing as part of the <a href="https://github.com/reactwg/react-native-releases/discussions/41" target="_blank" rel="noopener noreferrer" class="">release of react native</a>. We’re also adding some new channels and roles in the <a href="https://github.com/facebook/react-native/blob/main/ECOSYSTEM.md#core-contributors" target="_blank" rel="noopener noreferrer" class="">Core Contributors Discord Server</a>.</p>
<p>On top of this, we started a closer collaboration with Callstack, the maintainers of <a href="https://github.com/callstack/react-native-builder-bob/tree/main/packages/create-react-native-library" target="_blank" rel="noopener noreferrer" class="">create-react-native-library</a>, to improve the library template and make sure it follows all the necessary best practices to integrate with React Native projects. The newer version of <code>create-react-native-library</code> is now fully compatible with 0.71 projects while still offering backward compatibility.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="conclusions">Conclusions<a href="https://reactnative.dev/blog/2023/01/27/71rc1-android-outage-postmortem#conclusions" class="hash-link" aria-label="Direct link to Conclusions" title="Direct link to Conclusions" translate="no">​</a></h2>
<p>We want to apologize for the disruption this caused to the workflows of developers all around the world. As highlighted above, we have already started taking action to strengthen our foundation - and more work is due.</p>
<p>We hope that sharing these insights will help you all better understand this incident, and that you can leverage our learnings to apply better practices in your own tools and projects.</p>
<p>In closing, we want once again to thank Sonatype for helping us remove the artifacts, our community, and the release crew that worked tirelessly to address this as soon as possible.</p>]]></content:encoded>
            <category>engineering</category>
        </item>
    </channel>
</rss>