<?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>Wed, 23 Oct 2024 16:01: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 © 2024 Meta Platforms, Inc.</copyright>
        <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 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">Suspense</a>, <a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-transitions" target="_blank" rel="noopener noreferrer">Transitions</a>, <a href="https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching" target="_blank" rel="noopener noreferrer">automatic batching</a>, and <a href="https://react.dev/reference/react/useLayoutEffect" target="_blank" rel="noopener noreferrer"><code>useLayoutEffect</code></a>. The New Architecture also includes new <a href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Module</a> and <a 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">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><a href="https://www.youtube.com/watch?v=52El0EUI6D0" target="_blank" rel="noopener noreferrer">React Native EU 2019 - The New React Native</a></li>
<li><a href="https://www.youtube.com/watch?v=FZ0cG47msEk" target="_blank" rel="noopener noreferrer">React Conf 2021 - React 18 Keynote</a></li>
<li><a href="https://www.youtube.com/watch?v=Q6TkkzRJfUo" target="_blank" rel="noopener noreferrer">App.js 2022 - Bringing the New React Native Architecture to the OSS Community</a></li>
<li><a href="https://www.youtube.com/watch?v=Q5SMmKb7qVI" target="_blank" rel="noopener noreferrer">React Conf 2024 - Day 2 Keynote</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>The New Native Module System</li>
<li>The New Renderer</li>
<li>The Event Loop</li>
<li>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">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">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">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">BlueSky</a> a shot with their new release.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>Synchronous access to and from the native runtime</li>
<li>Type safety between JavaScript and native code</li>
<li>Code sharing across platforms</li>
<li>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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 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 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">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">Marc Rousavy</a>, creator of <code>react-native-mmkv</code></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>We've also completely rewritten the Native Renderer, adding several benefits:</p>
<ul>
<li>Updates can be rendered on different threads at different priorities.</li>
<li>Layout can be read synchronously and across different threads.</li>
<li>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 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">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">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">Krzysztof Magiera</a>, creator of <a href="https://docs.swmansion.com/react-native-reanimated/" target="_blank" rel="noopener noreferrer">Reanimated</a></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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>The ability to interrupt rendering to process events and tasks</li>
<li>Closer alignment with web specifications</li>
<li>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 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 anchorWithStickyNavbar_JmGV" 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">​</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-a653d794d04871e5b7a026e35d8edf03.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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 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 anchorWithStickyNavbar_JmGV" 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">​</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">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">Concurrent React</a> by following the <a href="https://react.dev/reference/rules" target="_blank" rel="noopener noreferrer">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">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">reactnative.directory</a> website:</p>
<p><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/0.76-directory-85387cf0da638f887bbf996c39db432d.png" width="1999" height="785" class="img_SS3x"></p>
<p>For more details on upgrading, see <a 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 anchorWithStickyNavbar_JmGV" 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">​</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">React 18 blog post</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>Transitions are a new concept in React 18 to distinguish between urgent and non-urgent updates.</p>
<ul>
<li><strong>Urgent updates</strong> reflect direct interaction, like typing and pressing.</li>
<li><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 href="https://reactnative.dev/docs/0.75/the-new-architecture/landing-page#support-for-concurrent-renderer-and-features">Support for Concurrent Renderer and Features</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 href="https://reactnative.dev/docs/0.75/the-new-architecture/landing-page#support-for-concurrent-renderer-and-features">Support for Concurrent Renderer and Features</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">RFC for Suspense in React 18</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>To upgrade to 0.76, follow the steps in the <a 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">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 anchorWithStickyNavbar_JmGV" 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">​</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">reactnative.directory</a> website.</p>
<p>If any of the libraries your app depends on are not compatible yet, you can:</p>
<ul>
<li>Open an issue with the library and ask the author to migrate to the New Architecture.</li>
<li>If the library is not maintained, consider alternative libraries with the same features.</li>
<li><a 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">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><a href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Modules</a></li>
<li><a href="https://reactnative.dev/docs/next/fabric-native-components-introduction">Native Components</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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><a href="https://reactnative.dev/docs/next/turbo-native-modules-introduction">Native Modules</a></li>
<li><a href="https://reactnative.dev/docs/next/fabric-native-components-introduction">Native Components</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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><a href="https://expo.dev/" target="_blank" rel="noopener noreferrer">Expo</a>, for adopting the New Architecture early on, and for supporting the work on migrating the most popular libraries.</li>
<li><a href="https://swmansion.com/" target="_blank" rel="noopener noreferrer">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><a href="https://www.callstack.com/" target="_blank" rel="noopener noreferrer">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><a href="https://opensource.microsoft.com/" target="_blank" rel="noopener noreferrer">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><a href="https://www.expensify.com/" target="_blank" rel="noopener noreferrer">Expensify</a>, <a href="https://www.kraken.com/" target="_blank" rel="noopener noreferrer">Kraken</a>, <a href="https://bsky.app/" target="_blank" rel="noopener noreferrer">BlueSky</a> and <a href="https://www.brigad.co/" target="_blank" rel="noopener noreferrer">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>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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a 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><a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#react-native-devtools">React Native DevTools</a></li>
<li><a href="https://reactnative.dev/blog/2024/10/23/release-0.76-new-architecture#faster-metro-resolution">Faster Metro resolution</a></li>
<li><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a 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><a 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><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 href="https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here">The New Architecture is Here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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-d0600131e06fdd50eeab27a4894fdcd1.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><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><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><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><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><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">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 anchorWithStickyNavbar_JmGV" 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">​</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">FAQs</a>.</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="https://reactnative.dev/docs/debugging">Updated debugging docs</a></li>
<li><a href="https://www.youtube.com/watch?v=OwivVpg6Luc" target="_blank" rel="noopener noreferrer">Announcement talk at React Universe Conf</a></li>
<li><a href="https://github.com/react-native-community/discussions-and-proposals/discussions/819" target="_blank" rel="noopener noreferrer">Feedback thread and FAQs</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</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">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-6dc238eaca2f6fa38b9a0f6549178340.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">previous shadow functionality</a> had some shortcomings addressed now addressed by <code>boxShadow</code>:</p>
<ul>
<li>Does not work on Android</li>
<li>Cannot be <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#inset" target="_blank" rel="noopener noreferrer">inset</a></li>
<li>Does not have <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#length" target="_blank" rel="noopener noreferrer">spread</a></li>
<li>Does not work on <code>View</code>s if there is no background color</li>
<li>Is a separate prop, so it cannot share the same web syntax</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li>The default shadow color is black, not the parent’s color</li>
<li>Android normal shadows are supported on <strong>Android 9+</strong></li>
<li>Android inset shadows are supported on <strong>Android 10+</strong></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li>iOS <code>filter</code> only supports brightness and opacity</li>
<li>iOS <code>filter</code> will not apply to shadows, outlines, or any other graphical elements outside the bounds of the element</li>
<li>Android <code>blur</code> and <code>drop-shadow</code> are only supported on <strong>Android 12+</strong></li>
<li><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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>As previosly 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">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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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">in the dedicated post</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>We have updated our minimum platform and SDK versions:</p>
<ul>
<li>iOS - from 13.4 to <a href="https://support.apple.com/en-gb/108051#151" target="_blank" rel="noopener noreferrer">15.1</a></li>
<li>Android - from SDK 23 to <a href="https://developer.android.com/tools/releases/platforms#7.0" target="_blank" rel="noopener noreferrer">SDK 24</a> (Android 7)</li>
</ul>
<p>This change was announced earlier in the year when 0.75 <a 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">Android</a> and <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/812" target="_blank" rel="noopener noreferrer">iOS</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><strong>Animation</strong>
<ul>
<li>Stop sending state updates to React in looping animation. This was causing unnecessary re-rendering with looping animations.</li>
</ul>
</li>
<li><strong>devtools:</strong>
<ul>
<li>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">RFC</a>)</li>
</ul>
</li>
<li><strong>text engine</strong>
<ul>
<li>Always use AttributedStringBox instead of AttributedString in TextLayoutManager</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li><strong>rendering:</strong>
<ul>
<li>View backgrounds are no longer directly <code>ReactViewBackgroundDrawable</code> or <code>CSSBackgroundDrawable</code></li>
</ul>
</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li><strong>turbomodule</strong>
<ul>
<li>Removed the <code>RCT_EXPORT_CXX_MODULE_EXPERIMENTAL</code> Macro for autolinking pure Cxx module.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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><a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer">Joe Vilches</a> and <a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer">Nick Gerleman</a> box-shadow and filter style props.</li>
<li><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer">Alex Hunt</a> React Native DevTools.</li>
<li><a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer">Nicola Corti</a> Android shipping as a single library.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">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-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">npx @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@latest 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></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>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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a 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><a href="https://reactnative.dev/blog/2024/08/12/release-0.75#new-architecture-stabilization">New Architecture Stabilization</a></li>
<li><a href="https://reactnative.dev/blog/2024/08/12/release-0.75#using-frameworks">Using Frameworks</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a 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><a 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><a href="https://reactnative.dev/blog/2024/08/12/release-0.75#android-jsimodule-has-been-deleted">Android: JSIModule has been deleted</a></li>
<li><a 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><a 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><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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 anchorWithStickyNavbar_JmGV" 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">​</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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Will be rendered as follows:</p>
<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-5ca149613fa86866211d278fb0a2d70c.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-eacd74f15b3276133ad21cd7a3a40f13.png" width="378" height="768" class="img_SS3x"></td></tr></tbody></table>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>The <a href="https://reactnative.dev/docs/transforms" target="_blank" rel="noopener noreferrer"><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Will be rendered as follows:</p>
<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-389b200cc93b9ccc7cbe7b093dfb949f.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-ffbcc3d0c04801651b0d5932074ff249.png" width="384" height="768" class="img_SS3x"></td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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>Fix <code>adjustsFontSizeToFit</code> on Android (<a href="https://github.com/facebook/react-native/pull/44075" target="_blank" rel="noopener noreferrer">#44075</a>)</li>
<li>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">#44146</a>)</li>
<li>Fix text baseline being moved up on iOS (<a href="https://github.com/facebook/react-native/pull/44932" target="_blank" rel="noopener noreferrer">#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">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-049545eb15745d88f779b5969242a156.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">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">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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-cpp codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-cpp codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></details>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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>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"><code>react-native-community/template</code></a>.</li>
<li>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">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 anchorWithStickyNavbar_JmGV" 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">​</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">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"><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">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 anchorWithStickyNavbar_JmGV" 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">​</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-6b1313b48e5c70e39c32db72f9a1fad8.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>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>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 anchorWithStickyNavbar_JmGV" 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">​</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">here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">for Android</a> and <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/812" target="_blank" rel="noopener noreferrer">for iOS</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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">Turbo Native Modules</a> instead as an alternative.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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><code>UIManagerModule.showPopupMenu()</code></li>
<li><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"><code>@react-native/popup-menu-android</code></a> package.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Instead, use <code>didReceiveNotification:(UNNotification *)notification</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">Experimental New Debugger</a> (Note: this is not accessible if connecting to Hermes from Chrome).</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><strong>Codegen</strong>
<ul>
<li>Changed slightly the name of pure C++ TurboModules generated classes and structs. We dropped the <code>Cxx</code> token from their names</li>
<li>Float enums are not supported anymore due to possible precision errors</li>
<li>Throw an error when passing <code>null</code> in JS to a non nullable argument in Native</li>
</ul>
</li>
<li><strong>Linting</strong>
<ul>
<li>ESLint config no longer run prettier when linting</li>
</ul>
</li>
<li><strong>C++</strong>
<ul>
<li><code>ScrollViewShadowNode</code> now requires a new <code>bool includeTransform</code> parameter in the constructor</li>
<li>Removed <code>executeAsynchronously</code> and <code>executeSynchronously_CAN_DEADLOCK</code> from RuntimeExecutor</li>
<li>Renamed <code>JsErrorHandlingFunc</code> to <code>OnJsError</code> in <code>JsErrorHandler.h</code></li>
<li>Renamed <code>handleJsError</code> to <code>OnJsError</code> in <code>handleFatalError.h</code></li>
<li>Removed unused <code>import</code> from <code>ReactPrimitives.h</code></li>
<li><code>LongLivedObjectCollection</code> and <code>LongLivedObject</code> get methods now accepts a Runtime parameter</li>
<li>Renamed the <code>utils/jsi.h</code> file to <code>jsi-utils.h</code></li>
</ul>
</li>
<li><strong>TextInput</strong>
<ul>
<li>Removed deprecated <code>onTextInput</code> callback</li>
</ul>
</li>
<li><strong>Pressability</strong>
<ul>
<li>Removed <code>onLongPressShouldCancelPress_DEPRECATED</code>, <code>onResponderTerminationRequest_DEPRECATED</code>, and <code>onStartShouldSetResponder_DEPRECATED</code> method</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li><strong>ReactViewBackgroundDrawable</strong>
<ul>
<li>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><strong>ReactContext</strong>
<ul>
<li><code>ReactContext</code> and <code>ReactApplicationContext</code> are now abstract. Use <code>BridgeReactContext</code> and <code>BridgelessReactContext</code> instead</li>
<li>Delete <code>ReactContext.initializeWithInstance()</code>. Please use <code>BridgeReactInstance</code> instead</li>
<li>Remove <code>BridgelessReactContext.getJavaScriptContextHolder()</code> from. Please use <code>BridgelessCatalystInstance</code> instead</li>
<li>Remove <code>ReactContext.getRuntimeExecutor()</code>. Please use <code>BridgelessCatalystInstance</code></li>
</ul>
</li>
<li><strong>Layout</strong>
<ul>
<li>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>Requires <code>supportsRTL</code> in Android Manifest</li>
</ul>
</li>
<li><strong>Runtime</strong>
<ul>
<li>Removed <code>ReactJsExceptionHandler</code> from ReactHostImpl</li>
<li>Make the app responsible to return the core turbomodules when not using the default template</li>
</ul>
</li>
<li><strong>DevSupport</strong>
<ul>
<li>Changed the <code>DevSupportManagerFactory.create()</code> to accept a new <code>PausedInDebuggerOverlayManager</code> parameter</li>
</ul>
</li>
<li><strong>Measurement</strong>
<ul>
<li>Deleted <code>UIManagerModule.measureLayoutRelativeToParent()</code></li>
</ul>
</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li><strong>Runtime</strong>
<ul>
<li>Remove <code>[RCTHost getSurfacePresenter]</code> and <code>[RCTHost getModuleRegistry]</code></li>
<li>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><strong>Image</strong>
<ul>
<li>Remove unused <code>RCTImageLoadingPerfInstrumentationEnabled</code></li>
</ul>
</li>
<li><strong>Error Handling</strong>
<ul>
<li>Remove <code>RCTRedBox</code> access through <code>RCTBridge</code></li>
</ul>
</li>
<li><strong>CocoaPods</strong>
<ul>
<li>Renamed <code>BUILD_FROM_SOURCE</code> to <code>RCT_BUILD_HERMES_FROM_SOURCE</code></li>
<li>Renamed <code>React-Codegen</code> to <code>ReactCodegen</code> for better compatibility with <code>use_frameworks</code> and Swift</li>
</ul>
</li>
<li><strong>TextInput</strong>
<ul>
<li>Remove deprecated <code>onTextInput</code> callback</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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><a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer">Nick Gerleman</a> and <a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer">Joe Vilches</a> for <em>Yoga 3.1 and Layout Improvements</em></li>
<li><a href="https://github.com/arushikesarwani94" target="_blank" rel="noopener noreferrer">Arushi Kesarwani</a> for Supporting UIManager in the New Architecture</li>
<li><a href="https://github.com/philIip" target="_blank" rel="noopener noreferrer">Phillip Pan</a> for Accessing jsi::Runtime in TurboModules</li>
<li><a href="https://github.com/alanleedev" target="_blank" rel="noopener noreferrer">Alan Lee</a> and <a href="https://github.com/realsoelynn" target="_blank" rel="noopener noreferrer">Soe Lynn</a> for Last version supporting minSdk 23 and minIOSVersion 13.4</li>
<li><a href="https://github.com/kudo" target="_blank" rel="noopener noreferrer">Kudo Chien</a> for Auto-linking performance improvements</li>
<li><a href="https://github.com/huntie" target="_blank" rel="noopener noreferrer">Alex Hunt</a> for Removal of <code>ram-bundle</code> and <code>profile-hermes</code> commands</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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">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">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 anchorWithStickyNavbar_JmGV" 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?">​</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">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">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">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">Getting Started page</a> on the website to reflect this recommendation.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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?">​</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">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">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">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-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">npx @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@latest init</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>and on GitHub at <a href="https://github.com/react-native-community/cli" target="_blank" rel="noopener noreferrer">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">Read more in the RFC</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#yoga-30">Yoga 3.0</a></li>
<li><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#new-architecture-bridgeless-by-default">New Architecture: Bridgeless by Default</a></li>
<li><a 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><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a 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><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes-to-pushnotificationios-deprecated">API Changes to PushNotificationIOS (Deprecated)</a></li>
<li><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#removal-of-deprecated-proptypes">Removal of Deprecated <code>PropTypes</code></a></li>
<li><a 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><a href="https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes">Other Breaking Changes</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>React Native 0.74 includes <a href="https://yogalayout.dev/blog/announcing-yoga-3.0" target="_blank" rel="noopener noreferrer">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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td><p><img decoding="async" loading="lazy" alt="Previous layout" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAABNElEQVR4nO3dsQ3DMBAEQdJuXJWLakCBkwUlY6aCCxaf/hxjjQc6vrsXvMY6zt0Tbnx2D+A/CYuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBIzId+WOVna8zdE264WCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCSERUJYJIRFQlgkhEVCWCQubAgGxe4dSXUAAAAASUVORK5CYII=" width="200" height="100" class="img_SS3x"></p></td><td><p><img decoding="async" loading="lazy" alt="New layout" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAABLElEQVR4nO3dsQ2AMBAEQRsap3NogWRlg2YquGD16c977GiOLXdd5+oFn3GsHsA/CYuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBICIuEsEgIi4SwSAiLhLBIzC0/me76YZXXXCwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSwiIhLBLCIiEsEsIiISwSD58QBUjZIyfJAAAAAElFTkSuQmCC" width="200" height="100" class="img_SS3x"></p></td></tr></tbody></table></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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"><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">World Wide Web Consortium</a></small></figcaption></figure>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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"><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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></td><td width="300"><p><img decoding="async" loading="lazy" alt="Static Example" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGOCAYAAAC5Y1UnAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAABkKADAAQAAAABAAABjgAAAAA32yssAAAACXBIWXMAAAsTAAALEwEAmpwYAAACymlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yODg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI4NjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoqdD14AAAU5klEQVR4Ae3aT48cRxnA4Vp748QkQSH8kSKkICKQgoALdy6c+CRc+SJ8FL4GUi5w4gAoB6SISARCAiLYsb07VM1sO7NWbYqtOLzd7zwjjb3b073V9VS7fzu7PitltyseBAgQIEDglgJ3brm/3QkQIECAwF5AQFwIBAgQIDAlICBTbA4iQIAAAQFxDRAgQIDAlICATLE5iAABAgQExDVAgAABAlMCAjLF5iACBAgQEBDXAAECBAhMCQjIFJuDCBAgQEBAXAMECBAgMCUgIFNsDiJAgAABAXENECBAgMCUgIBMsTmIAAECBATENUCAAAECUwICMsXmIAIECBAQENcAAQIECEwJCMgUm4MIECBAQEBcAwQIECAwJSAgU2wOIkCAAAEBcQ0QIECAwJSAgEyxOYgAAQIEBMQ1QIAAAQJTAgIyxeYgAgQIEBAQ1wABAgQITAkIyBSbgwgQIEBAQFwDBAgQIDAlICBTbA4iQIAAAQFxDRAgQIDAlICATLE5iAABAgQExDVAgAABAlMCAjLF5iACBAgQEBDXAAECBAhMCQjIFJuDCBAgQEBAXAMECBAgMCUgIFNsDiJAgAABAXENECBAgMCUgIBMsTmIAAECBATENUCAAAECUwICMsXmIAIECBAQENcAAQIECEwJCMgUm4MIECBAQEBcAwQIECAwJXA+ddQaDzrbldKe+8fZGs/wfzinev67eu7t6UGAAIGVC+QJyJ16023PLd97Wzgu6hWzdHDlF4/TI0DgtAXyBGRX77oX9bnFgBwHY//uY4uTOO1/SGZP4BQF6p2q3Xk3/Gj32v0UPq0fPGmf1OcWb8DLeb9Qz789/XqqIngQILBigW2/A2n32Mv6/NrDUn7421Je+0u99z6u70TaDbg+ttKRfTvaeb9Yyvtvl/Led0v52yul3K0vXNZJtNc9CBAgsDKBbQdkCcSrNSBvvlPKt35dyovvlfL42zUe9a7bnpu4+dYS3vlDKY9+Ws/3F6V8/MYhIG11ale2MYeVXdlOhwCBL11gwwFpgbgqyL36NuSr/6rvQH5fA/JJ/UnW+we4JTBfOuNzGKC9m/q0nvvLdS73rqp3t25rAfEgQIDACgU2HJAjzXa/vbhfn/Wdx8WfakC+U+PyqG2szzX/LmF/4vUcX6+nWc/7op7rZa2G/8ZbTTwIEFi7QI6A7JXb7wrazbd9Uv/YtXi0b9/XGpD29mgJSDvf9mmbw9WzfupBgACBNQvkCEi7F5+136a3/4VVH2f1x1mlPdu2LTy+Us+5nmd7HkqyhZN2jgQInLhAjoA8XcT9Hbjeg+s7kbP2C4QWkKttT/dZywfLea35HNdi5TwIEFijwFp/vvPFrJZ78xf7Kv+Ho9vPrTwIECCwTYGcAdnEWux/6bGJM3WSBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE9AQHoqthEgQIDAUEBAhkR2IECAAIGegID0VGwjQIAAgaGAgAyJ7ECAAAECPQEB6anYRoAAAQJDAQEZEtmBAAECBHoCAtJTsY0AAQIEhgICMiSyAwECBAj0BASkp2IbAQIECAwFBGRIZAcCBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE9AQHoqthEgQIDAUEBAhkR2IECAAIGegID0VGwjQIAAgaGAgAyJ7ECAAAECPQEB6anYRoAAAQJDAQEZEtmBAAECBHoCAtJTsY0AAQIEhgICMiSyAwECBAj0BASkp2IbAQIECAwFBGRIZAcCBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE9AQHoqthEgQIDAUEBAhkR2IECAAIGegID0VGwjQIAAgaGAgAyJ7ECAAAECPQEB6anYRoAAAQJDAQEZEtmBAAECBHoCAtJTsY0AAQIEhgICMiSyAwECBAj0BASkp2IbAQIECAwFBGRIZAcCBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE9AQHoqthEgQIDAUEBAhkR2IECAAIGegID0VGwjQIAAgaGAgAyJ7ECAAAECPQEB6anYRoAAAQJDAQEZEtmBAAECBHoCAtJTsY0AAQIEhgICMiSyAwECBAj0BASkp2IbAQIECAwFBGRIZAcCBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE9AQHoqthEgQIDAUEBAhkR2IECAAIGegID0VGwjQIAAgaGAgAyJ7ECAAAECPQEB6anYRoAAAQJDAQEZEtmBAAECBHoCAtJTsY0AAQIEhgICMiSyAwECBAj0BASkp2IbAQIECAwFBGRIZAcCBAgQ6AkISE/FNgIECBAYCgjIkMgOBAgQINATEJCeim0ECBAgMBQQkCGRHQgQIECgJyAgPRXbCBAgQGAoICBDIjsQIECAQE8gaUB2vbnaRoAAAQLPUeD8OX6tuC/VenHcjPbx2eXV+Ry/EHeKRiZAgEA2gRwB2a/KWf2zPdvjpfpsAXlUn3frc22PFrX25q+d40V93qvP+tC6g4M/CRDYhECOgCztWP7e35DbJy0kS1TWuB6tGC0iLxxO7kxB1rhKzokAgb5AkoDUG+/5R/U+/Mere/GfD91YczuW9dg344PDG6XdX+v5P6wfX/34rb1J2cIclrn4mwCBkxLYdkCWb9gf1O/gP/hB/WnQL+tPg+qPrZ7UHwkt382v/Qa8a5OopbjzoJTH3yjlwzdK+c+Lh4vwSf1rmeNJXZYmS4DAFgTq7XV/B9vCud58jvc/LeXNd0u5/2G9EdffKexaF+udt0Vkt+KC7E/tKiCl1uKihvAfb5Xy9xqSBzWCd+prlys+/5tXxCsECJyAQI6AtHvsef2xT/vRT/v4aTTazfmmG3B7rT0+7/WbXjscefjztl/neP+j89vHrn7Fx/XdyGV9LrsdD+VjAgQIrEig3iETvANZEahTIUCAwKkIbPt3IMerdLd+y16/cS9nrYnHL2zk4/Zmp7W8/a9eP7bayKI5TQKnLeAdyGmvv9kTIEBgWqB9z+5BgAABAgRuLSAgtyZzAAECBAg0AQFxHRAgQIDAlICATLE5iAABAgQExDVAgAABAlMCAjLF5iACBAgQEBDXAAECBAhMCQjIFJuDCBAgQEBAXAMECBAgMCUgIFNsDiJAgAABAXENECBAgMCUgIBMsTmIAAECBATENUCAAAECUwICMsXmIAIECBAQENcAAQIECEwJCMgUm4MIECBAQEBcAwQIECAwJSAgU2wOIkCAAAEBcQ0QIECAwJSAgEyxOYgAAQIEBMQ1QIAAAQJTAgIyxeYgAgQIEBAQ1wABAgQITAkIyBSbgwgQIEBAQFwDBAgQIDAlICBTbA4iQIAAAQFxDRAgQIDAlICATLE5iAABAgQExDVAgAABAlMCAjLF5iACBAgQEBDXAAECBAhMCQjIFJuDCBAgQEBAXAMECBAgMCUgIFNsDiJAgAABAXENECBAgMCUgIBMsTmIAAECBATENUCAAAECUwICMsXmIAIECBAQENcAAQIECEwJCMgUm4MIECBAQEBcAwQIECAwJXA+dZSDCJyIwFmd5939c7ef8eHPE5m8aRIYCAjIAMjLpy1wVnbllfq8d8UgIKd9PZj9dYH6DdbOv4nrJj4jUNo7j/bwj+Pg4E8CPQHvQHoqtp20QPvF4GV93qv5eL08Kj8qH5Wvl09qVM7rFkk56YvD5K8JCMg1Dp8QaOEo5WF9vloz8r3ycfl5+U15q7xTP/tmzUdLi4i4Tgg0AQFxHRB4RuCl+nkLyGs1Ft8v/yw/K++WH5dflSflJ9f2XDKy/LirvXjTtrZP77VrX7DzybPHLJ+3XZ8dd2tjLOd7m3m0+R/vf0y22Cyv37Tvsv3Z/Zevtby+fH7897PH3LTvsv3Z/Zevtby+fH78d++13tdZ9uu91r7e8vrx114+7r3W+zrLfr3X2tcSkEXU3wSuBJb/297+vlcj8nLNSfuHcl5+x4gAgSMBATnC8CGBY4Fd/V73stwpF0+/z3q7vvxRff67Pl843tXHBE5SQEBOctlN+vMEPnu7fvjos1+cP6w/FmjxaL9Q9yBAQEBcAwRuISAct8Cya3qB5ce96SdqggSej4CEPB9HXyWDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQICAgASgG5IAAQIZBAQkwyqaAwECBAIEBCQA3ZAECBDIICAgGVbRHAgQIBAgICAB6IYkQIBABgEBybCK5kCAAIEAAQEJQDckAQIEMggISIZVNAcCBAgECAhIALohCRAgkEFAQDKsojkQIEAgQEBAAtANSYAAgQwCApJhFc2BAAECAQICEoBuSAIECGQQEJAMq2gOBAgQCBAQkAB0QxIgQCCDgIBkWEVzIECAQIDAfwFw/RWUhHqJ4wAAAABJRU5ErkJggg==" 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 anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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">reactnative.dev</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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">updater functions</a> or equivalent.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p><a href="https://yarnpkg.com/blog/release/3.0" target="_blank" rel="noopener noreferrer">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">guide</a>.</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">read more</a>).</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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)">​</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">here</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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-4200c5fc0a6daaff0b2a377c6f77af2c.jpg" width="1600" height="608" class="img_SS3x"></p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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)">​</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">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">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">@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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">​</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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Implement <code><a href="https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649518-usernotificationcenter?language=objc" target="_blank" rel="noopener noreferrer">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Finally, delete the following methods and adapt the logic into the callbacks above which will be called instead:</p><ol>
<li><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622930-application?language=objc" target="_blank" rel="noopener noreferrer">application:didReceiveLocalNotification:</a></code> [deprecated]</li>
<li><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623117-application?language=objc" target="_blank" rel="noopener noreferrer">application:didReceiveRemoteNotification:</a></code> [deprecated]</li>
<li><code><a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application?language=objc" target="_blank" rel="noopener noreferrer">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">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">AppDelegate.mm</a></code>.</p><h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4><ol>
<li>Remove any references to <code>alertAction</code>.</li>
<li>Remove the <code>handler</code> argument on any calls to <code>removeEventListener</code>.</li>
<li>Replace any usages of <code>repeatInterval</code> by firing multiple notifications using <code>fireDate</code> or <code>fireIntervalSeconds</code> instead.</li>
<li>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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>Use of <a href="https://fbflipper.com/" target="_blank" rel="noopener noreferrer">Flipper</a> for inspecting React Native layouts, network requests, and <a href="https://fbflipper.com/docs/features/react-native/" target="_blank" rel="noopener noreferrer">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">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">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">Android guide</a>, <a href="https://fbflipper.com/docs/getting-started/ios-native/" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">​</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"><em>Why you don't need Flipper in your React Native app</em></a> article by Jamon Holmgren.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>Using the <a href="https://reactnative.dev/docs/debugging?js-debugger=hermes#opening-the-debugger" target="_blank" rel="noopener noreferrer">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">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">here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p><strong>General</strong></p>
<ul>
<li>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">#42251</a>).</li>
</ul>
<p><strong>Android</strong></p>
<ul>
<li>Remove of <code>JSIModule*</code> from <code>FabricUIManagerProvider</code> (<a href="https://github.com/facebook/react-native/pull/42059" target="_blank" rel="noopener noreferrer">#42059</a>).<!-- -->
<ul>
<li>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">TurboModules</a> instead.</li>
</ul>
</li>
<li>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">#42441</a>)<!-- -->
<ul>
<li>This API has been moved to the <a href="https://www.npmjs.com/package/@react-native/popup-menu-android" target="_blank" rel="noopener noreferrer"><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>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">#41533</a>).</li>
<li>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"><code>bundleURL</code></a> is handled (<a href="https://github.com/facebook/react-native/pull/43994" target="_blank" rel="noopener noreferrer">#43994</a>).<!-- -->
<ul>
<li>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>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"><code>bundleUrl</code> is a function</a> which is re-evaluated when needed, enabling the use of a different URL across refreshes.</li>
<li>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"><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">full changelog</a> for a complete list of breaking changes.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p><strong>iOS</strong></p>
<ul>
<li>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">#44167</a> and will ship in 0.74.1.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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><a href="https://github.com/NickGerleman" target="_blank" rel="noopener noreferrer">Nick Gerleman</a> for <em>Yoga 3.0</em></li>
<li><a href="https://github.com/joevilches" target="_blank" rel="noopener noreferrer">Joe Vilches</a> for <em>Yoga 3.0</em></li>
<li><a href="https://twitter.com/CipolleschiR" target="_blank" rel="noopener noreferrer">Riccardo Cipolleschi</a> for <em>New Architecture: Bridgeless by Default</em></li>
<li><a href="https://twitter.com/SamuelSusla" target="_blank" rel="noopener noreferrer">Samuel Susla</a> for <em>New Architecture: Batched <code>onLayout</code> updates</em></li>
<li><a href="https://twitter.com/yungsters" target="_blank" rel="noopener noreferrer">Tim Yung</a> for <em>Removal of Deprecated <code>PropTypes</code></em></li>
<li><a href="https://github.com/ingridwang" target="_blank" rel="noopener noreferrer">Ingrid Wang</a> for <em>API Changes to PushNotificationIOS (Deprecated)</em></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a 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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#debugging-improvements">Debugging Improvements</a></li>
<li><a 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><a 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><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#android-14-support">Android 14 Support</a></li>
<li><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#new-architecture-updates">New Architecture Updates</a></li>
<li><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#babel-package-renames">Babel Package Renames</a></li>
<li><a href="https://reactnative.dev/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks#other-breaking-changes">Other Breaking Changes</a></li>
<li><a 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><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>We've refreshed the <a 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-884b7c2352b4ed16fd0465382bf60e96.jpg" width="1600" height="700" class="img_SS3x"></p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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-28bc7e9bed8673f606577509e0a6a86c.jpg" width="1600" height="740" class="img_SS3x"></p>
<p>Learn more about enabling this experience <a href="https://reactnative.dev/docs/next/debugging?js-debugger=new-debugger#opening-the-debugger">in the docs</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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"><code>watchFolders</code></a>.</p>
<p>Symlinks are deeply represented in Metro's internals, meaning they work with features such as <a 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 anchorWithStickyNavbar_JmGV" 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">​</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"><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">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">Work with monorepos</a> guide in the Expo docs.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</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">API Level 34</a> (<em>Upside Down Cake</em>).</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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">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">we published a note</a> with a clarification on what the AGP bump means for you as a library author.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p><a href="https://developer.android.com/about/versions/14/changes/partial-photo-video-access" target="_blank" rel="noopener noreferrer">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 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-299ce04377976b6d937149c7d0c82d35.jpg" width="1600" height="900" class="img_SS3x"></p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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"><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">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">New Architecture working group</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">view the RFC</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 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 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 href="https://reactnative.dev/docs/hermes">Hermes</a> for a consistent debugging experience on all platforms.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">Upgrade Helper</a> when upgrading, to ensure you have updated these dependencies. Some packages have been renamed:</p>
<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 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 anchorWithStickyNavbar_JmGV" 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">​</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">full changelog</a> for the complete list of breaking changes.</p>
<ul>
<li>Raise minimum Node.js requirement to 18.x (<a href="https://github.com/facebook/react-native/pull/37709" target="_blank" rel="noopener noreferrer">#37709</a>) (see also <a href="https://nodejs.org/en/blog/announcements/nodejs16-eol" target="_blank" rel="noopener noreferrer">Node.js 16 EOL</a>).</li>
<li>The template now uses TypeScript 5.0 (<a href="https://github.com/facebook/react-native/pull/36862" target="_blank" rel="noopener noreferrer">#36862</a>).<!-- -->
<ul>
<li>React Native types continue working on TypeScript 4.8.</li>
</ul>
</li>
<li><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">see above</a>).</li>
<li><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">#38275</a>).</li>
<li><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">#36795</a>).</li>
<li><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">#38242</a>).</li>
</ul>
<p>For library authors:</p>
<ul>
<li><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">discussion</a>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<ul>
<li>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">#1913</a>).</li>
<li>Remove fallback flow for Metro config defaults (<a href="https://github.com/react-native-community/cli/pull/1972" target="_blank" rel="noopener noreferrer">#1972</a>).<!-- -->
<ul>
<li>The <a 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>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">#2028</a>).</li>
<li>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">#2026</a>).</li>
</ul>
<p><a href="https://github.com/react-native-community/cli/releases/tag/v12.0.0" target="_blank" rel="noopener noreferrer">See full changelog for v12.0.0</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>As mentioned in <a 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 href="https://reactnative.dev/blog/2023/01/03/typescript-first#how-to-migrate">how to migrate</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">2259 commits</a> from 68 contributors. Thanks for all your hard work!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>Please use the <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">React Native Upgrade Helper</a> to view code changes between React Native versions for existing projects, in addition to the <a 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">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">2022 community survey</a> -- thank you to all those that participated!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#new-metro-features">New Metro Features</a></li>
<li><a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#developer-experience-improvements">Developer Experience Improvements</a></li>
<li><a 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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#deprecated-component-removals">Deprecated Component Removals</a></li>
<li><a href="https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks#package-renames">Package Renames</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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)">​</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 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">here</a>. We plan to default enable symlinks in 0.73.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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)">​</a></h4>
<p><a href="https://nodejs.org/api/packages.html#exports" target="_blank" rel="noopener noreferrer">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">"react-native" community condition</a>. See <a 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 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 anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>Hermes has added a better error message when invoking an undefined callable.</p>
<div class="language-jsx codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 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 nil" 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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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">​</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">React Native CLI changelogs</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">#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">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">de9c</a>, <a href="https://github.com/facebook/hermes/commit/6e2dd652c8d90c5d59737a81f66a259efffdcd00" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">​</a></h4>
<p>Support for the following specifications in Hermes has landed in React Native 0.72:</p>
<ul>
<li><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">Array</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/at" target="_blank" rel="noopener noreferrer">TypedArray</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/at" target="_blank" rel="noopener noreferrer">String</a>. See <a href="https://github.com/facebook/hermes/issues/823" target="_blank" rel="noopener noreferrer">#823</a> (<a href="https://github.com/facebook/hermes/commit/ebe2915ac386a6b73dec39c2af4ac7063e68cd99" target="_blank" rel="noopener noreferrer">ebe2</a>).</li>
<li>Implement <a href="https://github.com/tc39/proposal-well-formed-stringify" target="_blank" rel="noopener noreferrer">well-formed JSON.stringify</a> (<a href="https://github.com/facebook/hermes/commit/d41decf244aa814b1e58827a9de982f3b71667de" target="_blank" rel="noopener noreferrer">d41d</a>) to prevent ill-formed Unicode strings</li>
<li>Implement <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError" target="_blank" rel="noopener noreferrer">AggregateError</a> (<a href="https://github.com/facebook/hermes/commit/9b25a2530eb515f6c4fbd397ae290b6c97c049b2" target="_blank" rel="noopener noreferrer">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"><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 anchorWithStickyNavbar_JmGV" 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">​</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">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">here</a>. Subscribe to the working group GitHub notifications to stay informed on our progress on the New Architecture.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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><a href="https://reactnative.dev/docs/0.72/slider" target="_blank" rel="noopener noreferrer">Slider</a> is superseded by <a href="https://github.com/callstack/react-native-slider/tree/main/package" target="_blank" rel="noopener noreferrer">@react-native-community/slider</a></li>
<li><a href="https://reactnative.dev/docs/0.72/datepickerios" target="_blank" rel="noopener noreferrer">DatePickerIOS</a> is superseded by <a href="https://github.com/react-native-datetimepicker/datetimepicker" target="_blank" rel="noopener noreferrer">@react-native-community/datetimepicker</a></li>
<li><a href="https://reactnative.dev/docs/0.72/progressviewios" target="_blank" rel="noopener noreferrer">ProgressViewIOS</a> is superseded by <a href="https://github.com/react-native-progress-view/progress-view" target="_blank" rel="noopener noreferrer">@react-native-community/progress-view</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>All packages published from the <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer"><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">@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">react-native</a> package.</p>
<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>
<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">in the dedicated RFC</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">noisy redboxes</a>, <a href="https://github.com/facebook/metro/issues/965" target="_blank" rel="noopener noreferrer">bugs with Package Exports</a>, <a href="https://github.com/reactwg/react-native-new-architecture/discussions/85" target="_blank" rel="noopener noreferrer">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">1100 commits</a> from 66 contributors. Thank you for all your hard work!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">upgrade-helper</a>, or read the <a 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">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 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"><code>"exports"</code></a> field. When <a 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><a 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><a 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><a 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 anchorWithStickyNavbar_JmGV" 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?">​</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">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"><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"><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The headlining features of Package Exports are:</p>
<ul>
<li><strong>Package encapsulation</strong>: Only subpaths defined in <code>"exports"</code> can be imported from outside the package —&nbsp;giving packages control over their public API.</li>
<li><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">subpath patterns</a>) — allowing relocation of files while preserving the public API.</li>
<li><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 —&nbsp;replacing the <a href="https://github.com/defunctzombie/package-browser-field-spec" target="_blank" rel="noopener noreferrer"><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">Node.js Package Entry Points spec</a>.</p><p>Since these features overlap with existing React Native concepts (such as <a 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">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">final RFC</a>).</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p>Package Exports can be enabled today, in beta.</p>
<ul>
<li>Imports against packages that depend on Package Exports features (such as <a href="https://www.npmjs.com/package/firebase" target="_blank" rel="noopener noreferrer"><strong>Firebase</strong></a> and <a href="https://www.npmjs.com/search?q=%40storybook" target="_blank" rel="noopener noreferrer"><strong>Storybook</strong></a>) should now work as designed.</li>
<li>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">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">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 anchorWithStickyNavbar_JmGV" 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)">​</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"><strong>metro.config.js</strong></a> file via the <a href="https://metrobundler.dev/docs/configuration/#unstable_enablepackageexports-experimental" target="_blank" rel="noopener noreferrer"><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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Metro exposes two further resolver options which configure how conditional exports behave:</p>
<ul>
<li><a href="https://metrobundler.dev/docs/configuration/#unstable_conditionnames-experimental" target="_blank" rel="noopener noreferrer"><code>unstable_conditionNames</code></a> —&nbsp;The set of <a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions" target="_blank" rel="noopener noreferrer">condition names</a> to assert when resolving conditional exports. By default, we match <code>['require', 'import', 'react-native']</code>.</li>
<li><a href="https://metrobundler.dev/docs/configuration/#unstable_conditionsbyplatform-experimental" target="_blank" rel="noopener noreferrer"><code>unstable_conditionsByPlatform</code></a> —&nbsp;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">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"><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"><code>moduleResolution: 'bundler'</code></a> and <a href="https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports" target="_blank" rel="noopener noreferrer"><code>resolvePackageJsonImports: false</code></a> within your project's <code>tsconfig.json</code>.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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>
<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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li><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>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>
<p>Enable <code>resolver.unstable_enablePackageExports</code> in <code>metro.config.js</code>.</p>
</li>
<li>
<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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Compare!</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ol></div></div></details>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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) —&nbsp;and a matched subpath target will be used directly.</p>
<ul>
<li>Metro will not expand <a href="https://metrobundler.dev/docs/configuration/#sourceexts" target="_blank" rel="noopener noreferrer"><code>sourceExts</code></a> against the import specifier.</li>
<li>Metro will not resolve <a 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"><strong>breaking changes</strong></a> in the Metro docs.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 anchorWithStickyNavbar_JmGV" 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)">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</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> —&nbsp;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><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><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"><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 anchorWithStickyNavbar_JmGV" 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">​</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">RFC</a>).</p>
<blockquote>
<p><a href="https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions" target="_blank" rel="noopener noreferrer">Community Conditions Definitions —&nbsp;<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>
</blockquote>
<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">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> —&nbsp;removing this ambiguity.</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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 href="https://reactnative.dev/docs/platform#select"><code>Platform.select()</code></a> API instead.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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-b62424d06a1453e3a8002adb33b296f0.png" width="2364" height="722" class="img_SS3x"></p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">@SimenB</a>, <a href="https://github.com/tido64" target="_blank" rel="noopener noreferrer">@tido64</a>, <a href="https://github.com/byCedric" target="_blank" rel="noopener noreferrer">@byCedric</a>, <a href="https://github.com/thymikee" target="_blank" rel="noopener noreferrer">@thymikee</a>.</p>
<p>Huge thanks to <a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer">@motiz88</a> and <a href="https://github.com/robhogan" target="_blank" rel="noopener noreferrer">@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 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 anchorWithStickyNavbar_JmGV" 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">​</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">RFC#508</a> and <a href="https://github.com/reactwg/react-native-new-architecture/discussions/105" target="_blank" rel="noopener noreferrer">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 anchorWithStickyNavbar_JmGV" 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">​</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">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">on this GitHub issue</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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 anchorWithStickyNavbar_JmGV" 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">​</a></h2>
<p><em>This section contains a brief timeline of the events. All times are GMT/UTC +0</em></p>
<ul>
<li>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">0.71-RC0 is released</a>.</li>
<li>Nov 4th - 6:20 PM: <a href="https://github.com/facebook/react-native/issues/35204" target="_blank" rel="noopener noreferrer">First report of build issue is opened</a>.</li>
<li>Nov 4th - 7:45 PM: <a href="https://github.com/facebook/react-native/issues/35204#issuecomment-1304090948" target="_blank" rel="noopener noreferrer">Issue is identified by community</a>.</li>
<li>Nov 4th - 9:39 PM: <a href="https://github.com/facebook/react-native/issues/35204#issuecomment-1304281740" target="_blank" rel="noopener noreferrer">Workarounds are communicated, Expo </a>deploys fix to all their users.</li>
<li>Nov 5th - 03:04 AM: <a href="https://github.com/facebook/react-native/issues/35210" target="_blank" rel="noopener noreferrer">New issue is open to communicate status and workarounds</a>.</li>
<li>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">Ticket to SonaType</a> asking for removal of the artifacts is open.</li>
<li>Nov 6th - 04:40 PM: <a href="https://twitter.com/reactnative/status/1589296764678705155" target="_blank" rel="noopener noreferrer">First tweet</a> from @reactnative with ack + link to issue.</li>
<li>Nov 6th - 07:05 PM: Decision to patch React Native versions back to 0.63.</li>
<li>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">0.63.5</a>.</li>
<li>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">fully removed</a>.</li>
<li>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">incident is closed</a>.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</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 anchorWithStickyNavbar_JmGV" 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">​</a></h3>
<p>As visualized in the <a href="https://rn-versions.github.io/" target="_blank" rel="noopener noreferrer">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">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">deprecating older versions of React Native on npm</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" 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">​</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">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">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">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 anchorWithStickyNavbar_JmGV" 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">​</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>
        <item>
            <title><![CDATA[React Native 0.71: TypeScript by Default, Flexbox Gap, and more...]]></title>
            <link>https://reactnative.dev/blog/2023/01/12/version-071</link>
            <guid>https://reactnative.dev/blog/2023/01/12/version-071</guid>
            <pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we’re releasing React Native version 0.71! This is a feature-packed release including:]]></description>
            <content:encoded><![CDATA[<p>Today we’re releasing React Native version 0.71! This is a feature-packed release including:</p>
<ul>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#typescript-by-default">TypeScript by default</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#simplifying-layouts-with-flexbox-gap">Simplifying layouts with Flexbox Gap</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#web-inspired-props-for-accessibility-styles-and-events">Web-inspired props for accessibility, styles, and events</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#restoring-proptypes">Restoring PropTypes</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#developer-experience-improvements">Developer Experience Improvements</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/12/version-071#new-architecture">New Architecture Updates</a></li>
</ul>
<p>In this post we’ll cover some of the highlights of 0.71.</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>For a full list of changes, check out <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v071" target="_blank" rel="noopener noreferrer">CHANGELOG.md</a>.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="typescript-by-default">TypeScript by default<a href="https://reactnative.dev/blog/2023/01/12/version-071#typescript-by-default" class="hash-link" aria-label="Direct link to TypeScript by default" title="Direct link to TypeScript by default">​</a></h2>
<p>In this release, we’re investing in the TypeScript experience of React Native.</p>
<p>Starting with 0.71, when you create a new React Native app via the React Native CLI you'll get a TypeScript app by default. The new project is already set up with a <code>tsconfig.json</code> so out of the box your IDE will help you write typed code right away.</p>
<p>We’re also offering built-in, more accurate TypeScript declarations directly from the <code>react-native</code> package. This means you won’t need <code>@types/react-native</code> any longer, and the types will be updated in lockstep with React Native releases.</p>
<p>Finally, our documentation has been updated to feature TypeScript for all examples.</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>After upgrading to React Native 0.71, we recommend removing <code>@types/react-native</code> from your package.json <code>devDependencies</code>.</p></div></div>
<p>For more details on this change, including migration steps and how this affects Flow users, check out our previous post <a href="https://reactnative.dev/blog/2023/01/03/typescript-first" target="_blank" rel="noopener noreferrer">First-class Support for TypeScript</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="simplifying-layouts-with-flexbox-gap">Simplifying layouts with Flexbox gap<a href="https://reactnative.dev/blog/2023/01/12/version-071#simplifying-layouts-with-flexbox-gap" class="hash-link" aria-label="Direct link to Simplifying layouts with Flexbox gap" title="Direct link to Simplifying layouts with Flexbox gap">​</a></h2>
<p>With React Native you can flexibly layout components on different screen sizes using Flexbox. Browsers have supported the Flexbox properties <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gap" target="_blank" rel="noopener noreferrer">gap</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/row-gap" target="_blank" rel="noopener noreferrer">rowGap</a>, and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap" target="_blank" rel="noopener noreferrer">columnGap</a>, which allow you to specify the amount of space between all items in a Flexbox.</p>
<p>These properties have been long requested in React Native, and 0.71 adds initial support for gaps defined using pixel values. In future versions, we will add support for more values, such as percentages.</p>
<p>To see why this is useful, imagine trying to build a responsive layout with variably sized cards, 10px apart from each other, hugging the edges of the parent container. Trying to accomplish this layout with child margins can be tricky.</p>
<p>The following shows a layout where we start by giving each child <code>margin: 10</code> style:</p>
<p><img decoding="async" loading="lazy" alt="Two diagrams. On the left it shows a skeleton of an app with three boxes that have margin around them cause the boxes to have margin around all sides. On the right, the same diagram is shown highlighted to demonstrate the margin on all sides." src="https://reactnative.dev/assets/images/FlexboxGapBefore-1f7eddd7d1d7b84cc7c0e1c5a53c8144.png" width="679" height="201" class="img_SS3x"></p>
<p>Margins are applied uniformly to the edges of all children and don’t collapse under Flexbox, giving us spacing at the exterior of the cards, and double the space on the interior compared to what we wanted. We can get around this by applying non-uniform margins, using negative margins on the parent, halving our intended spacing, etc, but it can be made much easier.</p>
<p>With flex gap, this layout can be achieved by setting <code>gap: 10</code> on the container for a 10 pixel gap between the interior of the cards:</p>
<p><img decoding="async" loading="lazy" alt="Two diagrams. On the left it shows a skeleton of an app with three boxes that have margin only on the inner sides and not the outer sides of the boxes due to the Flexbox gap property. On the right, the same diagram is shown highlighted to demonstrate the margin only on the inner sides." src="https://reactnative.dev/assets/images/FlexboxGapAfter-4dd42d529a3e531d81da25361f8975ed.png" width="679" height="201" class="img_SS3x"></p>
<p>For more information on Flexbox gaps, see <a href="https://css-tricks.com/minding-the-gap/#aa-flexbox-gaps" target="_blank" rel="noopener noreferrer">this blogpost from CSS Tricks</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="web-inspired-props-for-accessibility-styles-and-events">Web-inspired props for accessibility, styles, and events<a href="https://reactnative.dev/blog/2023/01/12/version-071#web-inspired-props-for-accessibility-styles-and-events" class="hash-link" aria-label="Direct link to Web-inspired props for accessibility, styles, and events" title="Direct link to Web-inspired props for accessibility, styles, and events">​</a></h2>
<p>This release includes a number of new props inspired by web standards to align React Native’s APIs across many platforms. These new props are purely additive so there are no expected migrations or change of behavior for equivalent accessibility, behavior, or style props.</p>
<p>For any new prop alias introduced, if there is an existing prop with a different name and both are specified, the new alias prop value will take precedence. For example, this release adds a <code>src</code> prop alias for <code>source</code> on the Image component to align with the <code>src</code> prop on web. If both <code>src</code> and <code>source</code> are provided, the new <code>src</code> prop will be used.</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 background on aligning React Native to web standards, check out this <a href="https://github.com/necolas/discussions-and-proposals/blob/reduce-fragmentation/proposals/0000-reduce-fragmentation.md" target="_blank" rel="noopener noreferrer">proposal</a> and <a href="https://github.com/react-native-community/discussions-and-proposals/pull/496" target="_blank" rel="noopener noreferrer">related discussion</a>.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="accessibility">Accessibility<a href="https://reactnative.dev/blog/2023/01/12/version-071#accessibility" class="hash-link" aria-label="Direct link to Accessibility" title="Direct link to Accessibility">​</a></h4>
<p>We introduced ARIA props as alias to existing React Native accessibility props.</p>
<p>These props now exist on all core components of React Native:<code>aria-label</code>, <code>aria-labelledby</code>,<code>aria-modal</code>, <code>id</code>, <code>aria-busy</code>, <code>aria-checked</code>, <code>aria-disabled</code>, <code>aria-expanded</code>, <code>aria-selected</code>, <code>aria-valuemax</code>, <code>aria-valuemin</code>, <code>aria-valuenow</code>, and <code>aria-valuetext</code>.</p>
<p>We also introduced equivalent web behavior for: <code>aria-hidden</code>, <code>aria-live</code>, <code>role</code>, and <code>tabIndex</code>.</p>
<p>See this <a href="https://github.com/facebook/react-native/issues/34424" target="_blank" rel="noopener noreferrer">issue</a> for more details.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="component-specific-behavior">Component-Specific Behavior<a href="https://reactnative.dev/blog/2023/01/12/version-071#component-specific-behavior" class="hash-link" aria-label="Direct link to Component-Specific Behavior" title="Direct link to Component-Specific Behavior">​</a></h4>
<p>There were also props introduced to align prop names with equivalent DOM prop names for core components.</p>
<ul>
<li><strong>Image</strong>: <code>alt</code>, <code>tintColor</code>, <code>crossOrigin</code>, <code>height</code>, <code>referrerPolicy</code>, <code>src</code>, <code>srcSet</code>, and <code>width</code>.</li>
<li><strong>TextInput</strong>: <code>autoComplete</code>, <code>enterKeyHint</code>, <code>inputMode</code>, <code>readOnly</code>, and <code>rows</code>.</li>
</ul>
<p>See this <a href="https://github.com/facebook/react-native/issues/34424" target="_blank" rel="noopener noreferrer">issue</a> for more details.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="styles">Styles<a href="https://reactnative.dev/blog/2023/01/12/version-071#styles" class="hash-link" aria-label="Direct link to Styles" title="Direct link to Styles">​</a></h4>
<p>To align with certain CSS styles, there have been feature extensions for the following styles:</p>
<ul>
<li><a href="https://reactnative.dev/docs/layout-props#aspectratio" target="_blank" rel="noopener noreferrer"><code>aspectRatio</code></a> now supports string values</li>
<li><a href="https://reactnative.dev/docs/text-style-props#fontvariant" target="_blank" rel="noopener noreferrer"><code>fontVariant</code></a> now supports space-separated string values</li>
<li><a href="https://reactnative.dev/docs/text-style-props#fontWeight" target="_blank" rel="noopener noreferrer"><code>fontWeight</code></a> now supports number values</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/transform" target="_blank" rel="noopener noreferrer"><code>transform</code></a> now supports string values</li>
</ul>
<p>The following aliases have been added to shadow existing React Native styles:</p>
<ul>
<li><a href="https://reactnative.dev/docs/image#objectfit" target="_blank" rel="noopener noreferrer"><code>objectFit</code></a></li>
<li><a href="https://reactnative.dev/docs/view-style-props#pointerevents" target="_blank" rel="noopener noreferrer"><code>pointerEvents</code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/user-select" target="_blank" rel="noopener noreferrer"><code>userSelect</code></a></li>
<li><a href="https://reactnative.dev/docs/text-style-props#verticalalign-android" target="_blank" rel="noopener noreferrer"><code>verticalAlign</code></a></li>
</ul>
<p>See this <a href="https://github.com/facebook/react-native/issues/34425" target="_blank" rel="noopener noreferrer">issue</a> for more details.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="events">Events<a href="https://reactnative.dev/blog/2023/01/12/version-071#events" class="hash-link" aria-label="Direct link to Events" title="Direct link to Events">​</a></h4>
<p>Finally, we also added an opt-in implementation of <a href="https://w3c.github.io/pointerevents" target="_blank" rel="noopener noreferrer">PointerEvents</a></p>
<p>Once enabled, the following handlers on <code>View</code> will support hover:</p>
<ul>
<li><code>onPointerOver</code>, <code>onPointerOut</code></li>
<li><code>onPointerEnter</code>, <code>onPointerLeave</code></li>
</ul>
<p>These events are also implemented in <code>Pressability</code> for new opt-in support for hover.</p>
<p>To enable these features, set the following flags to true:</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">ReactNativeFeatureFlags</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/ReactNative/ReactNativeFeatureFlags'</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">// enable the JS-side of the w3c PointerEvent implementation</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">ReactNativeFeatureFlags</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">shouldEmitW3CPointerEvents</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 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 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" 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">// enable hover events in Pressibility to be backed by the PointerEvent implementation.</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">// shouldEmitW3CPointerEvents should also be true</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">ReactNativeFeatureFlags</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">shouldPressibilityUseW3CPointerEventsForHover</span><span class="token plain"> </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 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 boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></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>You’ll also need to enable React feature flags on your <a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#android-specific" target="_blank" rel="noopener noreferrer">Android</a> and <a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#ios-specific" target="_blank" rel="noopener noreferrer">iOS</a> native setup.</p></div></div>
<p>Check out our dedicated <a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native" target="_blank" rel="noopener noreferrer">PointerEvents post</a> to learn more.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="restoring-proptypes">Restoring PropTypes<a href="https://reactnative.dev/blog/2023/01/12/version-071#restoring-proptypes" class="hash-link" aria-label="Direct link to Restoring PropTypes" title="Direct link to Restoring PropTypes">​</a></h2>
<p>React Native’s prop types, such as <code>ViewPropTypes</code> and <code>Text.propTypes</code>, were deprecated in 0.66 and accessing them would output deprecation warnings. When they were removed in 0.68, many developers began experiencing errors when upgrading to the latest version of React Native.</p>
<p>After some investigation, we realized that a couple issues prevented the community from taking action on the deprecation warnings. First, the deprecation warning was not always actionable which caused people to ignore them (<a href="https://github.com/facebook/react-native/pull/34650" target="_blank" rel="noopener noreferrer">issue one</a>, <a href="https://github.com/react-native-community/cli/pull/1699" target="_blank" rel="noopener noreferrer">issue two</a>). Second, the deprecation warnings were being <a href="https://github.com/facebook/react-native/commit/fa2842d" target="_blank" rel="noopener noreferrer">incorrectly filtered</a> by <code>LogBox.ignoreLogs</code>. Both of these have now been fixed, but we want to give people more time to upgrade the deprecated call sites.</p>
<p>So in this release we are adding back React Native’s propTypes so that it is easier for people to upgrade and migrate their code to avoid using them. The <code>deprecated-react-native-prop-types</code> package has also been updated for all of the props in 0.71. In the future, we plan to proceed with the deprecation and remove prop types once again. We expect that when we revisit the removal, the community will experience significantly fewer issues.</p>
<div class="theme-admonition theme-admonition-caution 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>caution</div><div class="admonitionContent_pbrs"><p>As part of this change, we are also removing the console filtering from <code>LogBox.ignoreLog</code>. This means logs that you have previously filtered with <code>Logbox.ignoreLog</code> will start appearing again in the console when you upgrade.</p><p>This is expected, because it allows logs such as deprecation warnings to be found and fixed.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="developer-experience-improvements">Developer Experience Improvements<a href="https://reactnative.dev/blog/2023/01/12/version-071#developer-experience-improvements" class="hash-link" aria-label="Direct link to Developer Experience Improvements" title="Direct link to Developer Experience Improvements">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="react-devtools">React DevTools<a href="https://reactnative.dev/blog/2023/01/12/version-071#react-devtools" class="hash-link" aria-label="Direct link to React DevTools" title="Direct link to React DevTools">​</a></h3>
<p>In this release, we've brought two popular React DevTools features on web to React Native.</p>
<p>"Click to inspect" is the option in the top left corner of React Dev Tools that allows you to click on an item in the app to inspect it in Dev Tools, similar to the Chrome element inspector.</p>
<p>Component highlighting will highlight the element you select in DevTools in the app so you can see which React components line up with which on-screen elements.</p>
<p>Here are both features in action:</p>
<p><img decoding="async" loading="lazy" alt="Video of the behavior described above in action. On the left is a React Native app running in an iPhone simulator. On the right is the React DevTools. In both workflows, clicking on an item in the DevTools highlights the corresponding components in the app." src="https://reactnative.dev/assets/images/ElementInspecting-e5670278b9a3562ca492742318251950.gif" width="946" height="608" class="img_SS3x"></p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="hermes">Hermes<a href="https://reactnative.dev/blog/2023/01/12/version-071#hermes" class="hash-link" aria-label="Direct link to Hermes" title="Direct link to Hermes">​</a></h3>
<p>In React Native 0.70, we made <a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default" target="_blank" rel="noopener noreferrer">Hermes the default engine for React Native</a>.</p>
<p>In React Native 0.71, we’re upgrading Hermes with a few notable improvements:</p>
<ul>
<li><strong>Improve source maps</strong>: By loading source maps over the network with Metro we’ve restored the ability to use source maps in recent versions of Chrome Dev Tools outside of Flipper.</li>
<li><strong>Improve <code>JSON.parse</code> performance</strong>: This version includes a performance optimization that improves the performance of <code>JSON.parse</code> up to 30%.</li>
<li><strong>Add support for <code>.at()</code></strong>: Hermes now <a href="https://github.com/facebook/hermes/issues/823" target="_blank" rel="noopener noreferrer">supports</a><code>.at()</code> for <code>String</code>, <code>TypedArray</code>, and <code>Array</code>.</li>
</ul>
<p>For a full list of changes see <a href="https://github.com/reactwg/react-native-releases/discussions/41#discussioncomment-4089256" target="_blank" rel="noopener noreferrer">the Road to 71 issue</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="new-architecture">New Architecture<a href="https://reactnative.dev/blog/2023/01/12/version-071#new-architecture" class="hash-link" aria-label="Direct link to New Architecture" title="Direct link to New Architecture">​</a></h3>
<p>This release brings many improvements to the experimental New Architecture experience based on user feedback and reports we collected so far.</p>
<ul>
<li><strong>Reduced build times</strong>: The new distribution model uses Maven Central, which allows us to greatly reduce the build time on Android, resolves many build problems on Windows, and provides a more seamless experience with the New Architecture. <a href="https://github.com/reactwg/react-native-new-architecture/discussions/105" target="_blank" rel="noopener noreferrer">Read more here</a>.</li>
<li><strong>Write less C++ code</strong>: You can now enable the New Architecture without having to add any C++ code in your app and the CLI app template has been cleaned of all the C++ code and the CMake files. <a href="https://github.com/reactwg/react-native-new-architecture/discussions/101" target="_blank" rel="noopener noreferrer">Read more here</a>.</li>
<li><strong>Better encapsulation of iOS app setup</strong>: On iOS, we followed a similar approach to Android and encapsulated most of the logic to set up the New Architecture in the <code>RCTAppDelegate</code> class, which will simplify upgrades in the future with fewer manual breaking changes.</li>
<li><strong>Better dependency management on iOS</strong>: For library maintainers, we've added a new <code>install_module_dependencies</code> function to call inside your package <code>podspec</code> which will install all the required dependencies for the New Architecture.</li>
<li><strong>Bug fixes and better IDE support</strong>: we fixed several bugs and issues (like <a href="https://github.com/reactwg/react-native-new-architecture/discussions/102" target="_blank" rel="noopener noreferrer">better IDE support for Android</a>) that were reported by our users in the <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer">New Architecture Working Group</a>.</li>
</ul>
<p>As a reminder, the New Architecture is still an experimental API experience as we iterate on changes to make adoption easier. Please try out the new simplified steps in the <a href="https://reactnative.dev/docs/new-architecture-intro" target="_blank" rel="noopener noreferrer">New Architecture documentation</a> and post any feedback you have to the <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer">New Architecture Working Group</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="other-notable-fixes">Other Notable Fixes<a href="https://reactnative.dev/blog/2023/01/12/version-071#other-notable-fixes" class="hash-link" aria-label="Direct link to Other Notable Fixes" title="Direct link to Other Notable Fixes">​</a></h3>
<ul>
<li><strong>Better stack frame collapsing</strong>: We've <a href="https://github.com/react-native-community/cli/pull/1699" target="_blank" rel="noopener noreferrer">updated the list of internal frames</a> for React Native so LogBox will show your code more often rather than internal React Native frames, helping you to debug issues faster.</li>
<li><strong>Build time improvements:</strong> We migrated assets to Maven Central for prefabs to improve build times (both iOS and Android) for Hermes in both the current and new architectures.</li>
<li><strong>Android template improvements</strong>: The Android template was heavily cleaned and now fully relies on the React Native Gradle Plugin. You can find the configuration instructions directly inside the template or in the <a href="https://reactnative.dev/docs/react-native-gradle-plugin" target="_blank" rel="noopener noreferrer">new dedicated page on the website</a>.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="breaking-changes">Breaking changes<a href="https://reactnative.dev/blog/2023/01/12/version-071#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes">​</a></h2>
<ul>
<li><strong>Changes to Console Logging:</strong> <code>LogBox.ignoreLog</code> no longer filters console logs. This means you will start seeing logs in the console that you have silenced in LogBox. See <a href="https://github.com/facebook/react-native/pull/34476#issuecomment-1240667794" target="_blank" rel="noopener noreferrer">this comment</a> for more details.</li>
<li><strong>Removed AsyncStorage and MaskedViewIOS</strong>: These components have been deprecated since version <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#deprecated-8" target="_blank" rel="noopener noreferrer">0.59</a>, so it’s time we remove them entirely. For alternatives, please check <a href="https://reactnative.directory/" target="_blank" rel="noopener noreferrer">React Native Directory</a> for community packages that cover those use cases.</li>
<li><strong>JSCRuntime moved to react-jsc:</strong> react-jsi is now split into react-jsc and react-jsi. If you use JSCRuntime, you will need to add react-jsc as a dependency (<a href="https://github.com/facebook/react-native/commit/6b129d81ed8cab301775d2a04971e255df9290de" target="_blank" rel="noopener noreferrer">facebook/react-native@6b129d8</a>).</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2023/01/12/version-071#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements">​</a></h2>
<p>This release is possible thanks to the work of 70+ contributors adding over 1000 commits.</p>
<p>We especially want to thank those who contributed to these major React Native projects:</p>
<ul>
<li><strong>Flexbox Gap Support</strong>: <a href="https://github.com/intergalacticspacehighway" target="_blank" rel="noopener noreferrer">@intergalacticspacehighway</a> and <a href="https://github.com/jacobp100" target="_blank" rel="noopener noreferrer">@jacobp100</a>.</li>
<li><strong>Web-inspired props</strong>: <a href="https://github.com/gabrieldonadel" target="_blank" rel="noopener noreferrer">@gabrieldonadel</a> <a href="https://github.com/dakshbhardwaj" target="_blank" rel="noopener noreferrer">@dakshbhardwaj</a> <a href="https://github.com/dhruvtailor7" target="_blank" rel="noopener noreferrer">@dhruvtailor7</a> <a href="https://github.com/ankit-tailor" target="_blank" rel="noopener noreferrer">@ankit-tailor</a> <a href="https://github.com/madhav23bansal" target="_blank" rel="noopener noreferrer">@madhav23bansal</a>.</li>
<li><strong>Codegen Improvements</strong>: <a href="https://github.com/AntoineDoubovetzky" target="_blank" rel="noopener noreferrer">@AntoineDoubovetzky</a>, <a href="https://github.com/MaeIg" target="_blank" rel="noopener noreferrer">@MaeIg</a>, <a href="https://github.com/Marcoo09" target="_blank" rel="noopener noreferrer">@Marcoo09</a>, <a href="https://github.com/Naturalclar" target="_blank" rel="noopener noreferrer">@Naturalclar</a>, <a href="https://github.com/Pranav-yadav" target="_blank" rel="noopener noreferrer">@Pranav-yadav</a>, <a href="https://github.com/ZihanChen-MSFT" target="_blank" rel="noopener noreferrer">@ZihanChen-MSFT</a>, <a href="https://github.com/dakshbhardwaj" target="_blank" rel="noopener noreferrer">@dakshbhardwaj</a>, <a href="https://github.com/dhruvtailor7" target="_blank" rel="noopener noreferrer">@dhruvtailor7</a>, <a href="https://github.com/gabrieldonadel" target="_blank" rel="noopener noreferrer">@gabrieldonadel</a>, <a href="https://github.com/harshsiri110" target="_blank" rel="noopener noreferrer">@harshsiri110</a>, <a href="https://github.com/ken0nek" target="_blank" rel="noopener noreferrer">@ken0nek</a>, <a href="https://github.com/kylemacabasco" target="_blank" rel="noopener noreferrer">@kylemacabasco</a>, <a href="https://github.com/matiassalles99" target="_blank" rel="noopener noreferrer">@matiassalles99</a>, <a href="https://github.com/mdaj06" target="_blank" rel="noopener noreferrer">@mdaj06</a>, <a href="https://github.com/mohitcharkha" target="_blank" rel="noopener noreferrer">@mohitcharkha</a>, <a href="https://github.com/tarunrajput" target="_blank" rel="noopener noreferrer">@tarunrajput</a>, <a href="https://github.com/vinayharwani13" target="_blank" rel="noopener noreferrer">@vinayharwani13</a>, <a href="https://github.com/youedd" target="_blank" rel="noopener noreferrer">@youedd</a>, <a href="https://github.com/byCedric" target="_blank" rel="noopener noreferrer">@byCedric</a>.</li>
</ul>
<p>Finally, thanks to <a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer">@cortinico</a>, <a href="https://github.com/kelset" target="_blank" rel="noopener noreferrer">@kelset</a>, <a href="https://github.com/dmytrorykun" target="_blank" rel="noopener noreferrer">@dmytrorykun</a>, <a href="https://github.com/cipolleschi" target="_blank" rel="noopener noreferrer">@cipolleschi</a>, and <a href="https://github.com/titozzz" target="_blank" rel="noopener noreferrer">@titozzz</a> for cutting this release!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="try-out-0710-now">Try out 0.71.0 now!<a href="https://reactnative.dev/blog/2023/01/12/version-071#try-out-0710-now" class="hash-link" aria-label="Direct link to Try out 0.71.0 now!" title="Direct link to Try out 0.71.0 now!">​</a></h2>
<p>For React Native CLI users, see the <a href="https://reactnative.dev/docs/upgrading" target="_blank" rel="noopener noreferrer">upgrade documentation</a> for how to update your existing project, or create a new project with <code>npx react-native init MyProject</code>.</p>
<p>React Native version 0.71 will be supported in Expo SDK version 48.</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.71 is now the latest stable version of React Native and 0.68.x versions are now unsupported. For more information see <a href="https://github.com/reactwg/react-native-releases#releases-support-policy" target="_blank" rel="noopener noreferrer">React Native’s support policy</a>.</p></div></div>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[First-class Support for TypeScript]]></title>
            <link>https://reactnative.dev/blog/2023/01/03/typescript-first</link>
            <guid>https://reactnative.dev/blog/2023/01/03/typescript-first</guid>
            <pubDate>Tue, 03 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[With the release of 0.71, React Native is investing in the TypeScript experience with the following changes:]]></description>
            <content:encoded><![CDATA[<p>With the release of 0.71, React Native is investing in the TypeScript experience with the following changes:</p>
<ul>
<li><a href="https://reactnative.dev/blog/2023/01/03/typescript-first#new-app-template-is-typescript-by-default">New app template is TypeScript by default</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/03/typescript-first#declarations-shipped-with-react-native">TypeScript declarations shipped with React Native</a></li>
<li><a href="https://reactnative.dev/blog/2023/01/03/typescript-first#documentation-is-typescript-first">React Native documentation is TypeScript First</a></li>
</ul>
<p>In this post we’ll cover what these changes mean for you as a TypeScript or Flow user.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-app-template-is-typescript-by-default">New App Template is TypeScript By Default<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#new-app-template-is-typescript-by-default" class="hash-link" aria-label="Direct link to New App Template is TypeScript By Default" title="Direct link to New App Template is TypeScript By Default">​</a></h2>
<p>Starting with 0.71, when you create a new React Native app via the React Native CLI you'll get a TypeScript app by default!</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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 plain">npx react-native init My71App </span><span class="token parameter variable" style="color:#cb4b16">--version</span><span class="token plain"> </span><span class="token number" style="color:#5a9bcf">0.71</span><span class="token plain">.0</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="Screenshot of an iPhone simulator running a new app generated by React Native CLI. Alongside the simulator is a screenshot of Visual Studio Code editor opened to &amp;quot;App.tsx&amp;quot; to illustrate it is running a TypeScript file." src="https://reactnative.dev/assets/images/typescript-first-new-app-426f2230271f337ea5c67af38630f7b1.png" width="3036" height="1688" class="img_SS3x"></p>
<p>The starting point of a newly generated app will be <code>App.tsx</code> instead of <code>App.js</code> – fully TypeScript typed. The new project is already set up with a <code>tsconfig.json</code> so out of the box your IDE will help you write typed code right away!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="declarations-shipped-with-react-native">Declarations Shipped with React Native<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#declarations-shipped-with-react-native" class="hash-link" aria-label="Direct link to Declarations Shipped with React Native" title="Direct link to Declarations Shipped with React Native">​</a></h2>
<p>0.71 is the first release with built-in TypeScript (TS) declarations.</p>
<p>Prior, TypeScript declarations for React Native were provided by <a href="https://www.npmjs.com/package/@types/react-native" target="_blank" rel="noopener noreferrer"><code>@types/react-native</code></a> hosted in the <a href="https://github.com/DefinitelyTyped/DefinitelyTyped" target="_blank" rel="noopener noreferrer">DefinitelyTyped</a> repository. The decision to co-locate TypeScript types with React Native source was for improved correctness and maintenance.</p>
<p><code>@types/react-native</code> only provides types for stable releases. This means if you ever wanted to develop with a pre-release version of React Native in TypeScript, you’d have to use types from an older release which may be inaccurate. Releasing <code>@types/react-native</code> is also error-prone. The releases lag React Native releases, and the process involves manually inspecting for type changes made to React Native’s public API and updating the TS declaration to match.</p>
<p>With TS types co-located with React Native source, there is more visibility and ownership of TS types. Our team is actively working on tools to maintain alignment between Flow and TS.</p>
<p>This change also removes a dependency for React Native users to manage. When upgrading to 0.71 or above, you can remove <code>@types/react-native</code> as a dependency. <a href="https://github.com/facebook/react-native/blob/main/template/tsconfig.json" target="_blank" rel="noopener noreferrer">Refer to the new app template on how to set up TypeScript support.</a></p>
<p>We plan to deprecate <code>@types/react-native</code> for versions 0.73 and onward. Concretely this means:</p>
<ul>
<li><code>@types/react-native</code> tracking React Native versions 0.71 and 0.72 will be released. They will be identical to the types in React Native on the relevant release branches.</li>
<li>For React Native 0.73 and onward, TS types will only be available from React Native.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="how-to-migrate">How to Migrate<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#how-to-migrate" class="hash-link" aria-label="Direct link to How to Migrate" title="Direct link to How to Migrate">​</a></h3>
<p>Please migrate to the new co-located types at your earliest convenience. Here are more details on migrating based on your needs.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="app-maintainer">App Maintainer<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#app-maintainer" class="hash-link" aria-label="Direct link to App Maintainer" title="Direct link to App Maintainer">​</a></h4>
<p>Once you upgrade to React Native &gt;= 0.71, you can remove the <code>@types/react-native</code> from your <code>devDependency</code>.</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 have warnings because a library you use references <code>@types/react-native</code> as a <code>peerDependency</code>, file an issue or open a PR for that library to use <a href="https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependenciesmeta" target="_blank" rel="noopener noreferrer">optional peerDependencies</a> and ignore the warning for now.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="library-maintainer">Library Maintainer<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#library-maintainer" class="hash-link" aria-label="Direct link to Library Maintainer" title="Direct link to Library Maintainer">​</a></h4>
<p>Libraries that target versions of React Native below 0.71 may use a <code>peerDependency</code> of <code>@types/react-native</code> to typecheck against the apps version of typings. This dependency should be marked as optional in <a href="https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependenciesmeta" target="_blank" rel="noopener noreferrer"><code>peerDependenciesMeta</code></a> so that the typings are not required for users without TypeScript or for 0.71 users where typings are built-in.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="maintainer-of-typescript-declarations-that-depend-on-typesreact-native">Maintainer of TypeScript declarations that depend on <code>@types/react-native</code><a href="https://reactnative.dev/blog/2023/01/03/typescript-first#maintainer-of-typescript-declarations-that-depend-on-typesreact-native" class="hash-link" aria-label="Direct link to maintainer-of-typescript-declarations-that-depend-on-typesreact-native" title="Direct link to maintainer-of-typescript-declarations-that-depend-on-typesreact-native">​</a></h4>
<p>Check out the <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">breaking changes introduced with 0.71</a> to see if you’re ready to migrate.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="what-if-i-use-flow">What if I use Flow?<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#what-if-i-use-flow" class="hash-link" aria-label="Direct link to What if I use Flow?" title="Direct link to What if I use Flow?">​</a></h3>
<p>Flow users can continue to typecheck applications targeting 0.71+ but configuration logic for it is no longer included out-of-the box in the template.</p>
<p>Flow users have previously upgraded React Native’s Flow types by merging in the <code>.flowconfig</code> from the new app template and manually updating <code>flow-bin</code>. The new app template no longer has a <code>.flowconfig</code>, but <a href="https://github.com/facebook/react-native/blob/main/.flowconfig" target="_blank" rel="noopener noreferrer">one is still present in the React Native repository</a> that can be used as a basis for your app.</p>
<p>If you need to start a new React Native app in Flow, you can reference the <a href="https://github.com/facebook/react-native/tree/0.70-stable/template" target="_blank" rel="noopener noreferrer">new app template from 0.70</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="what-if-i-find-a-bug-in-the-typescript-declaration">What if I find a bug in the TypeScript declaration?<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#what-if-i-find-a-bug-in-the-typescript-declaration" class="hash-link" aria-label="Direct link to What if I find a bug in the TypeScript declaration?" title="Direct link to What if I find a bug in the TypeScript declaration?">​</a></h3>
<p>Regardless of whether you’re using built-in TS types or <code>@types/react-native</code>, if you find a bug please submit a PR to both <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer">React Native</a> and <a href="https://github.com/DefinitelyTyped/DefinitelyTyped" target="_blank" rel="noopener noreferrer">DefinitelyTyped</a> repositories. If you don’t know how to fix it, please file a GitHub issue in the React Native repository and mention <a href="https://github.com/lunaleaps" target="_blank" rel="noopener noreferrer">@lunaleaps</a> on the issue.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="documentation-is-typescript-first">Documentation is TypeScript First<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#documentation-is-typescript-first" class="hash-link" aria-label="Direct link to Documentation is TypeScript First" title="Direct link to Documentation is TypeScript First">​</a></h2>
<p>To ensure a consistent TypeScript experience, we have made several updates to the React Native documentation to reflect TypeScript as the new default language.</p>
<p>Code examples now allow inline TypeScript and over 170 interactive code examples have been updated to pass linting, formatting, and type-checking in the new template. Most examples are valid as both TypeScript and JavaScript. Where they are incompatible, you can view the example in either language.</p>
<p>If you spot a mistake or you have an improvement, remember that the website is also open source and we would love to see your PRs!</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="thank-you-to-the-react-native-typescript-community">Thank you to the React Native TypeScript community!<a href="https://reactnative.dev/blog/2023/01/03/typescript-first#thank-you-to-the-react-native-typescript-community" class="hash-link" aria-label="Direct link to Thank you to the React Native TypeScript community!" title="Direct link to Thank you to the React Native TypeScript community!">​</a></h2>
<p>In closing, we want to recognize all the work done over the years by the community to ensure that TypeScript is usable by React Native developers.</p>
<p>We want to thank all the <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-native/index.d.ts#L3" target="_blank" rel="noopener noreferrer">contributors</a> that have been maintaining <code>@types/react-native</code> since <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commit/efce0c25ec532a4651859f10eda49e97a5716a42" target="_blank" rel="noopener noreferrer">2015</a>! We see the effort and care you all have put into making sure React Native users have the best experience.</p>
<p>Thank you to <a href="https://github.com/acoates" target="_blank" rel="noopener noreferrer">@acoates</a>, <a href="https://github.com/eps1lon" target="_blank" rel="noopener noreferrer">@eps1lon</a>, <a href="https://github.com/kelset" target="_blank" rel="noopener noreferrer">@kelset</a>, <a href="https://github.com/tido64" target="_blank" rel="noopener noreferrer">@tido64</a>, <a href="https://github.com/Titozzz" target="_blank" rel="noopener noreferrer">@Titozzz</a>, and <a href="https://github.com/ZihanChen-MSFT" target="_blank" rel="noopener noreferrer">@ZihanChen-MSFT</a> for your help consulting, questioning, communicating and reviewing changes to move the TypeScript types to React Native.</p>
<p>Similarly, we want to thank the <a href="https://github.com/react-native-community/react-native-template-typescript/graphs/contributors" target="_blank" rel="noopener noreferrer">maintainers of <code>react-native-template-typescript</code></a> for supporting the TypeScript experience for new app development in React Native since day one.</p>
<p>We look forward to collaborating more directly in the React Native repository and continue improving the React Native developer experience!</p>]]></content:encoded>
            <category>typescript</category>
            <category>engineering</category>
        </item>
        <item>
            <title><![CDATA[Pointer Events in React Native]]></title>
            <link>https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native</link>
            <guid>https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native</guid>
            <pubDate>Tue, 13 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are sharing an experimental cross-platform pointer API for React Native. We’ll go over motivations, how it works, and its benefits to React Native users. There are instructions on how to enable and we’re excited to hear your feedback!]]></description>
            <content:encoded><![CDATA[<p>Today we are sharing an experimental cross-platform pointer API for React Native. We’ll go over motivations, how it works, and its benefits to React Native users. There are instructions on how to enable and we’re excited to hear your feedback!</p>
<p>It’s been over a year since we shared <a href="https://reactnative.dev/blog/2021/08/26/many-platform-vision" target="_blank" rel="noopener noreferrer">our many platform vision</a> on the wins of building beyond mobile and how it sets a higher bar for all platforms. During this time, we've increased our investments in React Native for VR, Desktop, and Web. With differences in hardware and interactions on these platforms, it raised the question of how React Native should holistically handle input.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="going-beyond-touch">Going Beyond Touch<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#going-beyond-touch" class="hash-link" aria-label="Direct link to Going Beyond Touch" title="Direct link to Going Beyond Touch">​</a></h3>
<p>Desktop and VR have historically relied on mouse and keyboard input where mobile is primarily touch. That narrative has evolved with touch-screen laptops and growing needs to support interactions via keyboard and pen on mobile. All of which the React Native touch event system is not equipped to handle.</p>
<p>As a result, users of out-of-tree platforms fork React Native and/or create custom native components and modules to support critical features like hover detection or left-click. This divergence leads to prop redundancy with event handlers serving similar purposes but for different platforms. It adds complexity to the framework and makes code-sharing between platforms tedious. For these reasons, the team was motivated to provide a cross-platform pointer API.</p>
<p>React Native aims to provide robust and expressive APIs to build for many platforms while maintaining characteristic platform experiences. Designing such an API is challenging yet thankfully there is prior art in the pointer space that React Native can leverage.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="looking-to-web">Looking to Web<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#looking-to-web" class="hash-link" aria-label="Direct link to Looking to Web" title="Direct link to Looking to Web">​</a></h3>
<p>Web is a platform with similar challenges in scaling to many platforms while also considering future-proof design. The World Wide Web consortium (W3C) is tasked with setting standards and proposals to build a Web that is interoperable amongst different platforms and browsers.</p>
<p>Most relevant for our needs, the W3C has defined behavior for an abstract form of input, called a pointer. The <a href="https://www.w3.org/TR/pointerevents3/" target="_blank" rel="noopener noreferrer">Pointer Events</a> specification builds on mouse events and aims to provide a single set of events and interfaces for cross-device pointer input while still allowing for device-specific handling when necessary.</p>
<p>Following the Pointer Events specification provides React Native users many benefits. Beyond addressing the problems mentioned earlier, it raises the capabilities of platforms that haven’t historically had to consider multi-input type interactions. Think attaching a bluetooth mouse to your Android phone or the Apple pencil supporting hover on the iPad M2.</p>
<p>Being spec-complaint also provides opportunity for knowledge sharing between Web and React Native. Education of Web expectations around Pointer Events can doubly serve React Native developers. However, we also recognize that React Native requirements are different than web and our approach to specifications is best effort with well documented deviations so expectations are clear. There is related work of aligning certain Web standards to <a href="https://github.com/react-native-community/discussions-and-proposals/pull/496" target="_blank" rel="noopener noreferrer">reduce API fragmentation</a> in accessibility and performance APIs.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="porting-web-platform-tests">Porting Web Platform Tests<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#porting-web-platform-tests" class="hash-link" aria-label="Direct link to Porting Web Platform Tests" title="Direct link to Porting Web Platform Tests">​</a></h2>
<p>While the Pointer Events specification provides interfaces and behavior descriptions of the API, we found it wasn’t specific enough for us to confidently make changes and point to the specification as verification. However, web browsers use another mechanism to ensure compliance and interoperability — the <a href="https://web-platform-tests.org/" target="_blank" rel="noopener noreferrer">Web Platform Tests</a>!</p>
<p>The Web Platform Tests are written to work against the browser’s imperative DOM APIs — unsupported by React Native as it uses its own view primitives. This means that we aren’t able to code-share the tests with browsers and instead have an analogous testing API for React Native that makes it easier to port those Web Platform Tests.</p>
<p>We implemented a new manual testing framework which we are now using for verifying our implementations through RNTester. These tests are tentatively named the RNTester Platform Tests and are still fairly basic. Our implementation provides an API to construct test cases as components themselves which are rendered and where the results are reported solely through the UI.</p>
<p><img decoding="async" loading="lazy" alt="GIF showing a side by side comparison of the &amp;quot;Pointer Events hoverable pointer attributes test&amp;quot; running in React Native (iOS) on the left, and Web (the original implementation) on the right." src="https://reactnative.dev/assets/images/pointer-events-wpt-demo-f524c11634eb4f9b5a907c5730f27321.gif" width="960" height="540" class="img_SS3x"></p>
<p>These tests will continue to be helpful as we further the completeness of our Pointer Events implementation. These tests will also scale to test Pointer Events implementations on platforms beyond Android and iOS. As the number of tests in our suite increase we will be looking to automate the running of these tests so that we are better equipped to catch regressions in our implementations.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="how-it-works">How it works<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works">​</a></h2>
<p>Much of our Pointer Events implementation builds off existing infrastructure for dispatching touch events. On Android and iOS we leverage the relevant MotionEvent and UITouch events. The general flow of event dispatching is illustrated below.</p>
<p><img decoding="async" loading="lazy" alt="Diagram of code flow for interpreting Android and iOS UI input events into Pointer Events. On Android, input handlers &amp;quot;onTouchEvent&amp;quot; and &amp;quot;onHoverEvent&amp;quot; fire &amp;quot;MotionEvents&amp;quot; that are interpreted into Pointer Events and through JSI are dispatched to the React renderer. iOS takes a similar path with input handlers &amp;quot;touchesBegan&amp;quot;, &amp;quot;touchesMoved&amp;quot;, &amp;quot;touchesEnded&amp;quot;, and &amp;quot;hovering&amp;quot; interpreting &amp;quot;UITouch&amp;quot; and &amp;quot;UIEvent&amp;quot; into Pointer Events." src="https://reactnative.dev/assets/images/pointer-events-code-flow-5f598d1362801753c43a1936f08a509d.png" width="1980" height="985" class="img_SS3x"></p>
<p>Using Android as an example, the general approach to leveraging platform events are:</p>
<ol>
<li>Iterate through all pointers of the <code>MotionEvent</code> and do a depth-first search to determine the target React view of each pointer and its ancestral path.</li>
<li>Map the category of <code>MotionEvent</code> to the relevant pointer events. There is a 1-to-many relationship between <code>MotionEvent</code> and <code>PointerEvent</code>. In the illustration of their relationship, dotted lines indicate fired events if the pointing device does not support hover.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="A diagram illustrating the relationship of types of Android MotionEvents into Pointer Events fired. Some pointer events are conditionally fired if pointing device does not support hover. &amp;quot;ACTION_DOWN&amp;quot; and &amp;quot;ACTION_POINTER_DOWN&amp;quot; fire pointerdown and conditionally fire pointerenter, pointerover. &amp;quot;ACTION_MOVE&amp;quot; and &amp;quot;ACTION_HOVER_MOVE&amp;quot; fire pointerover, pointermove, pointerout, pointerup. &amp;quot;ACTION_UP&amp;quot; and &amp;quot;ACTION_POINTER_UP&amp;quot; fire pointerup and conditionally fire pointerout, pointerleave." src="https://reactnative.dev/assets/images/pointer-events-motionevent-relationship-892a4a19c30a230188599cc520c57804.png" width="1506" height="700" class="img_SS3x"></p>
<ol>
<li>Build the <code>PointerEvent</code> interface with platform details from the <code>MotionEvent</code> and cached state of previous interactions. (Ex. <a href="https://w3c.github.io/pointerevents/#the-button-property" target="_blank" rel="noopener noreferrer">the <code>button</code> property</a>)</li>
<li>Dispatch the pointer events from Android to React Native’s <a href="https://github.com/facebook/react-native/blob/main/ReactCommon/react/renderer/core/EventQueueProcessor.cpp#L20" target="_blank" rel="noopener noreferrer">core event queue</a> and leverage JSI to call the <a href="https://github.com/facebook/react/blob/main/packages/react-native-renderer/src/ReactFabricEventEmitter.js#L83" target="_blank" rel="noopener noreferrer"><code>dispatchEvent</code></a> method in <code>react-native-renderer</code> which iterates through the React tree for the bubble and capture phase of the event.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="implementation-progress">Implementation Progress<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#implementation-progress" class="hash-link" aria-label="Direct link to Implementation Progress" title="Direct link to Implementation Progress">​</a></h2>
<p>When it comes to our current progress of implementing the Pointer Events specification we’ve focused on a solid baseline implementation of the most common events that handle things like pressing, hovering, and moving.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="events">Events<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#events" class="hash-link" aria-label="Direct link to Events" title="Direct link to Events">​</a></h3>
<table><thead><tr><th>Implemented</th><th>Work in Progress</th><th>Yet to be Implemented</th></tr></thead><tbody><tr><td>onPointerOver</td><td>onPointerCancel</td><td>onClick</td></tr><tr><td>onPointerEnter</td><td></td><td>onContextMenu</td></tr><tr><td>onPointerDown</td><td></td><td>onGotPointerCapture</td></tr><tr><td>onPointerMove</td><td></td><td>onLostPointerCapture</td></tr><tr><td>onPointerUp</td><td></td><td>onPointerRawUpdate</td></tr><tr><td>onPointerOut</td><td></td><td></td></tr><tr><td>onPointerLeave</td><td></td><td></td></tr></tbody></table>
<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>onPointerCancel has been hooked up to the native platform’s "cancel" event but this does not necessarily correspond to when the web platform expects them to fire.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="event-properties">Event Properties<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#event-properties" class="hash-link" aria-label="Direct link to Event Properties" title="Direct link to Event Properties">​</a></h3>
<p>For each of the events mentioned above we’ve also implemented the majority of the properties expected in the PointerEvent object — though in React Native these are exposed through the <code>event.nativeEvent</code> property. You can find an enumeration of all the implemented properties in the <a href="https://github.com/facebook/react-native/blob/59ee57352738f030b41589a450209e51e44bbb06/Libraries/Types/CoreEventTypes.js#L175" target="_blank" rel="noopener noreferrer">event object’s Flowtype interface definition</a>. One notable exception to being completely implemented is the <code>relatedTarget</code> property as exposing a native view reference in this ad-hoc manner isn’t trivial.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="future-work-and-exploration">Future Work and Exploration<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#future-work-and-exploration" class="hash-link" aria-label="Direct link to Future Work and Exploration" title="Direct link to Future Work and Exploration">​</a></h2>
<p>In addition to the events above there are also some other APIs related to Pointer Events. In the future, we plan to be implement these APIs as a part of this effort. These APIs include:</p>
<ul>
<li>Pointer Capture API<!-- -->
<ul>
<li>Includes the imperative API exposed on element references including <code>setPointerCapture()</code>, <code>releasePointerCapture()</code>, and <code>hasPointerCapture()</code>.</li>
</ul>
</li>
<li><code>touch-action</code> style property<!-- -->
<ul>
<li>The web uses this CSS property to declaratively negotiate gestures between the browser and a website’s own event handling code. In React Native this could be used for negotiating the event handling between a View’s pointer event handlers and a parent ScrollView.</li>
</ul>
</li>
<li><code>click</code>, <code>contextmenu</code>, <code>auxclick</code>
<ul>
<li><code>click</code> is an abstract definition of interaction that may be triggered through accessibility paradigms or other characteristic platform interactions.</li>
</ul>
</li>
</ul>
<p>Another benefit of the native Pointer Events implementation is that it will allow us to revisit and improve various forms of gesture handling currently limited only to touch events and handled in JavaScript by the Responder, Pressability, and PanResponder APIs.</p>
<p>Furthermore, we are continuing to explore including an implementation of the <code>EventTarget</code> interface for React Native host components (i.e. <code>add</code>/<code>removeEventListener</code>) which we believe will make possible more user-land abstractions for handling pointer interactions.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="trying-it-out">Trying it Out<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#trying-it-out" class="hash-link" aria-label="Direct link to Trying it Out" title="Direct link to Trying it Out">​</a></h2>
<p>Our Pointer Events implementation is still experimental but we’re interested in getting feedback from the community on what we’ve shared. If you are interested in trying this API you’ll need to enable a couple feature flags:</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="enable-feature-flags">Enable Feature Flags<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#enable-feature-flags" class="hash-link" aria-label="Direct link to Enable Feature Flags" title="Direct link to Enable Feature Flags">​</a></h3>
<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>Pointer Events are only implemented for the <a href="https://reactnative.dev/docs/the-new-architecture/use-app-template" target="_blank" rel="noopener noreferrer">New Architecture (Fabric)</a> and are only available for React Native 0.71+ which at the time of writing is a release candidate.</p></div></div>
<p>In your entry JavaScript file (index.js in the default React Native app template) you’ll need to enable the <code>shouldEmitW3CPointerEvents</code> flag for Pointer Events and <code>shouldPressibilityUseW3CPointerEventsForHover</code> to use Pointer Events in <code>Pressability</code>.</p>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">ReactNativeFeatureFlags</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/ReactNative/ReactNativeFeatureFlags'</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">// enable the JS-side of the w3c PointerEvent implementation</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">ReactNativeFeatureFlags</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">shouldEmitW3CPointerEvents</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 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 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" 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">// enable hover events in Pressibility to be backed by the PointerEvent implementation</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">ReactNativeFeatureFlags</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method-variable function-variable method function property-access" style="color:#79b6f2">shouldPressibilityUseW3CPointerEventsForHover</span><span class="token plain"> </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 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 boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#657b83">;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="ios-specific">iOS-specific<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#ios-specific" class="hash-link" aria-label="Direct link to iOS-specific" title="Direct link to iOS-specific">​</a></h3>
<p>In order to ensure that the pointer events are sent from the native iOS renderer you’ll need to flip a native feature flag in your native app’s initialization code (typically <code>AppDelegate.mm</code>).</p>
<div class="language-objc codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">React</span><span class="token macro property expression operator" style="color:#fc929e">/</span><span class="token macro property expression" style="color:#2aa198">RCTConstants</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"></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" 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 function" style="color:#79b6f2">RCTSetDispatchW3CPointerEvents</span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">YES</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 punctuation" style="color:#657b83">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Note that to ensure that the Pointer Event implementation can distinguish between mouse and touch pointers on iOS you need to add <a href="https://developer.apple.com/documentation/bundleresources/information_property_list/uiapplicationsupportsindirectinputevents" target="_blank" rel="noopener noreferrer"><code>UIApplicationSupportsIndirectInputEvents</code></a> to your Xcode project’s <code>info.plist</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="android-specific">Android-specific<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#android-specific" class="hash-link" aria-label="Direct link to Android-specific" title="Direct link to Android-specific">​</a></h3>
<p>Similarly to iOS Android has a feature flag that you’ll need to enable in your app’s initialization — typically your <code>onCreate</code> for your root React activity or surface.</p>
<div class="language-java codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">import</span><span class="token plain"> </span><span class="token import namespace" style="opacity:0.7">com</span><span class="token import namespace punctuation" style="opacity:0.7;color:#657b83">.</span><span class="token import namespace" style="opacity:0.7">facebook</span><span class="token import namespace punctuation" style="opacity:0.7;color:#657b83">.</span><span class="token import namespace" style="opacity:0.7">react</span><span class="token import namespace punctuation" style="opacity:0.7;color:#657b83">.</span><span class="token import namespace" style="opacity:0.7">config</span><span class="token import namespace punctuation" style="opacity:0.7;color:#657b83">.</span><span class="token import class-name" style="color:#fac863">ReactFeatureFlags</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">//... somewhere in initialization</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">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">onCreate</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 class-name" style="color:#fac863">ReactFeatureFlags</span><span class="token punctuation" style="color:#657b83">.</span><span class="token plain">dispatchPointerEvents </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><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="javascript">JavaScript<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#javascript" class="hash-link" aria-label="Direct link to JavaScript" title="Direct link to JavaScript">​</a></h3>
<div class="language-js codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">function</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">onPointerOver</span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">event</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 plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">    </span><span class="token string" style="color:#8dc891">'Over blue box offset: '</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">    event</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">nativeEvent</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">offsetX</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">    event</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">nativeEvent</span><span class="token punctuation" style="color:#657b83">.</span><span class="token property-access">offsetY</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 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">// ... in some component</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">View</span><span class="token plain"></span><br></span><span class="token-line" style="color:#FFFFFF"><span class="token plain">  onPointerOver</span><span class="token operator" style="color:#fc929e">=</span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">onPointerOver</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">height</span><span class="token operator" style="color:#fc929e">:</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 plain"> </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">100</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#2aa198">backgroundColor</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'blue'</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><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="feedback-welcome">Feedback Welcome<a href="https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#feedback-welcome" class="hash-link" aria-label="Direct link to Feedback Welcome" title="Direct link to Feedback Welcome">​</a></h2>
<p>Today Pointer Events are used by our VR platform and powering the Oculus Store, but we're also looking for early community feedback on both our approach and what we have for an implementation so far. We are excited to share our further progress with you and if you have questions or thoughts around this work, join us on the <a href="https://github.com/react-native-community/discussions-and-proposals/discussions/557" target="_blank" rel="noopener noreferrer">dedicated discussion on Pointer Events</a>.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native Core Contributor Summit 2022]]></title>
            <link>https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022</link>
            <guid>https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022</guid>
            <pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[After years of pandemic and online-only events, we really felt it was time to bring the Core Contributors of React Native together!]]></description>
            <content:encoded><![CDATA[<p>After years of pandemic and online-only events, we really felt it was time to bring the Core Contributors of React Native together!</p>
<p>That’s why at the beginning of September, we gathered some of the active core contributors of React Native, library maintainers, and the Meta’s React Native and Metro teams to the <strong>Core Contributor Summit 2022</strong>. <a href="https://www.callstack.com/" target="_blank" rel="noopener noreferrer">Callstack</a> hosted the Summit in their HQ in Wrocław, Poland, as a part of the <a href="https://www.react-native.eu/" target="_blank" rel="noopener noreferrer">React Native EU</a> conference happening at the same time.</p>
<p>Together with the React Native core team, we devised a series of <strong>workshops</strong> in which the attendees could participate. The topics were:</p>
<ul>
<li>​​React Native Codegen &amp; TypeScript Support</li>
<li>​​React Native New Architecture Library Migration</li>
<li>​​React Native Monorepo</li>
<li>Metro Web and Ecosystem Alignment</li>
<li>Metro Simplified Release Workflow</li>
</ul>
<p>We were impressed by the amount of knowledge-sharing and collaboration over those two days. In this blog post, we’d like to give you a sneak peek of the results of this gathering.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="react-native-codegen--typescript-support">React Native Codegen &amp; TypeScript Support<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#react-native-codegen--typescript-support" class="hash-link" aria-label="Direct link to React Native Codegen &amp; TypeScript Support" title="Direct link to React Native Codegen &amp; TypeScript Support">​</a></h3>
<p><a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/codegen.md" target="_blank" rel="noopener noreferrer">React Native’s Codegen</a> is a fundamental part of the New Architecture of React Native. Supporting and improving it is among our top priorities for the future of React Native. For instance, earlier this year, we added support for generic code starting from TypeScript specs rather than Flow.</p>
<p>In this session, we took the opportunity to onboard new contributors to Codegen, by explaining its core concept and describing how it works. We then focused on two major areas:</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="1-supporting-new-types-that-are-currently-unsupported-by-codegen-one-of-the-highly-requested-ones-was-the-string-union-types-in-typescript">1. Supporting <strong>new types</strong> that are currently unsupported by Codegen. One of the highly requested ones was the <a href="https://github.com/Titozzz/react-native/tree/codegen-string-union" target="_blank" rel="noopener noreferrer">string union types in TypeScript</a>.<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#1-supporting-new-types-that-are-currently-unsupported-by-codegen-one-of-the-highly-requested-ones-was-the-string-union-types-in-typescript" class="hash-link" aria-label="Direct link to 1-supporting-new-types-that-are-currently-unsupported-by-codegen-one-of-the-highly-requested-ones-was-the-string-union-types-in-typescript" title="Direct link to 1-supporting-new-types-that-are-currently-unsupported-by-codegen-one-of-the-highly-requested-ones-was-the-string-union-types-in-typescript">​</a></h4>
<p>A team of a few people moved into a meeting room to tackle this task. They encountered and overcame some difficulties along the way, like how to run unit tests for Codegen. They spent quite some time understanding the code execution flow before starting to deal with the code. After some hours of collaborative work, they ended up with the first prototype that was able to recognize string unions. This experience was extremely useful in discussing design patterns and the ideal architecture we may want in the future.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="2-improving-auto-linking-for-ios-which-was-missing-a-use-case">2. Improving <strong><a href="https://github.com/facebook/react-native/pull/34580" target="_blank" rel="noopener noreferrer">auto-linking for iOS</a></strong>, which was missing a use case.<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#2-improving-auto-linking-for-ios-which-was-missing-a-use-case" class="hash-link" aria-label="Direct link to 2-improving-auto-linking-for-ios-which-was-missing-a-use-case" title="Direct link to 2-improving-auto-linking-for-ios-which-was-missing-a-use-case">​</a></h4>
<p>Specifically, auto-linking could not work well in scenarios where libraries and the app were living together in a monorepo. Android already supported this use case but it was missing for iOS.</p>
<p>Working with the contributors on Codegen helped us realize that it wasn’t trivial to work in its codebase. For example, adding the support for one type required to copy-and-paste the same code in four different places: modules with specs written in Flow, modules with specs written in TypeScript, components with specs written in Flow, and components with specs written in TypeScript.</p>
<p>This realization pushed us to create an <a href="https://github.com/facebook/react-native/issues/34872" target="_blank" rel="noopener noreferrer">umbrella task</a> to reach out for help to the community in order to improve the status of the codebase toward a more maintainable one.</p>
<p>The participation was outstanding: we managed to quickly assign the first <strong>40 tasks in 5 days</strong>. At the end of October, the community completed <strong>47 tasks</strong> and many others are ready and waiting to be merged.</p>
<p>This initiative also contributed to the <a href="https://hacktoberfest.com/" target="_blank" rel="noopener noreferrer">Hacktoberfest</a> for all the people who contributed to these improvements!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="react-native-new-architecture-library-migration">​​React Native New Architecture Library Migration<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#react-native-new-architecture-library-migration" class="hash-link" aria-label="Direct link to ​​React Native New Architecture Library Migration" title="Direct link to ​​React Native New Architecture Library Migration">​</a></h3>
<p>The hot topic in the React Native space is the New Architecture. Having <strong>libraries</strong> that support the New Architecture is a crucial point in the <a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture">migration for the whole ecosystem</a>. Therefore, we want to support library maintainers in migrating to the New Architectures.</p>
<p>Initially, this session started as a brainstorming, where the core contributors had the opportunity to ask the React Native team all the questions they had related to the New Architecture. This in-person feedback loop was crucial for both the core contributors to bring clarity and for the React Native team to collect feedback. Some of the shared feedback and concerns will end up being implemented in React Native 0.71.</p>
<p>We then moved to practically migrating as many libraries to the new architecture as possible. During this session, we kicked off the migration process for several community packages, such as <code>react-native-document-picker</code>, <code>react-native-store-review</code>, and <code>react-native-orientation</code>.</p>
<p>As a reminder, if you’re also migrating a library and need support in doing so, please reach out to our <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">New Architecture Working Group</a> on GitHub.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="react-native-monorepo">​​React Native Monorepo<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#react-native-monorepo" class="hash-link" aria-label="Direct link to ​​React Native Monorepo" title="Direct link to ​​React Native Monorepo">​</a></h3>
<p>Releasing a new version of React Native is not trivial today. React Native is one of the most downloaded packages on NPM, and we want to make sure that our release process is smooth.</p>
<p>That’s why we want to refactor the <code>react-native</code> repository and implement the <strong>Monorepo RFC</strong> (<a href="https://github.com/react-native-community/discussions-and-proposals/pull/480" target="_blank" rel="noopener noreferrer">#480</a>).</p>
<p>In this session, we initially brainstormed and collected opinions from every contributor, as it’s crucial that we evolve our repository to reduce the breaking changes for our downstream dependencies.</p>
<p>We then started working on two fronts. First, we had to expand our Continuous Integration infrastructure to support our monorepo, adding <a href="https://verdaccio.org/" target="_blank" rel="noopener noreferrer">Verdaccio</a> to our testing infrastructure. We then started renaming &amp; adding scopes to several of our packages, resulting in 6 distinct contributions.</p>
<p>You can track the status of this effort under this <a href="https://github.com/facebook/react-native/issues/34692" target="_blank" rel="noopener noreferrer">umbrella issue</a> and we hope to share more on this effort in the near future.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="metro-web-and-ecosystem-alignment">Metro Web and Ecosystem Alignment<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#metro-web-and-ecosystem-alignment" class="hash-link" aria-label="Direct link to Metro Web and Ecosystem Alignment" title="Direct link to Metro Web and Ecosystem Alignment">​</a></h3>
<p><a href="https://github.com/facebook/metro" target="_blank" rel="noopener noreferrer">Metro</a>, our JavaScript Bundler, is a foundational and integrated part of the React Native development experience and we want to make sure it works with the latest standards in the JS ecosystem.</p>
<p>The focus of this session was to discuss improving Metro's feature set to work better for web use cases and with the npm and bundler ecosystem. Two major areas of discussion:</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="1-adopting-the-exports-package-entry-points-specification">1. Adopting the <code>"exports"</code> (<a href="https://nodejs.org/api/packages.html#package-entry-points" target="_blank" rel="noopener noreferrer">package entry points</a>) specification<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#1-adopting-the-exports-package-entry-points-specification" class="hash-link" aria-label="Direct link to 1-adopting-the-exports-package-entry-points-specification" title="Direct link to 1-adopting-the-exports-package-entry-points-specification">​</a></h4>
<p>From the <a href="https://nodejs.org/api/packages.html#package-entry-points" target="_blank" rel="noopener noreferrer">Node.js documentation</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>The <a href="https://nodejs.org/api/packages.html#exports" target="_blank" rel="noopener noreferrer">"exports"</a> provides a modern alternative to <a href="https://nodejs.org/api/packages.html#main" target="_blank" rel="noopener noreferrer">"main"</a> allowing multiple entry points to be defined, conditional entry resolution support between environments, and <strong>preventing any other entry points besides those defined in <a href="https://nodejs.org/api/packages.html#exports" target="_blank" rel="noopener noreferrer">"exports"</a></strong>. This encapsulation allows module authors to define the public interface for their package clearly.</p></div></div>
<p>Adopting the <code>"exports"</code> specification has a lot of potential. In this session, we debated on how to handle <a href="https://reactnative.dev/docs/platform-specific-code#platform-specific-extensions">Platform Specific Code</a> with <code>"exports"</code>. Considering many factors, we came up with a fairly non-breaking rollout plan for <code>"exports"</code>, by adding a <code>"strict"</code> and <code>"non-strict"</code> mode to Metro resolver. We discussed how leveraging <a href="https://github.com/callstack/react-native-builder-bob" target="_blank" rel="noopener noreferrer">builder-bob</a> would help library creators adopt the strict mode without friction.</p>
<p>This discussion resulted in:</p>
<ol>
<li>An <a href="https://github.com/react-native-community/discussions-and-proposals/pull/534" target="_blank" rel="noopener noreferrer">RFC</a> for Metro on how package exports would work with React Native.</li>
<li>An <a href="https://github.com/nodejs/node/pull/45367" target="_blank" rel="noopener noreferrer">RFC</a> for Node.js to include “react-native” as a Community Condition.</li>
</ol>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="2-web-and-bundler-ecosystem">2. Web and bundler ecosystem<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#2-web-and-bundler-ecosystem" class="hash-link" aria-label="Direct link to 2. Web and bundler ecosystem" title="Direct link to 2. Web and bundler ecosystem">​</a></h4>
<p>The Metro team shared progress from their partnership with Expo and the intent to continue this working model for upcoming bundle splitting and tree-shaking support. We touched again on ES module support and considered potential future features such as Yarn PnP and output optimization on the web. We discussed how Metro’s core shares logic and data structures with Jest and opportunities for more reuse.</p>
<p>Developers surfaced insightful use cases for bundle splitting and interoperability with third-party tooling. This led us to discuss potential extension points in Metro and improving current documentation.</p>
<p>This discussion provided us with good grounding for the next day's session on simplifying the release workflow.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="metro-simplified-release-workflow">Metro Simplified Release Workflow<a href="https://reactnative.dev/blog/2022/11/22/react-native-core-contributor-summit-2022#metro-simplified-release-workflow" class="hash-link" aria-label="Direct link to Metro Simplified Release Workflow" title="Direct link to Metro Simplified Release Workflow">​</a></h3>
<p>As mentioned, releasing React Native is not trivial.</p>
<p>Things get harder as we need to release React Native, the React Native CLI, and Metro. Those tools are connected to each other as React Native and the CLI both depend on Metro. This creates some friction when any of the packages releases a new version.</p>
<p>Currently, we manage this through direct communication and synchronized releases, but there is space for improvement.</p>
<p>In this session, we reconsidered the <strong>dependencies</strong> between React Native, Metro, and the CLI. We uncovered how some design decisions during the <a href="https://github.com/react-native-community/discussions-and-proposals/issues/6" target="_blank" rel="noopener noreferrer">“Lean Core” effort</a>, when we extracted the CLI from React Native, made these two projects codependent with some functionalities duplicated among efforts. The decisions back then made sense and allowed the CLI team to iterate faster than ever.</p>
<p>It was about time to revisit them and take the experience of both teams to figure out the way through. As a result, the Metro team will take over the <a href="https://github.com/react-native-community/cli/tree/main/packages/cli-plugin-metro" target="_blank" rel="noopener noreferrer"><code>@react-native-community/cli-plugin-metro</code></a> development, temporarily moving it back to the core of React Native, and then most likely to the Metro monorepo.</p>
<p><img decoding="async" loading="lazy" src="https://reactnative.dev/assets/images/core-contributor-summit-2022-fe0899624299a2b699322a43a20cb7a3.jpg" width="1865" height="1252" class="img_SS3x"></p>
<p>The biggest takeaway, apart from three hours of drawing dependencies between the packages on the whiteboard, was for the CLI and Metro team to exchange their issues, experiences, and plans, resulting in a better understanding of each other.</p>
<p>We wouldn’t be able to achieve this level of cooperation without actually meeting each other.</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>We want to say thank you again to <a href="https://www.callstack.com/" target="_blank" rel="noopener noreferrer">Callstack</a> for hosting us and to all the participants for joining us at the Core Contributor Summit 2022.</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">contribution guide</a> we have on our website. We hope to meet you in person as well in the future!</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[Announcing React Native 0.70]]></title>
            <link>https://reactnative.dev/blog/2022/09/05/version-070</link>
            <guid>https://reactnative.dev/blog/2022/09/05/version-070</guid>
            <pubDate>Mon, 05 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to release a new version of React Native, 0.70.0. This version comes with several improvements like a new unified configuration for Codegen, Hermes as default engine, and full CMake support for Android builds along with a refresh of the documentation for the New Architecture. Read on to learn more!]]></description>
            <content:encoded><![CDATA[<p>We are excited to release a new version of React Native, 0.70.0. This version comes with several improvements like a new unified configuration for Codegen, Hermes as default engine, and full CMake support for Android builds along with a refresh of the documentation for the New Architecture. Read on to learn more!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="sections">Sections<a href="https://reactnative.dev/blog/2022/09/05/version-070#sections" class="hash-link" aria-label="Direct link to Sections" title="Direct link to Sections">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#new-architectures-new-documentation">New Architecture’s New Documentation</a></li>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#hermes-as-default-engine">Hermes as default engine</a></li>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#a-new-unified-configuration-for-codegen">A new unified configuration for Codegen</a></li>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#android-auto-linking-for-new-architecture-libraries">Android Auto-linking for New Architecture libraries</a></li>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#full-cmake-support-for-android-builds">Full CMake support for Android builds</a></li>
<li><a href="https://reactnative.dev/blog/2022/09/05/version-070#highlights-of-070">Highlights of 0.70</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-architectures-new-documentation">New Architecture’s New Documentation<a href="https://reactnative.dev/blog/2022/09/05/version-070#new-architectures-new-documentation" class="hash-link" aria-label="Direct link to New Architecture’s New Documentation" title="Direct link to New Architecture’s New Documentation">​</a></h2>
<p>Over the last few months, we have been working to add more content to the <a href="https://reactnative.dev/architecture/landing-page">New Architecture</a> section of the documentation. In the new section you can find migration guides, examples and tutorials to get you up to speed.</p>
<p>Along with it, you can find new documents diving into <a href="https://reactnative.dev/docs/next/the-new-architecture/why" target="_blank" rel="noopener noreferrer">Why a New Architecture</a> and <a href="https://reactnative.dev/docs/next/the-new-architecture/pillars" target="_blank" rel="noopener noreferrer">the various parts of it</a>. We hope this helps you better understand the rationale behind the new APIs.</p>
<p>Any feedback is more than welcome, please let us know in the <a href="https://github.com/facebook/react-native-website" target="_blank" rel="noopener noreferrer">react-native-website</a> repository.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="hermes-as-default-engine">Hermes as default engine<a href="https://reactnative.dev/blog/2022/09/05/version-070#hermes-as-default-engine" class="hash-link" aria-label="Direct link to Hermes as default engine" title="Direct link to Hermes as default engine">​</a></h2>
<p>React Native 0.70 is the first version with Hermes, our in-house JS engine, enabled by default.</p>
<p>This is the result of collaborative effort between the Hermes team and the React Native team, alongside with the priceless contributions from the community. We worked to improve and fine tune Hermes to make it more performant and deliver highly requested features by the community.</p>
<p>You can read more about it in the <a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default" target="_blank" rel="noopener noreferrer">official announcement blogpost</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="a-new-unified-configuration-for-codegen">A new unified configuration for Codegen<a href="https://reactnative.dev/blog/2022/09/05/version-070#a-new-unified-configuration-for-codegen" class="hash-link" aria-label="Direct link to A new unified configuration for Codegen" title="Direct link to A new unified configuration for Codegen">​</a></h2>
<p>With 0.70, we introduced a unified way to define the Codegen specs for both iOS and Android. Previously, you had to put the Android configuration in a separate <code>build.gradle</code> file.</p>
<p>Now, you can define it directly in the package.json with:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#FFFFFF;--prism-background-color:#282C34"><div class="codeBlockContent_D5yF"><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">"codegenConfig"</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">"name"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"CustomAnimationView"</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">"type"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"components"</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">"jsSrcsDir"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"./src"</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 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">"javaPackageName"</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"com.custom.animation"</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 class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This improvement provides a more consistent experience for library maintainers in migrating their codebases to the New Architecture.</p>
<p>If you are a library maintainer, please make sure to let us know how the process is going for you in <a href="https://github.com/reactwg/react-native-new-architecture/discussions/6" target="_blank" rel="noopener noreferrer">this discussion</a> in the <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">React Native New Architecture working group</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="android-auto-linking-for-new-architecture-libraries">Android Auto-linking for New Architecture libraries<a href="https://reactnative.dev/blog/2022/09/05/version-070#android-auto-linking-for-new-architecture-libraries" class="hash-link" aria-label="Direct link to Android Auto-linking for New Architecture libraries" title="Direct link to Android Auto-linking for New Architecture libraries">​</a></h2>
<p>With 0.70, users on New Architecture are able to automatically link libraries without any additional configuration on their Android.mk or CMake files.</p>
<p>Autolinking is a crucial part of the React Native development experience. It allows you to include external libraries with a <code>yarn add</code> command, without dealing with CocoaPods or Gradle setups.</p>
<p>The New Architecture required us to adapt the auto-linking features to support libraries which are using the Codegen and exposing native code to app developers.</p>
<p>While Autolinking worked well for New Architecture libraries on iOS, the same was not true for Android. With 0.70 we closed this gap and you can now keep on including libraries with <code>yarn add</code> to your project: they will be linked correctly on any architecture.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="full-cmake-support-for-android-builds">Full CMake support for Android builds<a href="https://reactnative.dev/blog/2022/09/05/version-070#full-cmake-support-for-android-builds" class="hash-link" aria-label="Direct link to Full CMake support for Android builds" title="Direct link to Full CMake support for Android builds">​</a></h2>
<p>Starting from 0.70, users can now use CMake to configure their Native builds. While we don’t expect app users to directly write C++ code, you still need an entry point for the native compilation.</p>
<p>From now on you can use a <code>CMakeLists.txt</code> file instead of an <code>Android.mk</code> file for anything Android/Native related in your project.</p>
<p>This change benefits both app and library users on the New Architecture as:</p>
<ul>
<li>The CMake file created in your app is way smaller (<a href="https://github.com/facebook/react-native/blob/9923ac1b524ae959abdf50a28a3094198015f77e/packages/rn-tester/android/app/src/main/jni/CMakeLists.txt#L6-L11" target="_blank" rel="noopener noreferrer">3 lines of code</a> versus <a href="https://github.com/facebook/react-native/blob/main/template/android/app/src/main/jni/Android.mk?rgh-link-date=2022-07-20T18%3A29%3A07Z" target="_blank" rel="noopener noreferrer">50+ for Android.mk files</a>). This makes for an easier update experience between React Native versions in the future and less code to maintain on your end.</li>
<li>Codegen is now generating both <code>Android.mk</code> and <code>CMakeLists.txt</code>, so libraries should not worry about doing anything if they're using the default setup we provide for New Architecture libraries.</li>
<li>The Auto-linking mentioned above will work with both CMake and Android.mk files out of the box.</li>
<li>Despite apps being free to use either <code>Android.mk</code> or CMake files, the recommended solution in the future would be CMake files (due to better documentation, tooling and ecosystem around CMake).</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="highlights-of-070">Highlights of 0.70<a href="https://reactnative.dev/blog/2022/09/05/version-070#highlights-of-070" class="hash-link" aria-label="Direct link to Highlights of 0.70" title="Direct link to Highlights of 0.70">​</a></h2>
<p>As mentioned above, some of the more important improvements in this release are centered around the New Architecture experience. However, there have been other notable changes, including:</p>
<ul>
<li>Fix for Catalyst is live, set <code>mac_catalyst_enabled</code> to <code>true</code> in Podfile (see <a href="https://react-native-community.github.io/upgrade-helper/?from=0.69.1&amp;to=0.70.0-rc.0" target="_blank" rel="noopener noreferrer">upgrade-helper</a> diff for details).</li>
<li>Bumping metro to 0.72.0 which will enable the new React JSX Transform: <a href="https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html" target="_blank" rel="noopener noreferrer">reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html</a>.</li>
<li>Removing <code>reactnativeutilsjni</code> as it is built from the same sources as <code>reactnativejni</code> which results in ~220 KBs saved from every Android APK build. (<a href="https://github.com/facebook/react-native/pull/34339" target="_blank" rel="noopener noreferrer">https://github.com/facebook/react-native/pull/34339</a>).</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="breaking-changes">Breaking changes<a href="https://reactnative.dev/blog/2022/09/05/version-070#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes">​</a></h3>
<p>There have also been a few breaking changes:</p>
<ul>
<li>Removed jest/preprocessor from the react-native package (<a href="https://github.com/facebook/react-native/commit/0301cb285b2e85b48a397fe58d565196654d9754" target="_blank" rel="noopener noreferrer">0301cb285b</a> by <a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer">@motiz88</a>)</li>
<li>Remove nonstandard <code>Promise.prototype.done</code> (<a href="https://github.com/facebook/react-native/commit/018d5cf985497273dd700b56168cf1cf64f498d5" target="_blank" rel="noopener noreferrer">018d5cf985</a> by <a href="https://github.com/motiz88" target="_blank" rel="noopener noreferrer">@motiz88</a>)</li>
</ul>
<p>Please also note that the version of Metro has been bumped to 0.72, which comes <a href="https://github.com/facebook/metro/releases/tag/v0.72.0" target="_blank" rel="noopener noreferrer">with 5 breaking changes</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="upgrades">Upgrades<a href="https://reactnative.dev/blog/2022/09/05/version-070#upgrades" class="hash-link" aria-label="Direct link to Upgrades" title="Direct link to Upgrades">​</a></h3>
<p>And we upgraded some of our dependencies:</p>
<ul>
<li>Bump RN CLI to v9.0.0</li>
<li>Bump Android Gradle Plugin to 7.2.1</li>
<li>Bump Gradle to 7.5.1</li>
<li>Bump RCT-Folly to 2021-07-22</li>
<li>Bump Metro to 0.72</li>
<li>Bump SoLoader to 0.10.4</li>
</ul>
<p>You can check out the full list of changes <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">in the changelog</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2022/09/05/version-070#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements">​</a></h3>
<p>88 contributors with their 493 commits have helped to make this release possible - thanks everyone! We are also thankful to everyone else who gave their feedback to ensure this release would be as stable as possible.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Hermes as the Default]]></title>
            <link>https://reactnative.dev/blog/2022/07/08/hermes-as-the-default</link>
            <guid>https://reactnative.dev/blog/2022/07/08/hermes-as-the-default</guid>
            <pubDate>Fri, 08 Jul 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Last October, we announced that we had started work towards making Hermes the default engine for all React Native apps.]]></description>
            <content:encoded><![CDATA[<p>Last October, we <a href="https://reactnative.dev/blog/2021/10/26/toward-hermes-being-the-default">announced</a> that we had started work towards <strong>making</strong> <strong>Hermes the default engine for all React Native apps</strong>.</p>
<p>Hermes has provided a lot of value to React Native inside of Meta, and we believe the open-source community will benefit as well. Hermes is designed for resource constrained devices and optimizes for start up, app size, and memory consumption. One key difference between Hermes and other JS engines is its ability to compile JavaScript source code to bytecode ahead of time. This precompiled bytecode is bundled inside the binary, and saves the interpreter from having to perform this expensive step during app startup.</p>
<p>Since the announcement, a lot of work has gone into making Hermes better, and today, we are excited to share that <strong>React Native 0.70 will ship with Hermes as the default engine.</strong> This means that all new projects starting on v0.70 will have Hermes enabled by default. With the rollout coming up in July, we want to work closely with the community and make sure the transition is smooth and brings value to all users. This blogpost will go over what you can expect from the change, performance benchmarks, new features, and more. Note that you don’t need to wait for React Native 0.70 to start using Hermes - you can <strong>follow <a href="https://reactnative.dev/docs/hermes#enabling-hermes">these instructions</a> to enable Hermes on your existing React Native app</strong>.</p>
<p>Note that while Hermes will be enabled by default in new React Native projects, support for other engines will continue.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="benchmarking">Benchmarking<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#benchmarking" class="hash-link" aria-label="Direct link to Benchmarking" title="Direct link to Benchmarking">​</a></h2>
<p>We measured three different metrics important to app developers: TTI, binary size, and memory consumption. We used the React Native app <a href="https://github.com/mattermost/mattermost-mobile" target="_blank" rel="noopener noreferrer">Mattermost</a> for testing. We ran these experiments for both Android and iOS on high end hardware from 2020.</p>
<ul>
<li>TTI, or time to interactive, is the duration of time from the app being launched to the user being able to interact with it. For this benchmark, we define it as the time from pressing the app icon to the first screen being rendered. We also show screen recordings of starting up Mattermost.</li>
<li>The binary size was measured as APK size on android and IPA size on iOS.</li>
<li>The memory consumption data was collected by using the Mattermost app over the span of a couple minutes. The same actions were performed in the app on both engines.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="android-benchmarking-data">Android Benchmarking Data<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#android-benchmarking-data" class="hash-link" aria-label="Direct link to Android Benchmarking Data" title="Direct link to Android Benchmarking Data">​</a></h2>
<p>All the android tests were performed on a Samsung Galaxy S20.</p>
<figure><img src="https://reactnative.dev/blog/assets/hermes-default-android-data.png" alt="Android Benchmarking Data"></figure>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="tti-video">TTI Video<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#tti-video" class="hash-link" aria-label="Direct link to TTI Video" title="Direct link to TTI Video">​</a></h3>
<figure><img src="https://reactnative.dev/blog/assets/hermes-default-android-video.gif" alt="Android TTI Video"></figure>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="ios-benchmarking-data">iOS Benchmarking Data<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#ios-benchmarking-data" class="hash-link" aria-label="Direct link to iOS Benchmarking Data" title="Direct link to iOS Benchmarking Data">​</a></h2>
<p>All the iOS tests were performed on an iPhone 12 Pro.</p>
<figure><img src="https://reactnative.dev/blog/assets/hermes-default-ios-data.png" alt="iOS Benchmarking Data"></figure>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="tti-video-1">TTI Video<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#tti-video-1" class="hash-link" aria-label="Direct link to TTI Video" title="Direct link to TTI Video">​</a></h3>
<figure><img src="https://reactnative.dev/blog/assets/hermes-default-ios-video.gif" alt="iOS TTI Video"></figure>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="slowed-down-tti-video-to-better-show-the-difference-in-startup-time">Slowed Down TTI Video, to better show the difference in startup time.<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#slowed-down-tti-video-to-better-show-the-difference-in-startup-time" class="hash-link" aria-label="Direct link to Slowed Down TTI Video, to better show the difference in startup time." title="Direct link to Slowed Down TTI Video, to better show the difference in startup time.">​</a></h3>
<figure><img src="https://reactnative.dev/blog/assets/hermes-default-ios-slow-video.gif" alt="iOS Slowed Down TTI Video"></figure>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="react-nativehermes-integration">React Native/Hermes Integration<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#react-nativehermes-integration" class="hash-link" aria-label="Direct link to React Native/Hermes Integration" title="Direct link to React Native/Hermes Integration">​</a></h2>
<p>We addressed a long-standing problem that has caused compatibility issues and is a recurrent problem when releasing new React Native versions: React Native depended on Hermes via prebuilt binaries distributed through CocoaPods and npm, which makes it possible to have API or <a href="https://github.com/react-native-community/discussions-and-proposals/issues/257" target="_blank" rel="noopener noreferrer">ABI incompatibilities</a>. To solve this problem, starting on React Native 0.69, Hermes is built alongside every version of React Native. This ensures full compatibility with each version React Native. This also creates a much tighter integration. It unlocks a more rapid iteration time to develop features or deploy bug fixes, and will give us greater confidence in making sure big changes to Hermes are done correctly. There is more in-depth information on the new integration change <a href="https://github.com/facebook/react-native-website/pull/3159/files" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="ios-intl">iOS Intl<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#ios-intl" class="hash-link" aria-label="Direct link to iOS Intl" title="Direct link to iOS Intl">​</a></h2>
<p>We finished the iOS counterpart implementation for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl" target="_blank" rel="noopener noreferrer"><code>Intl</code></a>, the ECMAScript Internationalization API that provides a broad range of language sensitive functionality. This was a long-standing <a href="https://github.com/facebook/hermes/issues/23" target="_blank" rel="noopener noreferrer">gap</a> that prevented some developers from using Hermes. The Android implementation, done in partnership with Microsoft, was shipped in React Native 0.65. With React Native 0.70, developers will have native support on both platforms.</p>
<p>Typical implementations for <code>Intl</code> require importing large lookup tables or data like <a href="https://cldr.unicode.org/index" target="_blank" rel="noopener noreferrer">Unicode CLDR</a>. However, that can come with an expensive size increase of up to 6MB, so in order to avoid bloating the binary size of Hermes, we implemented <code>Intl</code> by calling into APIs exposed by iOS itself. This means we can take advantage of all the locale and internationalization data that comes with iOS already.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="ongoing-work">Ongoing Work<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#ongoing-work" class="hash-link" aria-label="Direct link to Ongoing Work" title="Direct link to Ongoing Work">​</a></h2>
<p>As we continue evolving Hermes, we want to give the community a sense of our immediate priorities: improving developer experience and ensuring nobody avoids using Hermes due to lack of JavaScript language features. More specifically, we're:</p>
<ul>
<li>Enabling developers to run the sampling profiler directly from the Chrome devtools UI.</li>
<li>Adding support for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt" target="_blank" rel="noopener noreferrer"><code>BigInt</code></a>, a long-standing request from the community that may block some developers from using Hermes as it can’t be polyfilled.</li>
<li>Adding support for <a href="https://github.com/facebook/hermes/issues/658" target="_blank" rel="noopener noreferrer"><code>WeakRef</code></a>, which will expose new memory management controls to developers.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="wrap-up">Wrap Up<a href="https://reactnative.dev/blog/2022/07/08/hermes-as-the-default#wrap-up" class="hash-link" aria-label="Direct link to Wrap Up" title="Direct link to Wrap Up">​</a></h2>
<p>Hermes becoming the default marks the beginning of a long-term journey. We are working on new features that will enable the community to write efficient apps for many years to come. We also encourage the community to reach out on our <a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer">GitHub Repo</a> to post any bugs, questions, feedback or ideas! We have created a <code>hermes</code> label that can be used for any Hermes-specific posts.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Announcing React Native 0.69]]></title>
            <link>https://reactnative.dev/blog/2022/06/21/version-069</link>
            <guid>https://reactnative.dev/blog/2022/06/21/version-069</guid>
            <pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to release a new version of React Native, 0.69.0. This version comes with several improvements for the New Architecture of React Native and new features: React 18 support & bundled Hermes. Read on to learn more!]]></description>
            <content:encoded><![CDATA[<p>We are excited to release a new version of React Native, 0.69.0. This version comes with several improvements for the New Architecture of React Native and new features: React 18 support &amp; bundled Hermes. Read on to learn more!</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="sections">Sections<a href="https://reactnative.dev/blog/2022/06/21/version-069#sections" class="hash-link" aria-label="Direct link to Sections" title="Direct link to Sections">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2022/06/21/version-069#react-18">React 18</a></li>
<li><a href="https://reactnative.dev/blog/2022/06/21/version-069#bundled-hermes">Bundled Hermes</a></li>
<li><a href="https://reactnative.dev/blog/2022/06/21/version-069#highlights-of-069">Highlights of 0.69</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="react-18">React 18<a href="https://reactnative.dev/blog/2022/06/21/version-069#react-18" class="hash-link" aria-label="Direct link to React 18" title="Direct link to React 18">​</a></h2>
<p>We are delighted to share with you that React Native 0.69 is the first release to support React 18. React 18 has brought <a href="https://reactjs.org/blog/2022/03/29/react-v18.html" target="_blank" rel="noopener noreferrer">lots of improvements</a>, like new hooks such as <code>useId</code>. Additionally, React 18 includes new concurrency features such as <code>useTransition</code> or full Suspense support.</p>
<p>On React Native 0.69, React 18 is enabled by default. However, if you have not migrated to the New Architecture, you will only be able to leverage the features that don't use concurrent rendering and concurrent features. The New Architecture has been built with concurrent rendering in mind but we cannot add that support for the old architecture.</p>
<p>You can learn more about the React 18 support in React Native <a href="https://reactnative.dev/docs/0.69/react-18-and-react-native" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="bundled-hermes">Bundled Hermes<a href="https://reactnative.dev/blog/2022/06/21/version-069#bundled-hermes" class="hash-link" aria-label="Direct link to Bundled Hermes" title="Direct link to Bundled Hermes">​</a></h2>
<p>Before this release, Hermes and React Native were released separately. That led to confusion on which version of Hermes is compatible with which version of React Native. To remedy this issue, starting with React Native 0.69 we will be shipping a compatible version of Hermes alongside React Native. Making this change will make using Hermes in React Native much more stable.</p>
<p>Using the proper version of Hermes is handled by React Native, however, make sure to follow the steps in the <a href="https://react-native-community.github.io/upgrade-helper/?from=0.68.2&amp;to=0.69.0" target="_blank" rel="noopener noreferrer">upgrade helper</a> to ensure the integration works as intended. If you don't have Hermes enabled already, you can follow the steps <a href="https://reactnative.dev/docs/hermes">here</a> to do so. While we will continue supporting other JavaScript engines, we recommend everyone to migrate to Hermes to have the best experience and to make sure we can support you better.</p>
<p>Note that users on the New Architecture on Android will need to <strong>build Hermes from source</strong>. For building Hermes from source, Windows users will need to additionally follow <a href="https://reactnative.dev/architecture/bundled-hermes#android-users-on-new-architecture-building-on-windows">these steps</a>.</p>
<p>If you are interested to learn more about how React Native bundles Hermes works under the hood, you can check out the deep-dive documentation <a href="https://reactnative.dev/architecture/bundled-hermes">here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="new-architecture">New Architecture<a href="https://reactnative.dev/blog/2022/06/21/version-069#new-architecture" class="hash-link" aria-label="Direct link to New Architecture" title="Direct link to New Architecture">​</a></h2>
<p>We are continuing the roll-out of the New Architecture for both Android and iOS. If you have not migrated your app or library, yet, follow the steps <a href="https://github.com/reactwg/react-native-new-architecture#guides" target="_blank" rel="noopener noreferrer">here</a>. You can also read the <a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture">latest update</a> on tools and resources for the New Architecture to learn more.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="highlights-of-069">Highlights of 0.69<a href="https://reactnative.dev/blog/2022/06/21/version-069#highlights-of-069" class="hash-link" aria-label="Direct link to Highlights of 0.69" title="Direct link to Highlights of 0.69">​</a></h2>
<p>As mentioned above, the most important improvements in this release are centered around React 18 support and bundled Hermes. However, there have been other notable changes, including:</p>
<ul>
<li><a href="https://github.com/facebook/react-native/commit/982ca30de079d7e80bd0b50365d58b9048fb628f" target="_blank" rel="noopener noreferrer">Deprecating support</a> for iOS/tvOS SDK 11.0, version 12.4+ is now required</li>
<li><a href="https://github.com/facebook/react-native/commit/c5babd993a2bed2994ecc4710fa9e424b3e6cfc2" target="_blank" rel="noopener noreferrer">Better support</a> for M1 users developing for Android</li>
<li><a href="https://github.com/facebook/react-native/commit/0480f56c5b5478b6ebe5ad88e347cad2810bfb17" target="_blank" rel="noopener noreferrer">Addition</a> of the new <code>.xcode.env</code> configuration file for more deterministically sourcing the node executable</li>
<li><a href="https://github.com/facebook/react-native/commit/50c8e973f067d4ef1fc3c2eddd360a0709828968" target="_blank" rel="noopener noreferrer">React Native now uses</a> the latest status bar API from Android 11</li>
<li><a href="https://github.com/facebook/react-native/commit/c2e4ae39b8a5c6534a3fa4dae4130166eda15169" target="_blank" rel="noopener noreferrer">Support for C++17</a></li>
<li><a href="https://github.com/facebook/react-native/commit/1a1a304ed2023d60547aef65b1a7bf56467edf08" target="_blank" rel="noopener noreferrer">New</a> <code>hotkeysEnabled</code> option in the iOS debug menu</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="breaking-changes">Breaking changes<a href="https://reactnative.dev/blog/2022/06/21/version-069#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes">​</a></h3>
<p>There have also been a few breaking changes:</p>
<ul>
<li>React Native CLI has been bumped to a new major version of <a href="https://github.com/react-native-community/cli/releases/tag/v8.0.0" target="_blank" rel="noopener noreferrer">8.0</a>:<!-- -->
<ul>
<li><code>link</code> and <code>unlink</code> commands have been removed in the favour of autolinking</li>
<li>Deprecated <code>initCompat</code> has been removed, use <code>init</code> command instead</li>
<li>Removed deprecated <code>run-android</code> properties</li>
<li>Removed <code>install</code> and <code>uninstall</code> commands</li>
<li>Removed assets and hooks from <code>react-native.config.js</code> – you'll need to remove these properties from your config</li>
<li><code>podspecPath</code> was removed from the iOS dependency config</li>
<li>Removed <code>--project-path</code> option from a <code>run-ios</code></li>
<li>Changed iOS source directory detection from looking for an Xcode project to looking for a Podfile</li>
</ul>
</li>
<li>Support for <code>console.disableYellowBox</code> <a href="https://github.com/facebook/react-native/commit/b633cc130533f0731b2577123282c4530e4f0abe" target="_blank" rel="noopener noreferrer">has been dropped</a></li>
<li>Already deprecated prop types have been removed (<a href="https://github.com/facebook/react-native/commit/cdfddb4dad7c69904850d7e5f089a32a1d3445d1" target="_blank" rel="noopener noreferrer">cdfddb4dad</a>, <a href="https://github.com/facebook/react-native/commit/3e229f27bc9c7556876ff776abf70147289d544b" target="_blank" rel="noopener noreferrer">3e229f27bc</a>, <a href="https://github.com/facebook/react-native/commit/10199b158138b8645550b5579df87e654213fe42" target="_blank" rel="noopener noreferrer">10199b1581</a>)</li>
<li><code>removeListener</code>, deprecated since RN 0.65, <a href="https://github.com/facebook/react-native/commit/8dfbed786b40082a7a222e00dc0a621c0695697d" target="_blank" rel="noopener noreferrer">was removed</a> from Appearance</li>
<li>If you were using <code>SegmentedComponentIOS</code>, you will now need to replace it with the third-party library, for example <a href="https://github.com/react-native-segmented-control/segmented-control" target="_blank" rel="noopener noreferrer">segmented-control</a> (<a href="https://github.com/facebook/react-native/commit/235f1685748442553e53f8ec6d904bc0314a8ae6" target="_blank" rel="noopener noreferrer">235f168574</a>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="upgrades">Upgrades<a href="https://reactnative.dev/blog/2022/06/21/version-069#upgrades" class="hash-link" aria-label="Direct link to Upgrades" title="Direct link to Upgrades">​</a></h3>
<p>And we upgraded some of our dependencies:</p>
<ul>
<li>Bump <a href="https://github.com/facebook/react-native/commit/200488e87cf4bc355e03c78cd814b97b23452117" target="_blank" rel="noopener noreferrer">of AGP to 7.1.1</a> - we recommend sticking to this version in your apps</li>
<li><code>boost</code> for Android was updated to 1.76 <a href="https://github.com/facebook/react-native/commit/5cd6367f0b86543274a15bb6d0e53a8545fed845" target="_blank" rel="noopener noreferrer">to align with iOS</a></li>
<li>Ruby <a href="https://github.com/facebook/react-native/commit/2c87b7466e098c5cd230e02b279fc7bc7a357615" target="_blank" rel="noopener noreferrer">was bumped to 2.7.5</a></li>
<li>Direct metro dependencies <a href="https://github.com/facebook/react-native/commit/b74e964e705c40834acad7020562e870cdad9db1" target="_blank" rel="noopener noreferrer">have been upgraded</a> to 0.70.1</li>
</ul>
<p>You can check out the full list of changes <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#0690" target="_blank" rel="noopener noreferrer">in the changelog</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2022/06/21/version-069#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements">​</a></h3>
<p>80 contributors with their 629 commits have helped to make this release possible - thanks everyone!</p>
<p>We are also thankful to the release testers, supporters, and everyone else who gave their feedback to ensure this release will be as stable as possible.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Helping migrate React Native libraries to the New Architecture]]></title>
            <link>https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture</link>
            <guid>https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture</guid>
            <pubDate>Thu, 16 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[tl; dr: We are working on improving the resources supporting the React Native New Architecture. We have already released a repository to help migrate your app (RNNewArchitectureApp) and one for your libraries (RNNewArchitectureLibraries). We are also revamping the New Architecture guide on the Website and we created a GitHub Working Group to answer questions related to the New Architecture.]]></description>
            <content:encoded><![CDATA[<p><strong>tl; dr</strong>: We are working on improving the resources supporting the React Native New Architecture. We have already released a repository to help migrate your app (<a href="https://github.com/react-native-community/RNNewArchitectureApp" target="_blank" rel="noopener noreferrer">RNNewArchitectureApp</a>) and one for your libraries (<a href="https://github.com/react-native-community/RNNewArchitectureLibraries" target="_blank" rel="noopener noreferrer">RNNewArchitectureLibraries</a>). We are also revamping the <a href="https://github.com/facebook/react-native-website/pull/3037" target="_blank" rel="noopener noreferrer">New Architecture guide</a> on the Website and we created a <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer">GitHub Working Group</a> to answer questions related to the New Architecture.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="introduction">Introduction<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>In this post we are sharing an update on tools and resources to help you migrate your <strong>Native Modules</strong> and <strong>Native Components</strong> to their <strong>New Architecture</strong> equivalents, <strong>TurboModule</strong> and <strong>Fabric Components</strong>.</p>
<p>React Native users leverage vast number of open source libraries for building apps. For a complete and consistent ecosystem, it is necessary that these libraries migrate such that everyone can benefit from the unlocked capabilities and performance improvements of the New Architecture.</p>
<p>Here is what we’re working on to support library developers in migrating to the New Architecture:</p>
<ul>
<li><strong>Documentation:</strong> We are expanding the <a href="https://github.com/facebook/react-native-website/pull/3037" target="_blank" rel="noopener noreferrer">New Architecture guide</a> on the website to cover more concepts of the New Architecture and how to develop your components.</li>
<li><strong>Example Migrations:</strong> We’ve set up two repositories to demonstrate how to migrate a React Native app to the New Architecture (<a href="https://github.com/react-native-community/RNNewArchitectureApp" target="_blank" rel="noopener noreferrer">RNNewArchitectureApp</a>) and how to create a <strong>Fabric Component</strong> and a <strong>TurboModule</strong> that work with both architectures (<a href="https://github.com/react-native-community/RNNewArchitectureLibraries" target="_blank" rel="noopener noreferrer">RNNewArchitectureLibraries</a>).</li>
<li><strong>Support:</strong> Earlier this year, we created a <a href="https://github.com/reactwg/react-native-new-architecture/discussions" target="_blank" rel="noopener noreferrer">GitHub Working Group</a> dedicated to discussion and questions around the New Architecture.</li>
</ul>
<p>In this post, we will dig deeper into these resources and explain in more detail how you can use them most efficiently. Finally, we will provide a snapshot of the current migration state for the most used React Native libraries.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="documentation">Documentation<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation">​</a></h3>
<p>In the past 6 months, we’ve added a <a href="https://github.com/reactwg/react-native-new-architecture#guides" target="_blank" rel="noopener noreferrer">guide on adopting the New Architecture</a> and an <a href="https://reactnative.dev/architecture/overview">architecture deep-dive</a> on Fabric. We plan to expand this to include more guides and documentation around creating TurboModules, understanding CodeGen, and more. We plan to have updates to share by the 0.70 release.</p>
<p>Currently, the <strong>New Architecture</strong> guide covers how to <a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md" target="_blank" rel="noopener noreferrer">migrate your app</a> and <a href="https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-libraries-prerequisites.md" target="_blank" rel="noopener noreferrer">your libraries</a> to support the New Architecture properly.</p>
<p>If you are interested in the evolution of this guide, or have feedback, you can follow along on <a href="https://github.com/facebook/react-native-website/pull/3037" target="_blank" rel="noopener noreferrer">this</a> pull request.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="example-migrations">Example Migrations<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#example-migrations" class="hash-link" aria-label="Direct link to Example Migrations" title="Direct link to Example Migrations">​</a></h3>
<p>For developers who may want to follow along in code, we’ve prepared two example repositories.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="rnnewarchitectureapp">RNNewArchitectureApp<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#rnnewarchitectureapp" class="hash-link" aria-label="Direct link to RNNewArchitectureApp" title="Direct link to RNNewArchitectureApp">​</a></h4>
<p><a href="https://github.com/react-native-community/RNNewArchitectureApp" target="_blank" rel="noopener noreferrer">This repo</a> was created to demonstrate how to migrate an app, the native modules and the native components from the legacy architecture on the React Native version 0.67 to the New Architecture and the most recent version of React Native. Each commit corresponds to an isolated migration step.</p>
<figure><img src="https://reactnative.dev/blog/assets/new-arch-example-steps-to-migrate-an-app.png" alt="Example steps to migrate an app"><figcaption>Commit list for a migration in the RNNewArchitectureApp repository</figcaption></figure>
<p>The repo is organized as follows:</p>
<ul>
<li>A <strong>main</strong> branch has no code but a README.md which advertises other branches.</li>
<li>Several migration branches which show a migration from a specific version of RN to another.</li>
</ul>
<p>Some of the migration branches also have a <strong>RUN.md</strong> file which describes in a more human-readable fashion the exact steps that have been applied in every commit.</p>
<p>We plan to keep this example up to date with the most recent stable releases, adding migrations to any minor release of React Native we are going to release. If you notice issue with any of the steps, please file an issue in the repository. This will hold until we have the reasonable feeling that most of the React Native users have migrated to the New Architecture.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="rnnewarchitecturelibraries">RNNewArchitectureLibraries<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#rnnewarchitecturelibraries" class="hash-link" aria-label="Direct link to RNNewArchitectureLibraries" title="Direct link to RNNewArchitectureLibraries">​</a></h4>
<p>Similarly, <a href="https://github.com/react-native-community/RNNewArchitectureLibraries" target="_blank" rel="noopener noreferrer">this repo</a> provides a step-by-step guide on how to create a <strong>TurboModule</strong> and a <strong>Fabric Component</strong>. It has a focus on ensuring backward compatibility between the New Architecture and the legacy one.</p>
<p>The repository is organized in a similar way to the previous one:</p>
<ul>
<li>A <strong>main</strong> branch has no code but a README.md which advertises other branches.</li>
<li>Other branches to show how to develop <strong>TurboModules</strong> and <strong>Fabric Components</strong>.</li>
</ul>
<p>We plan to keep this example updated onto new releases of React Native, especially releases that affect library development, as well as add more examples on how to use advanced features (for example: implementing commands, event emitters, custom state). If you notice errors, please file an issue in the example repository.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="support">Support<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#support" class="hash-link" aria-label="Direct link to Support" title="Direct link to Support">​</a></h3>
<p>We’ve created a dedicated <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">working group</a> to give the community space to ask questions and get updates on the New Architecture. If you are a library maintainer, this is a valuable resource to find answers to your questions, and for us to know about your requirements. To join, please follow <a href="https://github.com/reactwg/react-native-new-architecture#how-to-join-the-working-group" target="_blank" rel="noopener noreferrer">these instructions</a>. Everyone is welcome.</p>
<p>The working group is organized into several sections:</p>
<ul>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/announcements" target="_blank" rel="noopener noreferrer">Announcements</a>: A place to share milestones and significant updates on the RN New Architecture Rollout</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/deep-dive" target="_blank" rel="noopener noreferrer">Deep Dive</a>: A place to chat about deep dives and technical-specific topics</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/documentation" target="_blank" rel="noopener noreferrer">Documentation</a>: A place to chat about the New Architecture documentation and migration material</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/libraries" target="_blank" rel="noopener noreferrer">Libraries</a>: A place to chat about 3rd party libraries and their migration story to the New Architecture</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/q-a" target="_blank" rel="noopener noreferrer">Q&amp;A</a>: A place to ask the community for help on the New Architecture topics</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/releases" target="_blank" rel="noopener noreferrer">Releases</a>: A place to chat about release specific bugs &amp; build problems</li>
</ul>
<p>To use this group effectively:</p>
<ul>
<li><strong>Make sure your library is listed inside the <a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/libraries" target="_blank" rel="noopener noreferrer">Libraries</a> section</strong>. This will help us share a status update on the migration of your library and will help us understand which struggles library authors are facing to support you better.</li>
<li><strong>Leverage the Q&amp;A <a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/q-a" target="_blank" rel="noopener noreferrer">section</a> if you face a blocker and need support</strong>. Our team and community experts are monitoring and will support at our best effort.</li>
<li><strong>Keep an eye on the other sections for topics that may affect you</strong>. A new release may introduce exactly the API that you were looking for. You can subscribe to particular discussions via GitHub.</li>
</ul>
<p>We plan to support this group until the <strong>New Architecture</strong> is enabled by default and all the major libraries have been migrated to it.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="migration-status-of-popular-libraries">Migration Status of Popular Libraries<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#migration-status-of-popular-libraries" class="hash-link" aria-label="Direct link to Migration Status of Popular Libraries" title="Direct link to Migration Status of Popular Libraries">​</a></h3>
<p>Libraries maintainers have been sharing with us <a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/libraries" target="_blank" rel="noopener noreferrer">in the working group</a> the status of their migration effort, and we wanted to provide you with a quick overview:</p>
<ul>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/15" target="_blank" rel="noopener noreferrer">react-native-gesture-handler</a>: ✅ Migrated</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/17" target="_blank" rel="noopener noreferrer">react-native-navigation</a>: 🏃‍♂️ Ongoing</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/16" target="_blank" rel="noopener noreferrer">react-native-pager-view</a>: 🏃‍♂️ Ongoing</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/14" target="_blank" rel="noopener noreferrer">react-native-reanimated</a>: ✅ Migrated. In the process of testing and profiling for performances</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/13" target="_blank" rel="noopener noreferrer">react-native-screens</a>: 🏃‍♂️ Ongoing</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/38" target="_blank" rel="noopener noreferrer">react-native-slider</a>: 🎬 Started</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/21" target="_blank" rel="noopener noreferrer">react-native-template-new-architecture</a>: ✅ Migrated. Gradually adopting/testing more companion Libraries</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/22" target="_blank" rel="noopener noreferrer">react-native-template-typescript</a>: ✅ Migrated</li>
<li><a href="https://github.com/reactwg/react-native-new-architecture/discussions/19" target="_blank" rel="noopener noreferrer">react-native-webview</a>: 🎬 Started</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="next-steps">Next Steps<a href="https://reactnative.dev/blog/2022/06/16/resources-migrating-your-react-native-library-to-the-new-architecture#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps">​</a></h2>
<p>We are invested in supporting the React Native community’s adoption of the New Architecture. Concretely, we will continue to:</p>
<ul>
<li>Offer best-effort support in the <strong>Working Group.</strong></li>
<li>Provide more examples about how to achieve amazing results with the New Architecture in the <strong>RNNewArchitecture</strong> repositories.</li>
<li>Provide clear and up-to-date documentation on the <strong>New Architecture</strong>.</li>
<li>Track the migration status of essential React Native libraries in the <strong>Working Group</strong>.</li>
<li>Simplify the migration path for developers</li>
</ul>
<p>In addition, React Native 0.69 will ship with improved devX for app and library developers for New Architecture adoption. You can find more information about the 0.69.0 release <a href="https://github.com/reactwg/react-native-releases/discussions/21" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>We are excited about what we will build together with the <strong>New Architecture</strong>!</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[React Native Accessibility - GAAD 2022 Update]]></title>
            <link>https://reactnative.dev/blog/2022/05/19/GAAD-2022-update</link>
            <guid>https://reactnative.dev/blog/2022/05/19/GAAD-2022-update</guid>
            <pubDate>Thu, 19 May 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[May 19th, 2022 marks the 11th annual celebration of Global Accessibility Awareness Day and we wanted to update everyone on the accessibility progress we’ve made on the React Native Framework. Meta (formerly Facebook) was the first organization to take the GAAD pledge in 2020, committing to making the React Native framework accessible.]]></description>
            <content:encoded><![CDATA[<p>May 19th, 2022 marks the 11th annual celebration of Global Accessibility Awareness Day and we wanted to update everyone on the accessibility progress we’ve made on the React Native Framework. Meta (formerly Facebook) was the <a href="https://reactnative.dev/blog/2021/03/08/GAAD-React-Native-Accessibility">first organization to take the GAAD pledge in 2020</a>, committing to making the React Native framework accessible.</p>
<blockquote>
<p><em>“We hope this pledge makes it easier for developers using React Native to create fully accessible mobile apps and inspires other organizations to make similar commitments to a more accessible future.”</em></p>
<p>— <a href="https://gaad.foundation/gaadpledge/" target="_blank" rel="noopener noreferrer">Mike Shebanek, head of accessibility Meta, 2020</a></p>
</blockquote>
<p>The process initially began with a thorough review and gap analysis of the framework focused on React Native utilized the iOS and Android APIs to support accessibility features. Dozens of issues have since been fixed or closed out, making good on the pledge to make React Native accessible and advancing the accessibility of the framework ever forward.</p>
<p>We didn’t stop there, and in early 2022, we reviewed and prioritized the remaining issues from this gap analysis on the <a href="https://github.com/facebook/react-native/projects/15" target="_blank" rel="noopener noreferrer">Improved React Native Accessibility Board</a> based on their impact on developers and end users.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="fixes-that-have-already-landed-in-2022">Fixes that have already landed in 2022<a href="https://reactnative.dev/blog/2022/05/19/GAAD-2022-update#fixes-that-have-already-landed-in-2022" class="hash-link" aria-label="Direct link to Fixes that have already landed in 2022" title="Direct link to Fixes that have already landed in 2022">​</a></h2>
<ul>
<li><a href="https://github.com/facebook/react-native/issues/30840" target="_blank" rel="noopener noreferrer">Android: Disabled state not announced/disabled functionality not applied for some components</a></li>
<li><a href="https://github.com/facebook/react-native/issues/30977" target="_blank" rel="noopener noreferrer">Android: Position in collection not supported by some components</a></li>
<li><a href="https://github.com/facebook/react-native/pull/31757" target="_blank" rel="noopener noreferrer">Android: Make links independently focusable by Talkback</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="fixes-currently-in-progress">Fixes currently in progress<a href="https://reactnative.dev/blog/2022/05/19/GAAD-2022-update#fixes-currently-in-progress" class="hash-link" aria-label="Direct link to Fixes currently in progress" title="Direct link to Fixes currently in progress">​</a></h2>
<ul>
<li><a href="https://github.com/facebook/react-native/issues/30848" target="_blank" rel="noopener noreferrer">iOS/Android: Text input error announcement</a></li>
<li><a href="https://github.com/facebook/react-native/issues/30859" target="_blank" rel="noopener noreferrer">Android: Form field error state announcement</a></li>
<li><a href="https://github.com/facebook/react-native/issues/31042" target="_blank" rel="noopener noreferrer">Android: Role description is announced before the components text, rather than after</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="contributor-highlight">Contributor highlight<a href="https://reactnative.dev/blog/2022/05/19/GAAD-2022-update#contributor-highlight" class="hash-link" aria-label="Direct link to Contributor highlight" title="Direct link to Contributor highlight">​</a></h2>
<p>We want to recognize and send a tremendous thank you to <a href="https://github.com/fabriziobertoglio1987" target="_blank" rel="noopener noreferrer">Fabrizo Bertoglio</a> who has contributed several high-quality accessibility fixes to React Native in 2021 and 2022.</p>
<p>Fabrizio has made it a personal goal to enable users through high quality solutions. By learning how to use TalkBack and VoiceOver himself, he has discovered how difficult it can be for screen reader users to experience everyday applications. He wants to build software that removes friction from these experiences and please disabled users.</p>
<p>His pull requests have been very high quality, well documented, and include thorough test cases. Well done Fabrizio! The React Native Accessibility community thanks you for your many outstanding contributions.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="whats-next-in-2022">What’s next in 2022<a href="https://reactnative.dev/blog/2022/05/19/GAAD-2022-update#whats-next-in-2022" class="hash-link" aria-label="Direct link to What’s next in 2022" title="Direct link to What’s next in 2022">​</a></h2>
<p>Our goal is to fix as many of the remaining accessibility issues as possible in 2022. We will also be reviewing the backlog of <a href="https://github.com/facebook/react-native/issues" target="_blank" rel="noopener noreferrer">React Native community reported issues</a> to look for any new accessibility-related requests.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[Announcing React Native 0.68]]></title>
            <link>https://reactnative.dev/blog/2022/03/30/version-068</link>
            <guid>https://reactnative.dev/blog/2022/03/30/version-068</guid>
            <pubDate>Wed, 30 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello everyone! Today we are announcing the 0.68.0 release of React Native, with opt-in to the New React Native Architecture, bug fixes and more.]]></description>
            <content:encoded><![CDATA[<p>Hello everyone! Today we are announcing the 0.68.0 release of React Native, with opt-in to the New React Native Architecture, bug fixes and more.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="sections">Sections<a href="https://reactnative.dev/blog/2022/03/30/version-068#sections" class="hash-link" aria-label="Direct link to Sections" title="Direct link to Sections">​</a></h3>
<ul>
<li><a href="https://reactnative.dev/blog/2022/03/30/version-068#highlights-of-068">Highlights of 0.68</a></li>
<li><a href="https://reactnative.dev/blog/2022/03/30/version-068#opting-in-to-the-new-architecture">Opting in to the New Architecture</a></li>
<li><a href="https://reactnative.dev/blog/2022/03/30/version-068#website-updates">Website updates</a></li>
<li><a href="https://reactnative.dev/blog/2022/03/30/version-068#interested-in-helping-react-native-stabilize-new-releases">Interested in helping React Native stabilise new releases?</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="highlights-of-068">Highlights of 0.68<a href="https://reactnative.dev/blog/2022/03/30/version-068#highlights-of-068" class="hash-link" aria-label="Direct link to Highlights of 0.68" title="Direct link to Highlights of 0.68">​</a></h2>
<p><a href="https://twitter.com/Andrei_Calazans" target="_blank" rel="noopener noreferrer">Andrei Calazans</a> helped us selecting the most relevant changes that 0.68 brings along:</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="breaking-changes-and-version-bumps">Breaking changes and version bumps<a href="https://reactnative.dev/blog/2022/03/30/version-068#breaking-changes-and-version-bumps" class="hash-link" aria-label="Direct link to Breaking changes and version bumps" title="Direct link to Breaking changes and version bumps">​</a></h3>
<p>This version brings along a few breaking changes:</p>
<ul>
<li>React Native has been updated to Node 16, the latest LTS. Since on CI we test for LTS and the previous LTS, this change means that users are now required to use a version of Node &gt;= 14.</li>
<li>Android Gradle Plugin was updated to 7.0.1, enforcing JDK 11 for Android builds, so make sure to upgrade your configurations (we recommend you use the <code>zulu11</code> JDK flavor for both Intel and M1 Macs)</li>
<li>Removed <code>fallbackResource</code> from <code>RCTBundleURLProvider</code> API on iOS. This parameter can be safely removed from the method call without replacement.</li>
</ul>
<p>Tooling has also been updated - here are the main bumps:</p>
<ul>
<li>@react-native-community/cli to 7.0.3</li>
<li>Metro to 0.67</li>
<li>react-devtools-core dependency to 4.23.0</li>
<li>Flipper to 0.125.0</li>
<li>react-native-codegen to 0.0.9</li>
<li>Kotlin to 1.6.10</li>
<li>Soloader to 0.10.3</li>
<li>Gradle to 7.3</li>
<li>Android compile and target SDK to 31</li>
</ul>
<p>Also, thanks to <a href="https://github.com/facebook/react-native/commit/bd7caa64f5d6ee5ea9484e92c3629c9ce711f73c" target="_blank" rel="noopener noreferrer">this commit</a> by <a href="https://github.com/cortinico" target="_blank" rel="noopener noreferrer">Nicola Corti</a> the Android Gradle Plugin will download the default version of NDK by itself, so you don’t have to specify and install it separately anymore.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="other-improvements">Other improvements<a href="https://reactnative.dev/blog/2022/03/30/version-068#other-improvements" class="hash-link" aria-label="Direct link to Other improvements" title="Direct link to Other improvements">​</a></h3>
<p>There are a lot of other changes and fixes landed in this release, but here’s a small selection that you might be interested in:</p>
<ul>
<li><a href="https://github.com/GijsWeterings" target="_blank" rel="noopener noreferrer">Gijs Weterings</a> <a href="https://github.com/facebook/react-native/commit/5050e7eaa17cb417baf7c20eb5c4406cce6790a5" target="_blank" rel="noopener noreferrer">fixed Forwarding testID to RCTModalHostView</a> for easier E2E targeting of Modals.</li>
<li><a href="https://github.com/liamjones" target="_blank" rel="noopener noreferrer">Liam Jones</a> <a href="https://github.com/facebook/react-native/commit/9d2df5b8ae9" target="_blank" rel="noopener noreferrer">fixed an issue</a> where calling <code>console.error</code> caused the RedBox to appear alongside the LogBox.</li>
<li><a href="https://github.com/samkline" target="_blank" rel="noopener noreferrer">Sam Kline</a> <a href="https://github.com/facebook/react-native/commit/c8d823b9bd9619dfa1f5851af003cc24ba2e8830" target="_blank" rel="noopener noreferrer">fixed the empty blank screen</a> after a BundleDownloader failure in dev mode on Android.</li>
<li><a href="https://github.com/JeffreyHyer" target="_blank" rel="noopener noreferrer">Jeffrey Hyer</a> <a href="https://github.com/facebook/react-native/commit/9c5e177a79c" target="_blank" rel="noopener noreferrer">fixed an issue</a> where the KeyboardAvoidingView didn't work as expected with the <code>onLayout</code> prop.</li>
</ul>
<p>If you are interested in the full list of changes, you can read it in the changelog <a href="https://github.com/facebook/react-native/blob/main/CHANGELOG.md#0680" target="_blank" rel="noopener noreferrer">at the link here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="acknowledgements">Acknowledgements<a href="https://reactnative.dev/blog/2022/03/30/version-068#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements">​</a></h3>
<p>This release includes 614 commits by 68 contributors! Thank you all!</p>
<p>We wanted to also thank the release testers and supporters who helped us catch regressions before the stable 0.68.0 release: you are incredibly valuable to the success of this release!</p>
<p>If you, your app or your company is interested in joining the “Release Tester” program, you can <a href="https://forms.gle/fPuPE1MZRDGWNqpd6" target="_blank" rel="noopener noreferrer">sign up here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="opting-in-to-the-new-architecture">Opting in to the New Architecture<a href="https://reactnative.dev/blog/2022/03/30/version-068#opting-in-to-the-new-architecture" class="hash-link" aria-label="Direct link to Opting in to the New Architecture" title="Direct link to Opting in to the New Architecture">​</a></h2>
<p>As briefly mentioned above, React Native 0.68 is the first version with opt-in support for the Fabric Renderer and the TurboModule system. This marks a crucial milestone for the rollout of the New React Native Architecture. To help you get up to speed with the changes, we added <a href="https://reactnative.dev/architecture/overview">the Architecture section</a> to the website, where you can find several in-depth guides about internals of the new systems.</p>
<p>At the same time, we added the <a href="https://github.com/reactwg/react-native-new-architecture#guides" target="_blank" rel="noopener noreferrer">migration guide</a> to the documentation and launched <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">a working group</a> dedicated to the New Architecture. You can find more information, including how to opt in, in <a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout">the previous blog post</a>.</p>
<p>Please note that the New Architecture still needs some fine tuning. Some of the third-party libraries that you depend on might not be migrated yet, and you may encounter issues that we haven’t discovered yet. If you do so, please report them to our <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">New Architecture Working Group</a>.</p>
<p><strong>About React 18:</strong> React 18's new rendering engine is not supported by React Native 0.68, this will happen in a future version. This is because React 18 relies on the New Architecture to benefit from the new capabilities presented in <a href="https://reactjs.org/blog/2022/03/29/react-v18.html" target="_blank" rel="noopener noreferrer">the React 18 announcement blog post</a>. For more information, see the <a href="https://www.youtube.com/watch?v=FZ0cG47msEk&amp;t=1530s" target="_blank" rel="noopener noreferrer">React Conf keynote here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="website-updates">Website updates<a href="https://reactnative.dev/blog/2022/03/30/version-068#website-updates" class="hash-link" aria-label="Direct link to Website updates" title="Direct link to Website updates">​</a></h2>
<p>Along with improvements to the main codebase, with the help of <a href="https://github.com/Simek" target="_blank" rel="noopener noreferrer">Simek</a>, <a href="https://github.com/Megatron4537" target="_blank" rel="noopener noreferrer">Megatron4537</a> and <a href="https://github.com/slorber" target="_blank" rel="noopener noreferrer">slorber</a> there have been quite a few improvements landing on the website too! In particular, you will now be able to learn how to contribute to React Native via the new section in the top toolbar.
Moreover, the “Contributing” section and the new “Architecture” section are now unversioned — there is now only one copy of these sections, rather than one for each React Native version.</p>]]></content:encoded>
            <category>announcement</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[An update on the New Architecture Rollout]]></title>
            <link>https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout</link>
            <guid>https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout</guid>
            <pubDate>Tue, 15 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Hi everyone,]]></description>
            <content:encoded><![CDATA[<p>Hi everyone,
<a href="https://reactnative.dev/blog/2022/01/21/react-native-h2-2021-recap#the-new-architecture-rollout-and-releases">As previously announced</a>:</p>
<blockquote>
<p>2022 is going to be the year of the New Architecture in open source</p>
</blockquote>
<p>If you still haven’t had the time to look into the New React Native Architecture (the Fabric Renderer and the TurboModule system), there is no better time to do it <strong>than now</strong>!</p>
<p>We would like to share with the community some initiatives and material we prepared to make sure everyone is onboard on this endeavor.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="the-working-group">The Working Group<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#the-working-group" class="hash-link" aria-label="Direct link to The Working Group" title="Direct link to The Working Group">​</a></h3>
<p>Recently, we launched the <a href="https://github.com/reactwg/react-native-new-architecture" target="_blank" rel="noopener noreferrer">React Native New Architecture Working Group</a> on GitHub, a <em>discussion only</em> repository to coordinate and support the rollout of the New Architecture across the ecosystem.</p>
<p>We envision this working group as a space where the community can <strong>meet</strong>, share <strong>ideas</strong>, and <strong>discuss</strong> challenges during the adoption of the New Architecture. Moreover, we're going to use this working group to <strong>share</strong> information and updates with the wider community for the sake of transparency.</p>
<p>To keep the discussion focused, we decided to have this working group <strong>open to read</strong> publicly and <strong>restricted to write</strong> only for approved users.</p>
<p>If you wish to join the conversation, you can <a href="https://forms.gle/8emgdwFZXuzEpyyn9" target="_blank" rel="noopener noreferrer">fill in this form</a> to either <strong>apply or nominate</strong> someone that you think would be a valuable addition to the discussion.</p>
<p><strong>Everyone is welcome</strong> to apply to join the conversation.</p>
<p>As every discussion forum, we would like to stress once more the importance of being <strong>respectful</strong> and welcoming towards others’ opinions. Please take the chance to read our <a href="https://github.com/reactwg/react-native-new-architecture/blob/main/CODE_OF_CONDUCT.md" target="_blank" rel="noopener noreferrer"><strong>code of conduct</strong></a> if you haven’t yet done it.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="the-migration-guide">The Migration Guide<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#the-migration-guide" class="hash-link" aria-label="Direct link to The Migration Guide" title="Direct link to The Migration Guide">​</a></h3>
<p>After several rounds of review &amp; feedback, we finally merged <strong>the Migration Guide</strong> (f.k.a. <em>the Playbook</em>). You can find it <a href="https://github.com/reactwg/react-native-new-architecture#guides" target="_blank" rel="noopener noreferrer">on the New Architecture working group.</a></p>
<p>This Migration Guide will show you <strong>how to create a custom Fabric component or a TurboModule</strong> with a step-by-step approach. The guide will also show you how to <strong>adapt your existing app or library</strong> to use the New Architecture.</p>
<p>Moreover, we would like to remind you the brand-new <a href="https://reactnative.dev/architecture/overview">Architecture section</a> of our website. There you can find several in-depth articles and explanation of the React Native internals. Specifically, <a href="https://reactnative.dev/architecture/fabric-renderer">the Fabric section</a> can help you understand the rendering pipeline in the New Architecture world.</p>
<p>Finally, please consider <strong>sharing your feedback</strong> to this documentation material <a href="https://github.com/reactwg/react-native-new-architecture/discussions/7" target="_blank" rel="noopener noreferrer">on the working group</a>. We’re constantly looking for developer’s opinion, and we want to make sure we’re delivering the content that you find most useful.</p>
<p>Over the next months, we will look into refining and adding more documentation to help you further.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="the-new-architecture-template">The New Architecture Template<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#the-new-architecture-template" class="hash-link" aria-label="Direct link to The New Architecture Template" title="Direct link to The New Architecture Template">​</a></h3>
<p>React Native <strong>0.68.0</strong> is close to release. This version of React Native marks a crucial milestone in the New Architecture Rollout as it’s the first version to include an <strong>opt-in switch</strong> in the <strong>new app template.</strong></p>
<p>This means that you will be able to try the New Architecture <strong>by changing one line</strong> in the template. We also added extensive <strong>comments and documentation</strong> to the template to make sure you don’t need extra reading to use it out of the box. We hope this will help you adopt the New Architecture by <strong>reducing the amount of code</strong> your have to write.</p>
<p>In the next releases, we will keep on updating the template to make it even more streamlined and simple to use.</p>
<p>To enable the New Architecture on either platform, you can:</p>
<ul>
<li>On iOS, run <code>RCT_NEW_ARCH_ENABLED=1 bundle exec pod install</code> inside the <code>ios</code> folder.</li>
<li>On Android, set the <code>newArchEnabled</code> property to <code>true</code> by <strong>either</strong>:<!-- -->
<ul>
<li>Changing the corresponding line inside the <code>android/gradle.properties</code> file.</li>
<li>Set an environment variable <code>ORG_GRADLE_PROJECT_newArchEnabled=true</code></li>
<li>Invoke Gradle with <code>-PnewArchEnabled=true</code></li>
</ul>
</li>
</ul>
<p>Then you can <strong>run your app</strong> with <code>yarn react-native run-android</code> or <code>run-ios</code> and you’ll be running using Fabric and TurboModules enabled.</p>
<p>Please consider trying this new template, and <a href="https://github.com/reactwg/react-native-new-architecture/discussions/5" target="_blank" rel="noopener noreferrer">report any bug or unexpected behavior</a> that you might face. Over the last months we worked hard to fix bugs and build failures that would have been <strong>hard to catch</strong> without the constant community feedback and testing.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="the-3rd-party-libraries-ecosystem">The 3rd-party Libraries Ecosystem<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#the-3rd-party-libraries-ecosystem" class="hash-link" aria-label="Direct link to The 3rd-party Libraries Ecosystem" title="Direct link to The 3rd-party Libraries Ecosystem">​</a></h3>
<p>The community won't be able to migrate to the New Architecture without the full support of <strong>3rd-party libraries author &amp; maintainers</strong>.</p>
<p>We understand how this can be a tedious process, and we understand the importance of supporting users on <strong>both</strong> old and New Architecture. Over the next months, we will focus on supporting our library developers to help them migrate over.</p>
<p>If you’re a <strong>library developer</strong>, <a href="https://github.com/reactwg/react-native-new-architecture/discussions/categories/libraries" target="_blank" rel="noopener noreferrer">we invite you to post an update</a> in the New Architecture working group with the <strong>status of your libraries</strong>. This will help you attract early adopters and us to understand if any library is facing a blocker.</p>
<p>If instead you’re a <strong>library user</strong>, you can <a href="https://github.com/reactwg/react-native-new-architecture/discussions/6" target="_blank" rel="noopener noreferrer">post a message here</a> to request a migration of a library. If we identify a library that becomes a blocker for a number of users, we will try to reach out to the maintainer and understand why they haven’t migrated yet.</p>
<p>Finally, we would like to give a shout out to Software Mansion for releasing a new version of <a href="https://github.com/software-mansion/react-native-screens" target="_blank" rel="noopener noreferrer"><code>react-native-screens</code></a>, which has support for both architectures. Moreover, they published a blog-post (<a href="https://blog.swmansion.com/introducing-fabric-to-react-native-screens-fd17bf18858e" target="_blank" rel="noopener noreferrer">Introducing Fabric to react-native-screens</a>) where they <strong>tell their migration story</strong>. We hope you will find this story inspiring and useful to tackle your migration.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="releases">Releases<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases">​</a></h3>
<p>Work on the 0.68 pre-release has realized much of <a href="https://reactnative.dev/blog/2022/01/19/version-067#improvements-to-release-process">the improved release process we had defined last half</a>.</p>
<p>We’re happy to share that with 0.68 we were able to:</p>
<ul>
<li>Successfully onboard release work to an internal rotation. Much of this is supported by <a href="https://reactnative.dev/contributing/overview">improved documentation</a> on the release process which will reduce the bus factor of the release process.</li>
<li>Initiated discussions with partners to support a <a href="https://github.com/reactwg/react-native-releases/blob/main/docs/roles-and-responsibilities.md" target="_blank" rel="noopener noreferrer">Copilot rotation</a>. We hope this effort will improve transparency of the process and inform our partners where to invest to support React Native releases and eco-system.</li>
<li><a href="https://github.com/reactwg/react-native-releases/discussions/11" target="_blank" rel="noopener noreferrer">Onboarded several Release Supporters and Testers from the community</a>. We had put a call-out for help last half and so many folks stepped up! The feedback from our testers and supporters have <strong>helped us fix crucial bugs</strong> and regressions, especially around the new architecture, for the upcoming release. Thank you to everyone who signed up and tested out the release!</li>
</ul>
<p>With React Native 0.69 we will continue refining this process, ideally getting partners to provide earlier release signal and onboarding co-pilots. As always, <a href="https://github.com/reactwg/react-native-releases/discussions" target="_blank" rel="noopener noreferrer">any feedback is more than welcome</a>. If you’d like to join as a release tester or supporter, <a href="https://forms.gle/fPuPE1MZRDGWNqpd6" target="_blank" rel="noopener noreferrer">please sign up here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="towards-hermes-as-default-engine">Towards Hermes as Default engine<a href="https://reactnative.dev/blog/2022/03/15/an-update-on-the-new-architecture-rollout#towards-hermes-as-default-engine" class="hash-link" aria-label="Direct link to Towards Hermes as Default engine" title="Direct link to Towards Hermes as Default engine">​</a></h3>
<p>One of the crucial point of the New Architecture Rollout is the adoption of the new JavaScript engine: <strong>Hermes.</strong></p>
<p>With the New React Native Architecture, we’re going to <strong>set Hermes as default engine</strong>. This means that all the new documentation and templates will have Hermes enabled.</p>
<p>Please note that we'll continue working with the community to make sure <strong>other engines</strong>, such as JSC (JavaScript Core), <strong>are supported</strong>. You can still use the engine you wish, but you’ll have to <strong>explicitly disable Hermes</strong>.</p>
<p>To improve the stability of Hermes, we’re working towards changing the <strong>distribution model</strong> of Hermes. Specifically, we envision the Hermes release process <strong>to be closer</strong> to the React Native release process.</p>
<p>This will allow us to ship a version of React Native, with a bundled JS engine that is <strong>fully compatible</strong>. You won’t have to deal with run-time crashes and Hermes incompatibilities that are really hard to debug and understand.</p>
<p>Moreover, this will <strong>shorten the cycle</strong> for picking up <strong>improvements</strong> and bug fixes in Hermes, which will allow us to be more <strong>responsive</strong> to the needs of React Native users.</p>
<p>We will be sharing more on this matter in the coming months. In the meanwhile, feel free to <a href="https://github.com/reactwg/react-native-new-architecture/discussions/4" target="_blank" rel="noopener noreferrer">join the discussion</a> about it on the Working Group.</p>
<p>If you haven’t tried Hermes yet, now is the time to give it a go. And please make sure to flag any issues or blockers you might face.</p>
<p>With this, that’s a wrap.</p>
<p>I’d like to thank Andrei, Aleksandar, Dmitry, Eli, Luna, Héctor &amp; Neil for reviewing this blog-post and providing valuable contributions to those efforts.</p>
<p>And looking forward to <strong>reading your migration stories</strong>.</p>]]></content:encoded>
            <category>announcement</category>
        </item>
    </channel>
</rss>