# React Native · Learn once, write anywhere > A framework for building native apps for Android, iOS, and more using React - [React Native · Learn once, write anywhere](/index.md) ## docs ### getting-started This helpful guide lays out the prerequisites for learning React Native, using these docs, and setting up your environment. - [Introduction](/docs/getting-started.md): This helpful guide lays out the prerequisites for learning React Native, using these docs, and setting up your environment. ### environment-setup React Native allows developers who know React to create native apps. At the same time, native developers can use React Native to gain parity between native platforms by writing common features once. - [Get Started with React Native](/docs/environment-setup.md): React Native allows developers who know React to create native apps. At the same time, native developers can use React Native to gain parity between native platforms by writing common features once. ### set-up-your-environment In this guide, you'll learn how to set up your environment, so that you can run your project with Android Studio and Xcode. This will allow you to develop with Android emulators and iOS simulators, build your app locally, and more. - [Set Up Your Environment](/docs/set-up-your-environment.md): In this guide, you'll learn how to set up your environment, so that you can run your project with Android Studio and Xcode. This will allow you to develop with Android emulators and iOS simulators, build your app locally, and more. ### integration-with-existing-apps React Native is great when you are starting a new mobile app from scratch. However, it also works well for adding a single view or user flow to existing native applications. With a few steps, you can add new React Native based features, screens, views, etc. - [Integration with Existing Apps](/docs/integration-with-existing-apps.md): React Native is great when you are starting a new mobile app from scratch. However, it also works well for adding a single view or user flow to existing native applications. With a few steps, you can add new React Native based features, screens, views, etc. ### integration-with-android-fragment The guide for Integration with Existing Apps details how to integrate a full-screen React Native app into an existing Android app as an Activity. - [Integration with an Android Fragment](/docs/integration-with-android-fragment.md): The guide for Integration with Existing Apps details how to integrate a full-screen React Native app into an existing Android app as an Activity. ### intro-react-native-components React Native lets you compose app interfaces using Native Components. Conveniently, it comes with a set of these components for you to get started with right now—the Core Components! - [Core Components and Native Components](/docs/intro-react-native-components.md): React Native lets you compose app interfaces using Native Components. Conveniently, it comes with a set of these components for you to get started with right now—the Core Components! ### intro-react To understand React Native fully, you need a solid foundation in React. This short introduction to React can help you get started or get refreshed. - [React Fundamentals](/docs/intro-react.md): To understand React Native fully, you need a solid foundation in React. This short introduction to React can help you get started or get refreshed. ### handling-text-input TextInput is a Core Component that allows the user to enter text. It has an onChangeText prop that takes a function to be called every time the text changed, and an onSubmitEditing prop that takes a function to be called when the text is submitted. - [Handling Text Input](/docs/handling-text-input.md): TextInput is a Core Component that allows the user to enter text. It has an onChangeText prop that takes a function to be called every time the text changed, and an onSubmitEditing prop that takes a function to be called when the text is submitted. ### using-a-scrollview The ScrollView is a generic scrolling container that can contain multiple components and views. The scrollable items can be heterogeneous, and you can scroll both vertically and horizontally (by setting the horizontal property). - [Using a ScrollView](/docs/using-a-scrollview.md): The ScrollView is a generic scrolling container that can contain multiple components and views. The scrollable items can be heterogeneous, and you can scroll both vertically and horizontally (by setting the horizontal property). ### using-a-listview React Native provides a suite of components for presenting lists of data. Generally, you'll want to use either FlatList or SectionList. - [Using List Views](/docs/using-a-listview.md): React Native provides a suite of components for presenting lists of data. Generally, you'll want to use either FlatList or SectionList. ### troubleshooting These are some common issues you may run into while setting up React Native. If you encounter something that is not listed here, try searching for the issue in GitHub. - [Troubleshooting](/docs/troubleshooting.md): These are some common issues you may run into while setting up React Native. If you encounter something that is not listed here, try searching for the issue in GitHub. ### platform-specific-code When building a cross-platform app, you'll want to re-use as much code as possible. Scenarios may arise where it makes sense for the code to be different, for example you may want to implement separate visual components for Android and iOS. - [Platform-Specific Code](/docs/platform-specific-code.md): When building a cross-platform app, you'll want to re-use as much code as possible. Scenarios may arise where it makes sense for the code to be different, for example you may want to implement separate visual components for Android and iOS. ### building-for-tv TV devices support has been implemented with the intention of making existing React Native applications work on Apple TV and Android TV, with few or no changes needed in the JavaScript code for the applications. - [🗑️ Building For TV Devices](/docs/building-for-tv.md): TV devices support has been implemented with the intention of making existing React Native applications work on Apple TV and Android TV, with few or no changes needed in the JavaScript code for the applications. ### out-of-tree-platforms React Native is not only for Android and iOS devices - our partners and the community maintain projects that bring React Native to other platforms, such as: - [Out-of-Tree Platforms](/docs/out-of-tree-platforms.md): React Native is not only for Android and iOS devices - our partners and the community maintain projects that bring React Native to other platforms, such as: ### more-resources There’s always more to learn: developer workflows, shipping to app stores, internationalization, security and more. - [More Resources](/docs/more-resources.md): There’s always more to learn: developer workflows, shipping to app stores, internationalization, security and more. ### accessibility Create mobile apps accessible to assistive technology with React Native's suite of APIs designed to work with Android and iOS. - [Accessibility](/docs/accessibility.md): Create mobile apps accessible to assistive technology with React Native's suite of APIs designed to work with Android and iOS. ### accessibilityinfo Sometimes it's useful to know whether or not the device has a screen reader that is currently active. The AccessibilityInfo API is designed for this purpose. You can use it to query the current state of the screen reader as well as to register to be notified when the state of the screen reader changes. - [AccessibilityInfo](/docs/accessibilityinfo.md): Sometimes it's useful to know whether or not the device has a screen reader that is currently active. The AccessibilityInfo API is designed for this purpose. You can use it to query the current state of the screen reader as well as to register to be notified when the state of the screen reader changes. ### actionsheetios Displays native to iOS Action Sheet component. - [ActionSheetIOS](/docs/actionsheetios.md): Displays native to iOS Action Sheet component. ### activityindicator Displays a circular loading indicator. - [ActivityIndicator](/docs/activityindicator.md): Displays a circular loading indicator. ### alert Launches an alert dialog with the specified title and message. - [Alert](/docs/alert.md): Launches an alert dialog with the specified title and message. ### alertios Use Alert instead. - [❌ AlertIOS](/docs/alertios.md): Use Alert instead. ### animated The Animated library is designed to make animations fluid, powerful, and painless to build and maintain. Animated focuses on declarative relationships between inputs and outputs, configurable transforms in between, and start/stop methods to control time-based animation execution. - [Animated](/docs/animated.md): The Animated library is designed to make animations fluid, powerful, and painless to build and maintain. Animated focuses on declarative relationships between inputs and outputs, configurable transforms in between, and start/stop methods to control time-based animation execution. ### animatedvalue Standard value for driving animations. One Animated.Value can drive multiple properties in a synchronized fashion, but can only be driven by one mechanism at a time. Using a new mechanism (e.g. starting a new animation, or calling setValue) will stop any previous ones. - [Animated.Value](/docs/animatedvalue.md): Standard value for driving animations. One Animated.Value can drive multiple properties in a synchronized fashion, but can only be driven by one mechanism at a time. Using a new mechanism (e.g. starting a new animation, or calling setValue) will stop any previous ones. ### animatedvaluexy 2D Value for driving 2D animations, such as pan gestures. Almost identical API to normal Animated.Value, but multiplexed. Contains two regular Animated.Values under the hood. - [Animated.ValueXY](/docs/animatedvaluexy.md): 2D Value for driving 2D animations, such as pan gestures. Almost identical API to normal Animated.Value, but multiplexed. Contains two regular Animated.Values under the hood. ### animations Animations are very important to create a great user experience. Stationary objects must overcome inertia as they start moving. Objects in motion have momentum and rarely come to a stop immediately. Animations allow you to convey physically believable motion in your interface. - [Animations](/docs/animations.md): Animations are very important to create a great user experience. Stationary objects must overcome inertia as they start moving. Objects in motion have momentum and rarely come to a stop immediately. Animations allow you to convey physically believable motion in your interface. ### app-extensions App extensions let you provide custom functionality and content outside of your main app. There are different types of app extensions on iOS, and they are all covered in the App Extension Programming Guide. In this guide, we'll briefly cover how you may take advantage of app extensions on iOS. - [App Extensions](/docs/app-extensions.md): App extensions let you provide custom functionality and content outside of your main app. There are different types of app extensions on iOS, and they are all covered in the App Extension Programming Guide. In this guide, we'll briefly cover how you may take advantage of app extensions on iOS. ### appearance The Appearance module exposes information about the user's appearance preferences, such as their preferred color scheme (light or dark). - [Appearance](/docs/appearance.md): The Appearance module exposes information about the user's appearance preferences, such as their preferred color scheme (light or dark). ### appendix I. Terminology - [Appendix](/docs/appendix.md): I. Terminology ### appregistry Project with Native Code Required - [AppRegistry](/docs/appregistry.md): Project with Native Code Required ### appstate AppState can tell you if the app is in the foreground or background, and notify you when the state changes. - [AppState](/docs/appstate.md): AppState can tell you if the app is in the foreground or background, and notify you when the state changes. ### asyncstorage Use one of the community packages instead. - [❌ AsyncStorage](/docs/asyncstorage.md): Use one of the community packages instead. ### backhandler The Backhandler API detects hardware button presses for back navigation, lets you register event listeners for the system's back action, and lets you control how your application responds. It is Android-only. - [BackHandler](/docs/backhandler.md): The Backhandler API detects hardware button presses for back navigation, lets you register event listeners for the system's back action, and lets you control how your application responds. It is Android-only. ### boxshadowvalue The BoxShadowValue object is taken by the boxShadow style prop. It is comprised of 2-4 lengths, an optional color, and an optional inset boolean. These values collectively define the box shadow's color, position, size, and blurriness. - [BoxShadowValue Object Type](/docs/boxshadowvalue.md): The BoxShadowValue object is taken by the boxShadow style prop. It is comprised of 2-4 lengths, an optional color, and an optional inset boolean. These values collectively define the box shadow's color, position, size, and blurriness. ### build-speed Building your React Native app could be expensive and take several minutes of developers time. - [Speeding up your Build phase](/docs/build-speed.md): Building your React Native app could be expensive and take several minutes of developers time. ### button A basic button component that should render nicely on any platform. Supports a minimal level of customization. - [Button](/docs/button.md): A basic button component that should render nicely on any platform. Supports a minimal level of customization. ### checkbox Use one of the community packages instead. - [❌ CheckBox](/docs/checkbox.md): Use one of the community packages instead. ### clipboard Use one of the community packages instead. - [❌ Clipboard](/docs/clipboard.md): Use one of the community packages instead. ### colors Components in React Native are styled using JavaScript. Color properties usually match how CSS works on the web. General guides on the color usage on each platform could be found below: - [Color Reference](/docs/colors.md): Components in React Native are styled using JavaScript. Color properties usually match how CSS works on the web. General guides on the color usage on each platform could be found below: ### communication-android In Integrating with Existing Apps guide and Native UI Components guide we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques. - [Communication between native and React Native](/docs/communication-android.md): In Integrating with Existing Apps guide and Native UI Components guide we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques. ### communication-ios In Integrating with Existing Apps guide and Native UI Components guide we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques. - [Communication between native and React Native](/docs/communication-ios.md): In Integrating with Existing Apps guide and Native UI Components guide we learn how to embed React Native in a native component and vice versa. When we mix native and React Native components, we'll eventually find a need to communicate between these two worlds. Some ways to achieve that have been already mentioned in other guides. This article summarizes available techniques. ### components-and-apis React Native provides a number of built-in Core Components ready for you to use in your app. You can find them all in the left sidebar (or menu above, if you are on a narrow screen). If you're not sure where to get started, take a look at the following categories: - [Core Components and APIs](/docs/components-and-apis.md): React Native provides a number of built-in Core Components ready for you to use in your app. You can find them all in the left sidebar (or menu above, if you are on a narrow screen). If you're not sure where to get started, take a look at the following categories: ### datepickerandroid Use one of the community packages instead. - [❌ DatePickerAndroid](/docs/datepickerandroid.md): Use one of the community packages instead. ### datepickerios Use one of the community packages instead. - [❌ DatePickerIOS](/docs/datepickerios.md): Use one of the community packages instead. ### debugging Debugging features, such as the Dev Menu, LogBox, and React Native DevTools are disabled in release (production) builds. - [Debugging Basics](/docs/debugging.md): Debugging features, such as the Dev Menu, LogBox, and React Native DevTools are disabled in release (production) builds. ### debugging-native-code Projects with Native Code Only - [Debugging Native Code](/docs/debugging-native-code.md): Projects with Native Code Only ### debugging-release-builds Symbolicating a stack trace - [Debugging Release Builds](/docs/debugging-release-builds.md): Symbolicating a stack trace ### devsettings The DevSettings module exposes methods for customizing settings for developers in development. - [DevSettings](/docs/devsettings.md): The DevSettings module exposes methods for customizing settings for developers in development. ### dimensions useWindowDimensions is the preferred API for React components. Unlike Dimensions, it updates as the window's dimensions update. This works nicely with the React paradigm. - [Dimensions](/docs/dimensions.md): useWindowDimensions is the preferred API for React components. Unlike Dimensions, it updates as the window's dimensions update. This works nicely with the React paradigm. ### document-nodes Document nodes represent a complete native view tree. Apps using native navigation would provide a separate document node for each screen. Apps not using native navigation would generally provide a single document for the whole app (similar to single-page apps on Web). - [Document nodes](/docs/document-nodes.md): Document nodes represent a complete native view tree. Apps using native navigation would provide a separate document node for each screen. Apps not using native navigation would generally provide a single document for the whole app (similar to single-page apps on Web). ### drawerlayoutandroid React component that wraps the platform DrawerLayout (Android only). The Drawer (typically used for navigation) is rendered with renderNavigationView and direct children are the main view (where your content goes). The navigation view is initially not visible on the screen, but can be pulled in from the side of the window specified by the drawerPosition prop and its width can be set by the drawerWidth prop. - [DrawerLayoutAndroid](/docs/drawerlayoutandroid.md): React component that wraps the platform DrawerLayout (Android only). The Drawer (typically used for navigation) is rendered with renderNavigationView and direct children are the main view (where your content goes). The navigation view is initially not visible on the screen, but can be pulled in from the side of the window specified by the drawerPosition prop and its width can be set by the drawerWidth prop. ### dropshadowvalue The DropShadowValue object is taken by the filter style prop for the dropShadow function. It is comprised of 2 or 3 lengths and an optional color. These values collectively define the drop shadow's color, position, and blurriness. - [DropShadowValue Object Type](/docs/dropshadowvalue.md): The DropShadowValue object is taken by the filter style prop for the dropShadow function. It is comprised of 2 or 3 lengths and an optional color. These values collectively define the drop shadow's color, position, and blurriness. ### dynamiccolorios The DynamicColorIOS function is a platform color type specific to iOS. - [DynamicColorIOS](/docs/dynamiccolorios.md): The DynamicColorIOS function is a platform color type specific to iOS. ### easing The Easing module implements common easing functions. This module is used by Animated.timing() to convey physically believable motion in animations. - [Easing](/docs/easing.md): The Easing module implements common easing functions. This module is used by Animated.timing() to convey physically believable motion in animations. ### element-nodes Element nodes represent native components in the native view tree (similar to Element nodes on Web). - [Element nodes](/docs/element-nodes.md): Element nodes represent native components in the native view tree (similar to Element nodes on Web). ### fabric-native-components-android Now it's time to write some Android platform code to be able to render the web view. The steps you need to follow are: - [Fabric Native Modules: Android](/docs/fabric-native-components-android.md): Now it's time to write some Android platform code to be able to render the web view. The steps you need to follow are: ### fabric-native-components-introduction If you want to build new React Native Components that wrap around a Host Component like a unique kind of CheckBox on Android, or a UIButton on iOS, you should use a Fabric Native Component. - [Native Components](/docs/fabric-native-components-introduction.md): If you want to build new React Native Components that wrap around a Host Component like a unique kind of CheckBox on Android, or a UIButton on iOS, you should use a Fabric Native Component. ### fabric-native-components-ios Now it's time to write some iOS platform code to be able to render the web view. The steps you need to follow are: - [Fabric Native Components: iOS](/docs/fabric-native-components-ios.md): Now it's time to write some iOS platform code to be able to render the web view. The steps you need to follow are: ### fast-refresh Fast Refresh is a React Native feature that allows you to get near-instant feedback for changes in your React components. Fast Refresh is enabled by default, and you can toggle "Enable Fast Refresh" in the React Native Dev Menu. With Fast Refresh enabled, most edits should be visible within a second or two. - [Fast Refresh](/docs/fast-refresh.md): Fast Refresh is a React Native feature that allows you to get near-instant feedback for changes in your React components. Fast Refresh is enabled by default, and you can toggle "Enable Fast Refresh" in the React Native Dev Menu. With Fast Refresh enabled, most edits should be visible within a second or two. ### flatlist A performant interface for rendering basic, flat lists, supporting the most handy features: - [FlatList](/docs/flatlist.md): A performant interface for rendering basic, flat lists, supporting the most handy features: ### flexbox A component can specify the layout of its children using the Flexbox algorithm. Flexbox is designed to provide a consistent layout on different screen sizes. - [Layout with Flexbox](/docs/flexbox.md): A component can specify the layout of its children using the Flexbox algorithm. Flexbox is designed to provide a consistent layout on different screen sizes. ### gesture-responder-system The gesture responder system manages the lifecycle of gestures in your app. A touch can go through several phases as the app determines what the user's intention is. For example, the app needs to determine if the touch is scrolling, sliding on a widget, or tapping. This can even change during the duration of a touch. There can also be multiple simultaneous touches. - [Gesture Responder System](/docs/gesture-responder-system.md): The gesture responder system manages the lifecycle of gestures in your app. A touch can go through several phases as the app determines what the user's intention is. For example, the app needs to determine if the touch is scrolling, sliding on a widget, or tapping. This can even change during the duration of a touch. There can also be multiple simultaneous touches. ### getting-started-without-a-framework If you have constraints that are not served well by a Framework, or you prefer to write your own Framework, you can create a React Native app without using a Framework. - [Get Started Without a Framework](/docs/getting-started-without-a-framework.md): If you have constraints that are not served well by a Framework, or you prefer to write your own Framework, you can create a React Native app without using a Framework. ### global-__DEV__ You can use the DEV pseudo-global variable in the codebase to guard development-only blocks of code. - [✨ __DEV__](/docs/global-__DEV__.md): You can use the DEV pseudo-global variable in the codebase to guard development-only blocks of code. ### global-AbortController 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [AbortController](/docs/global-AbortController.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-AbortSignal 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [AbortSignal](/docs/global-AbortSignal.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-alert 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [alert](/docs/global-alert.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-Blob 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [Blob](/docs/global-Blob.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-cancelAnimationFrame 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [cancelAnimationFrame](/docs/global-cancelAnimationFrame.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-cancelIdleCallback 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [cancelIdleCallback](/docs/global-cancelIdleCallback.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-clearInterval 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [clearInterval](/docs/global-clearInterval.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-clearTimeout 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [clearTimeout](/docs/global-clearTimeout.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-console 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [console](/docs/global-console.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-EventCounts The global EventCounts class, as defined in Web specifications. - [EventCounts](/docs/global-EventCounts.md): The global EventCounts class, as defined in Web specifications. ### global-fetch 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [fetch](/docs/global-fetch.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-File 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [File](/docs/global-File.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-FileReader 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [FileReader](/docs/global-FileReader.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-FormData 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [FormData](/docs/global-FormData.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-global global is a legacy alias for globalThis, as defined in Node.js. - [global](/docs/global-global.md): global is a legacy alias for globalThis, as defined in Node.js. ### global-Headers 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [Headers](/docs/global-Headers.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-intersectionobserver The global IntersectionObserver interface, as defined in Web specifications. It provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport. - [IntersectionObserver 🧪](/docs/global-intersectionobserver.md): The global IntersectionObserver interface, as defined in Web specifications. It provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport. ### global-intersectionobserverentry The IntersectionObserverEntry interface, as defined in Web specifications. It describes the intersection between the target element and its root container at a specific moment of transition. - [IntersectionObserverEntry 🧪](/docs/global-intersectionobserverentry.md): The IntersectionObserverEntry interface, as defined in Web specifications. It describes the intersection between the target element and its root container at a specific moment of transition. ### global-navigator 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [navigator](/docs/global-navigator.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-performance The global performance object, as defined in Web specifications. - [performance](/docs/global-performance.md): The global performance object, as defined in Web specifications. ### global-PerformanceEntry The global PerformanceEntry class, as defined in Web specifications. - [PerformanceEntry](/docs/global-PerformanceEntry.md): The global PerformanceEntry class, as defined in Web specifications. ### global-PerformanceEventTiming The global PerformanceEventTiming class, as defined in Web specifications. - [PerformanceEventTiming](/docs/global-PerformanceEventTiming.md): The global PerformanceEventTiming class, as defined in Web specifications. ### global-PerformanceLongTaskTiming The global PerformanceLongTaskTiming class, as defined in Web specifications. - [PerformanceLongTaskTiming](/docs/global-PerformanceLongTaskTiming.md): The global PerformanceLongTaskTiming class, as defined in Web specifications. ### global-PerformanceMark The global PerformanceMark class, as defined in Web specifications. - [PerformanceMark](/docs/global-PerformanceMark.md): The global PerformanceMark class, as defined in Web specifications. ### global-PerformanceMeasure The global PerformanceMeasure class, as defined in Web specifications. - [PerformanceMeasure](/docs/global-PerformanceMeasure.md): The global PerformanceMeasure class, as defined in Web specifications. ### global-PerformanceObserver The global PerformanceObserver class, as defined in Web specifications. - [PerformanceObserver](/docs/global-PerformanceObserver.md): The global PerformanceObserver class, as defined in Web specifications. ### global-PerformanceObserverEntryList The global PerformanceObserverEntryList class, as defined in Web specifications. - [PerformanceObserverEntryList](/docs/global-PerformanceObserverEntryList.md): The global PerformanceObserverEntryList class, as defined in Web specifications. ### global-PerformanceResourceTiming The global PerformanceResourceTiming class, as defined in Web specifications. - [PerformanceResourceTiming](/docs/global-PerformanceResourceTiming.md): The global PerformanceResourceTiming class, as defined in Web specifications. ### global-process 🚧 This page is work in progress. - [process](/docs/global-process.md): 🚧 This page is work in progress. ### global-queueMicrotask 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [queueMicrotask](/docs/global-queueMicrotask.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-Request 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [Request](/docs/global-Request.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-requestAnimationFrame 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [requestAnimationFrame](/docs/global-requestAnimationFrame.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-requestIdleCallback 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [requestIdleCallback](/docs/global-requestIdleCallback.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-Response 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [Response](/docs/global-Response.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-self self is an alias for globalThis, as defined in Web specifications. - [self](/docs/global-self.md): self is an alias for globalThis, as defined in Web specifications. ### global-setInterval 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [setInterval](/docs/global-setInterval.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-setTimeout 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [setTimeout](/docs/global-setTimeout.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-URL 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [URL](/docs/global-URL.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-URLSearchParams 🚧 This page is work in progress, so please refer to the MDN documentation for more information.\ - [URLSearchParams](/docs/global-URLSearchParams.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information.\ ### global-WebSocket 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [WebSocket](/docs/global-WebSocket.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### global-window window is an alias for globalThis, as defined in Web specifications. - [window](/docs/global-window.md): window is an alias for globalThis, as defined in Web specifications. ### global-XMLHttpRequest 🚧 This page is work in progress, so please refer to the MDN documentation for more information. - [XMLHttpRequest](/docs/global-XMLHttpRequest.md): 🚧 This page is work in progress, so please refer to the MDN documentation for more information. ### handling-touches Users interact with mobile apps mainly through touch. They can use a combination of gestures, such as tapping on a button, scrolling a list, or zooming on a map. React Native provides components to handle all sorts of common gestures, as well as a comprehensive gesture responder system to allow for more advanced gesture recognition, but the one component you will most likely be interested in is the basic Button. - [Handling Touches](/docs/handling-touches.md): Users interact with mobile apps mainly through touch. They can use a combination of gestures, such as tapping on a button, scrolling a list, or zooming on a map. React Native provides components to handle all sorts of common gestures, as well as a comprehensive gesture responder system to allow for more advanced gesture recognition, but the one component you will most likely be interested in is the basic Button. ### headless-js-android Headless JS is a way to run tasks in JavaScript while your app is in the background. It can be used, for example, to sync fresh data, handle push notifications, or play music. - [Headless JS](/docs/headless-js-android.md): Headless JS is a way to run tasks in JavaScript while your app is in the background. It can be used, for example, to sync fresh data, handle push notifications, or play music. ### height-and-width A component's height and width determine its size on the screen. - [Height and Width](/docs/height-and-width.md): A component's height and width determine its size on the screen. ### hermes Hermes is an open-source JavaScript engine optimized for React Native. For many apps, using Hermes will result in improved start-up time, decreased memory usage, and smaller app size when compared to JavaScriptCore. - [Using Hermes](/docs/hermes.md): Hermes is an open-source JavaScript engine optimized for React Native. For many apps, using Hermes will result in improved start-up time, decreased memory usage, and smaller app size when compared to JavaScriptCore. ### i18nmanager The I18nManager module provides utilities for managing Right-to-Left (RTL) layout support for languages like Arabic, Hebrew, and others. It provides methods to control RTL behavior and check the current layout direction. - [I18nManager](/docs/i18nmanager.md): The I18nManager module provides utilities for managing Right-to-Left (RTL) layout support for languages like Arabic, Hebrew, and others. It provides methods to control RTL behavior and check the current layout direction. ### image A React component for displaying different types of images, including network images, static resources, temporary local images, and images from local disk, such as the camera roll. - [Image](/docs/image.md): A React component for displaying different types of images, including network images, static resources, temporary local images, and images from local disk, such as the camera roll. ### image-style-props Examples - [Image Style Props](/docs/image-style-props.md): Examples ### imagebackground A common feature request from developers familiar with the web is background-image. To handle this use case, you can use the ` component, which has the same props as `, and add whatever children to it you would like to layer on top of it. - [ImageBackground](/docs/imagebackground.md): A common feature request from developers familiar with the web is background-image. To handle this use case, you can use the ` component, which has the same props as `, and add whatever children to it you would like to layer on top of it. ### imagepickerios Use one of the community packages instead. - [❌ ImagePickerIOS](/docs/imagepickerios.md): Use one of the community packages instead. ### images Static Image Resources - [Images](/docs/images.md): Static Image Resources ### improvingux Configure text inputs - [Improving User Experience](/docs/improvingux.md): Configure text inputs ### inputaccessoryview A component which enables customization of the keyboard input accessory view on iOS. The input accessory view is displayed above the keyboard whenever a TextInput has focus. This component can be used to create custom toolbars. - [InputAccessoryView](/docs/inputaccessoryview.md): A component which enables customization of the keyboard input accessory view on iOS. The input accessory view is displayed above the keyboard whenever a TextInput has focus. This component can be used to create custom toolbars. ### interactionmanager Avoid long-running work and use requestIdleCallback instead. - [🗑️ InteractionManager](/docs/interactionmanager.md): Avoid long-running work and use requestIdleCallback instead. ### javascript-environment JavaScript Runtime - [JavaScript Environment](/docs/javascript-environment.md): JavaScript Runtime ### keyboard Keyboard module to control keyboard events. - [Keyboard](/docs/keyboard.md): Keyboard module to control keyboard events. ### keyboardavoidingview This component will automatically adjust its height, position, or bottom padding based on the keyboard height to remain visible while the virtual keyboard is displayed. - [KeyboardAvoidingView](/docs/keyboardavoidingview.md): This component will automatically adjust its height, position, or bottom padding based on the keyboard height to remain visible while the virtual keyboard is displayed. ### layout-props More detailed examples about those properties can be found on the Layout with Flexbox page. - [Layout Props](/docs/layout-props.md): More detailed examples about those properties can be found on the Layout with Flexbox page. ### layoutanimation Automatically animates views to their new positions when the next layout happens. - [LayoutAnimation](/docs/layoutanimation.md): Automatically animates views to their new positions when the next layout happens. ### layoutevent LayoutEvent object is returned in the callback as a result of component layout change, for example onLayout in View component. - [LayoutEvent Object Type](/docs/layoutevent.md): LayoutEvent object is returned in the callback as a result of component layout change, for example onLayout in View component. ### legacy #### direct-manipulation It is sometimes necessary to make changes directly to a component without using state/props to trigger a re-render of the entire subtree. When using React in the browser for example, you sometimes need to directly modify a DOM node, and the same is true for views in mobile apps. setNativeProps is the React Native equivalent to setting properties directly on a DOM node. - [Direct Manipulation](/docs/legacy/direct-manipulation.md): It is sometimes necessary to make changes directly to a component without using state/props to trigger a re-render of the entire subtree. When using React in the browser for example, you sometimes need to directly modify a DOM node, and the same is true for views in mobile apps. setNativeProps is the React Native equivalent to setting properties directly on a DOM node. #### local-library-setup A local library is a library containing views or modules that's local to your app and not published to a registry. This is different from the traditional setup for view and modules in the sense that a local library is decoupled from your app's native code. - [Local libraries setup](/docs/legacy/local-library-setup.md): A local library is a library containing views or modules that's local to your app and not published to a registry. This is different from the traditional setup for view and modules in the sense that a local library is decoupled from your app's native code. #### native-components-android There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like ScrollView and TextInput, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application. - [Android Native UI Components](/docs/legacy/native-components-android.md): There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like ScrollView and TextInput, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application. #### native-components-ios There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like ScrollView and TextInput, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application. - [iOS Native UI Components](/docs/legacy/native-components-ios.md): There are tons of native UI widgets out there ready to be used in the latest apps - some of them are part of the platform, others are available as third-party libraries, and still more might be in use in your very own portfolio. React Native has several of the most critical platform components already wrapped, like ScrollView and TextInput, but not all of them, and certainly not ones you might have written yourself for a previous app. Fortunately, we can wrap up these existing components for seamless integration with your React Native application. #### native-modules-android Welcome to Native Modules for Android. Please start by reading the Native Modules Intro for an intro to what native modules are. - [Android Native Modules](/docs/legacy/native-modules-android.md): Welcome to Native Modules for Android. Please start by reading the Native Modules Intro for an intro to what native modules are. #### native-modules-intro Sometimes a React Native app needs to access a native platform API that is not available by default in JavaScript, for example the native APIs to access Apple or Google Pay. Maybe you want to reuse some existing Objective-C, Swift, Java or C++ libraries without having to reimplement it in JavaScript, or write some high performance, multi-threaded code for things like image processing. - [Native Modules Intro](/docs/legacy/native-modules-intro.md): Sometimes a React Native app needs to access a native platform API that is not available by default in JavaScript, for example the native APIs to access Apple or Google Pay. Maybe you want to reuse some existing Objective-C, Swift, Java or C++ libraries without having to reimplement it in JavaScript, or write some high performance, multi-threaded code for things like image processing. #### native-modules-ios Welcome to Native Modules for iOS. Please start by reading the Native Modules Intro for an intro to what native modules are. - [iOS Native Modules](/docs/legacy/native-modules-ios.md): Welcome to Native Modules for iOS. Please start by reading the Native Modules Intro for an intro to what native modules are. #### native-modules-setup Native modules are usually distributed as npm packages, except that on top of the usual JavaScript they will include some native code per platform. To understand more about npm packages you may find this guide useful. - [Native Modules NPM Package Setup](/docs/legacy/native-modules-setup.md): Native modules are usually distributed as npm packages, except that on top of the usual JavaScript they will include some native code per platform. To understand more about npm packages you may find this guide useful. ### libraries This guide introduces React Native developers to finding, installing, and using third-party libraries in their apps. - [Using Libraries](/docs/libraries.md): This guide introduces React Native developers to finding, installing, and using third-party libraries in their apps. ### linking Linking gives you a general interface to interact with both incoming and outgoing app links. - [Linking](/docs/linking.md): Linking gives you a general interface to interact with both incoming and outgoing app links. ### linking-libraries-ios Not every app uses all the native capabilities, and including the code to support all those features would impact the binary size... But we still want to support adding these features whenever you need them. - [Linking Libraries](/docs/linking-libraries-ios.md): Not every app uses all the native capabilities, and including the code to support all those features would impact the binary size... But we still want to support adding these features whenever you need them. ### metro React Native uses Metro to build your JavaScript code and assets. - [Metro](/docs/metro.md): React Native uses Metro to build your JavaScript code and assets. ### modal The Modal component is a basic way to present content above an enclosing view. - [Modal](/docs/modal.md): The Modal component is a basic way to present content above an enclosing view. ### native-platform Your application may need access to platform features that aren’t directly available from react-native or one of the hundreds of third-party libraries maintained by the community. Maybe you want to reuse some existing Objective-C, Swift, Java, Kotlin or C++ code from the JavaScript runtime. Whatever your reason, React Native exposes a powerful set of API to connect your native code to your JavaScript application code. - [Native Platform](/docs/native-platform.md): Your application may need access to platform features that aren’t directly available from react-native or one of the hundreds of third-party libraries maintained by the community. Maybe you want to reuse some existing Objective-C, Swift, Java, Kotlin or C++ code from the JavaScript runtime. Whatever your reason, React Native exposes a powerful set of API to connect your native code to your JavaScript application code. ### navigation Mobile apps are rarely made up of a single screen. Managing the presentation of, and transition between, multiple screens is typically handled by what is known as a navigator. - [Navigating Between Screens](/docs/navigation.md): Mobile apps are rarely made up of a single screen. Managing the presentation of, and transition between, multiple screens is typically handled by what is known as a navigator. ### network Many mobile apps need to load resources from a remote URL. You may want to make a POST request to a REST API, or you may need to fetch a chunk of static content from another server. - [Networking](/docs/network.md): Many mobile apps need to load resources from a remote URL. You may want to make a POST request to a REST API, or you may need to fetch a chunk of static content from another server. ### nodes React Native apps render a native view tree that represents the UI, similar to how React DOM does on Web (the DOM tree). React Native provides imperative access to this tree via refs, which are returned by all native components (including those rendered by built-in components like View). - [Nodes from refs](/docs/nodes.md): React Native apps render a native view tree that represents the UI, similar to how React DOM does on Web (the DOM tree). React Native provides imperative access to this tree via refs, which are returned by all native components (including those rendered by built-in components like View). ### optimizing-flatlist-configuration Terms - [Optimizing FlatList Configuration](/docs/optimizing-flatlist-configuration.md): Terms ### optimizing-javascript-loading Parsing and running JavaScript code requires memory and time. Because of this, as your app grows, it's often useful to delay loading code until it's needed for the first time. React Native comes with some standard optimizations that are on by default, and there are techniques you can adopt in your own code to help React load your app more efficiently. There are also some advanced automatic optimizations (with their own tradeoffs) that are suitable for very large apps. - [Optimizing JavaScript loading](/docs/optimizing-javascript-loading.md): Parsing and running JavaScript code requires memory and time. Because of this, as your app grows, it's often useful to delay loading code until it's needed for the first time. React Native comes with some standard optimizations that are on by default, and there are techniques you can adopt in your own code to help React load your app more efficiently. There are also some advanced automatic optimizations (with their own tradeoffs) that are suitable for very large apps. ### other-debugging-methods This page covers how to use legacy JavaScript debugging methods. If you are getting started with a new React Native or Expo app, we recommend using React Native DevTools. - [Other Debugging Methods](/docs/other-debugging-methods.md): This page covers how to use legacy JavaScript debugging methods. If you are getting started with a new React Native or Expo app, we recommend using React Native DevTools. ### panresponder PanResponder reconciles several touches into a single gesture. It makes single-touch gestures resilient to extra touches, and can be used to recognize basic multi-touch gestures. - [PanResponder](/docs/panresponder.md): PanResponder reconciles several touches into a single gesture. It makes single-touch gestures resilient to extra touches, and can be used to recognize basic multi-touch gestures. ### performance A compelling reason to use React Native instead of WebView-based tools is to achieve at least 60 frames per second and provide a native look and feel to your apps. Whenever feasible, we aim for React Native to handle optimizations automatically, allowing you to focus on your app without worrying about performance. However, there are certain areas where we haven't quite reached that level yet, and others where React Native (similar to writing native code directly) cannot determine the best optimization approach for you. In such cases, manual intervention becomes necessary. We strive to deliver buttery-smooth UI performance by default, but there may be instances where that isn't possible. - [Performance Overview](/docs/performance.md): A compelling reason to use React Native instead of WebView-based tools is to achieve at least 60 frames per second and provide a native look and feel to your apps. Whenever feasible, we aim for React Native to handle optimizations automatically, allowing you to focus on your app without worrying about performance. However, there are certain areas where we haven't quite reached that level yet, and others where React Native (similar to writing native code directly) cannot determine the best optimization approach for you. In such cases, manual intervention becomes necessary. We strive to deliver buttery-smooth UI performance by default, but there may be instances where that isn't possible. ### permissionsandroid Project with Native Code Required - [PermissionsAndroid](/docs/permissionsandroid.md): Project with Native Code Required ### pixelratio PixelRatio gives you access to the device's pixel density and font scale. - [PixelRatio](/docs/pixelratio.md): PixelRatio gives you access to the device's pixel density and font scale. ### platform Example - [Platform](/docs/platform.md): Example ### platformcolor You can use the PlatformColor function to access native colors on the target platform by supplying the native color’s corresponding string value. You pass a string to the PlatformColor function and, provided it exists on that platform, it will return the corresponding native color, which you can apply in any part of your application. - [PlatformColor](/docs/platformcolor.md): You can use the PlatformColor function to access native colors on the target platform by supplying the native color’s corresponding string value. You pass a string to the PlatformColor function and, provided it exists on that platform, it will return the corresponding native color, which you can apply in any part of your application. ### pressable Pressable is a Core Component wrapper that can detect various stages of press interactions on any of its defined children. - [Pressable](/docs/pressable.md): Pressable is a Core Component wrapper that can detect various stages of press interactions on any of its defined children. ### pressevent PressEvent object is returned in the callback as a result of user press interaction, for example onPress in Button component. - [PressEvent Object Type](/docs/pressevent.md): PressEvent object is returned in the callback as a result of user press interaction, for example onPress in Button component. ### profiling Profiling is the process of analyzing an app's performance, resource usage, and behavior to identify potential bottlenecks or inefficiencies. It's worth making use of profiling tools to ensure your app works smoothly across different devices and conditions. - [Profiling](/docs/profiling.md): Profiling is the process of analyzing an app's performance, resource usage, and behavior to identify potential bottlenecks or inefficiencies. It's worth making use of profiling tools to ensure your app works smoothly across different devices and conditions. ### progressbarandroid Use one of the community packages instead. - [🗑️ ProgressBarAndroid](/docs/progressbarandroid.md): Use one of the community packages instead. ### props Most components can be customized when they are created, with different parameters. These created parameters are called props, short for properties. - [Props](/docs/props.md): Most components can be customized when they are created, with different parameters. These created parameters are called props, short for properties. ### publishing-to-app-store The publishing process is the same as any other native iOS app, with some additional considerations to take into account. - [Publishing to Apple App Store](/docs/publishing-to-app-store.md): The publishing process is the same as any other native iOS app, with some additional considerations to take into account. ### pushnotificationios Use one of the community packages instead. - [🗑️ PushNotificationIOS](/docs/pushnotificationios.md): Use one of the community packages instead. ### react-native-devtools React Native DevTools is our modern debugging experience for React Native. Purpose-built from the ground up, it aims to be fundamentally more integrated, correct, and reliable than previous debugging methods. - [React Native DevTools](/docs/react-native-devtools.md): React Native DevTools is our modern debugging experience for React Native. Purpose-built from the ground up, it aims to be fundamentally more integrated, correct, and reliable than previous debugging methods. ### react-native-gradle-plugin This guide describes how to configure the React Native Gradle Plugin (often referred as RNGP), when building your React Native application for Android. - [React Native Gradle Plugin](/docs/react-native-gradle-plugin.md): This guide describes how to configure the React Native Gradle Plugin (often referred as RNGP), when building your React Native application for Android. ### react-node A React Node is one of the following types: - [React Node Object Type](/docs/react-node.md): A React Node is one of the following types: ### rect Rect accepts numeric pixel values to describe how far to extend a rectangular area. These values are added to the original area's size to expand it. - [Rect Object Type](/docs/rect.md): Rect accepts numeric pixel values to describe how far to extend a rectangular area. These values are added to the original area's size to expand it. ### refreshcontrol This component is used inside a ScrollView or ListView to add pull to refresh functionality. When the ScrollView is at scrollY: 0, swiping down triggers an onRefresh event. - [RefreshControl](/docs/refreshcontrol.md): This component is used inside a ScrollView or ListView to add pull to refresh functionality. When the ScrollView is at scrollY: 0, swiping down triggers an onRefresh event. ### releases New React Native releases are shipped every two months, usually resulting in six (6) new minors per year. - [Releases Overview](/docs/releases.md): New React Native releases are shipped every two months, usually resulting in six (6) new minors per year. #### release-levels React Native provides the community with the ability to adopt individual new features as soon as their design and implementation are nearly complete, even before they are included in a stable release. This approach is known as release levels. - [Release Levels](/docs/releases/release-levels.md): React Native provides the community with the ability to adopt individual new features as soon as their design and implementation are nearly complete, even before they are included in a stable release. This approach is known as release levels. #### versioning-policy This page describes the versioning policy we follow for the react-native package. - [Versioning Policy](/docs/releases/versioning-policy.md): This page describes the versioning policy we follow for the react-native package. ### roottag RootTag is an opaque identifier assigned to the native root view of your React Native surface — i.e. the ReactRootView or RCTRootView instance for Android or iOS respectively. In short, it is a surface identifier. - [RootTag](/docs/roottag.md): RootTag is an opaque identifier assigned to the native root view of your React Native surface — i.e. the ReactRootView or RCTRootView instance for Android or iOS respectively. In short, it is a surface identifier. ### running-on-device It's always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production. - [Running On Device](/docs/running-on-device.md): It's always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production. ### running-on-simulator-ios Starting the simulator - [Running On Simulator](/docs/running-on-simulator-ios.md): Starting the simulator ### safeareaview Use react-native-safe-area-context instead. - [🗑️ SafeAreaView](/docs/safeareaview.md): Use react-native-safe-area-context instead. ### scrollview Component that wraps platform ScrollView while providing integration with touch locking "responder" system. - [ScrollView](/docs/scrollview.md): Component that wraps platform ScrollView while providing integration with touch locking "responder" system. ### sectionlist A performant interface for rendering sectioned lists, supporting the most handy features: - [SectionList](/docs/sectionlist.md): A performant interface for rendering sectioned lists, supporting the most handy features: ### security Security is often overlooked when building apps. It is true that it is impossible to build software that is completely impenetrable—we’ve yet to invent a completely impenetrable lock (bank vaults do, after all, still get broken into). However, the probability of falling victim to a malicious attack or being exposed for a security vulnerability is inversely proportional to the effort you’re willing to put in to protecting your application against any such eventuality. Although an ordinary padlock is pickable, it is still much harder to get past than a cabinet hook! - [Security](/docs/security.md): Security is often overlooked when building apps. It is true that it is impossible to build software that is completely impenetrable—we’ve yet to invent a completely impenetrable lock (bank vaults do, after all, still get broken into). However, the probability of falling victim to a malicious attack or being exposed for a security vulnerability is inversely proportional to the effort you’re willing to put in to protecting your application against any such eventuality. Although an ordinary padlock is pickable, it is still much harder to get past than a cabinet hook! ### segmentedcontrolios Use one of the community packages instead. - [❌ SegmentedControlIOS](/docs/segmentedcontrolios.md): Use one of the community packages instead. ### settings Settings serves as a wrapper for NSUserDefaults, a persistent key-value store available only on iOS. - [Settings](/docs/settings.md): Settings serves as a wrapper for NSUserDefaults, a persistent key-value store available only on iOS. ### shadow-props --- - [Shadow Props](/docs/shadow-props.md): --- ### share Example - [Share](/docs/share.md): Example ### signed-apk-android Android requires that all apps be digitally signed with a certificate before they can be installed. In order to distribute your Android application via Google Play store it needs to be signed with a release key that then needs to be used for all future updates. Since 2017 it is possible for Google Play to manage signing releases automatically thanks to App Signing by Google Play functionality. However, before your application binary is uploaded to Google Play it needs to be signed with an upload key. The Signing Your Applications page on Android Developers documentation describes the topic in detail. This guide covers the process in brief, as well as lists the steps required to package the JavaScript bundle. - [Publishing to Google Play Store](/docs/signed-apk-android.md): Android requires that all apps be digitally signed with a certificate before they can be installed. In order to distribute your Android application via Google Play store it needs to be signed with a release key that then needs to be used for all future updates. Since 2017 it is possible for Google Play to manage signing releases automatically thanks to App Signing by Google Play functionality. However, before your application binary is uploaded to Google Play it needs to be signed with an upload key. The Signing Your Applications page on Android Developers documentation describes the topic in detail. This guide covers the process in brief, as well as lists the steps required to package the JavaScript bundle. ### state There are two types of data that control a component: props and state. props are set by the parent and they are fixed throughout the lifetime of a component. For data that is going to change, we have to use state. - [State](/docs/state.md): There are two types of data that control a component: props and state. props are set by the parent and they are fixed throughout the lifetime of a component. For data that is going to change, we have to use state. ### statusbar Component to control the app's status bar. The status bar is the zone, typically at the top of the screen, that displays the current time, Wi-Fi and cellular network information, battery level and/or other status icons. - [StatusBar](/docs/statusbar.md): Component to control the app's status bar. The status bar is the zone, typically at the top of the screen, that displays the current time, Wi-Fi and cellular network information, battery level and/or other status icons. ### statusbarios Use StatusBar for mutating the status bar. - [❌ StatusBarIOS](/docs/statusbarios.md): Use StatusBar for mutating the status bar. ### strict-typescript-api The Strict TypeScript API is a preview of our future, stable JavaScript API for React Native. - [Strict TypeScript API (opt in)](/docs/strict-typescript-api.md): The Strict TypeScript API is a preview of our future, stable JavaScript API for React Native. ### style With React Native, you style your application using JavaScript. All of the core components accept a prop named style. The style names and values usually match how CSS works on the web, except names are written using camel casing, e.g. backgroundColor rather than background-color. - [Style](/docs/style.md): With React Native, you style your application using JavaScript. All of the core components accept a prop named style. The style names and values usually match how CSS works on the web, except names are written using camel casing, e.g. backgroundColor rather than background-color. ### stylesheet A StyleSheet is an abstraction similar to CSS StyleSheets. - [StyleSheet](/docs/stylesheet.md): A StyleSheet is an abstraction similar to CSS StyleSheets. ### switch Renders a boolean input. - [Switch](/docs/switch.md): Renders a boolean input. ### systrace Systrace is a standard Android marker-based profiling tool (and is installed when you install the Android platform-tools package). Profiled code blocks are surrounded by start/end markers which are then visualized in a colorful chart format. Both the Android SDK and React Native framework provide standard markers that you can visualize. - [Systrace](/docs/systrace.md): Systrace is a standard Android marker-based profiling tool (and is installed when you install the Android platform-tools package). Profiled code blocks are surrounded by start/end markers which are then visualized in a colorful chart format. Both the Android SDK and React Native framework provide standard markers that you can visualize. ### targetevent TargetEvent object is returned in the callback as a result of focus change, for example onFocus or onBlur in the TextInput component. - [TargetEvent Object Type](/docs/targetevent.md): TargetEvent object is returned in the callback as a result of focus change, for example onFocus or onBlur in the TextInput component. ### testing-overview This guide introduces React Native developers to the key concepts behind testing, how to write good tests, and what kinds of tests you can incorporate into your workflow. - [Testing](/docs/testing-overview.md): This guide introduces React Native developers to the key concepts behind testing, how to write good tests, and what kinds of tests you can incorporate into your workflow. ### text A React component for displaying text. - [Text](/docs/text.md): A React component for displaying text. ### text-nodes Text nodes represent raw text content on the tree (similar to Text nodes on Web). They are not directly accessible via refs, but can be accessed using methods like childNodes on element refs. - [Text nodes](/docs/text-nodes.md): Text nodes represent raw text content on the tree (similar to Text nodes on Web). They are not directly accessible via refs, but can be accessed using methods like childNodes on element refs. ### text-style-props Example - [Text Style Props](/docs/text-style-props.md): Example ### textinput A foundational component for inputting text into the app via a keyboard. Props provide configurability for several features, such as auto-correction, auto-capitalization, placeholder text, and different keyboard types, such as a numeric keypad. - [TextInput](/docs/textinput.md): A foundational component for inputting text into the app via a keyboard. Props provide configurability for several features, such as auto-correction, auto-capitalization, placeholder text, and different keyboard types, such as a numeric keypad. ### the-new-architecture #### advanced-topics-components This document contains a set of advanced topics to implement more complex functionalities of Native Components. It is recommended to first read the Codegen section and the guides on Native Components. - [Advanced Topics on Native Modules Development](/docs/the-new-architecture/advanced-topics-components.md): This document contains a set of advanced topics to implement more complex functionalities of Native Components. It is recommended to first read the Codegen section and the guides on Native Components. #### advanced-topics-modules This document contains a set of advanced topics to implement more complex functionalities of Native Modules. It is recommended to first read the Codegen section and the guides on Native Modules. - [Advanced Topics on Native Modules Development](/docs/the-new-architecture/advanced-topics-modules.md): This document contains a set of advanced topics to implement more complex functionalities of Native Modules. It is recommended to first read the Codegen section and the guides on Native Modules. #### codegen-cli Calling Gradle or manually calling a script might be hard to remember and it requires a lot of ceremony. - [The Codegen CLI](/docs/the-new-architecture/codegen-cli.md): Calling Gradle or manually calling a script might be hard to remember and it requires a lot of ceremony. #### create-module-library React Native has a rich ecosystem of libraries to solve common problems. We collect React Native libraries in the reactnative.directory website, and this is a great resource to bookmark for every React Native developer. - [Create a Library for Your Module](/docs/the-new-architecture/create-module-library.md): React Native has a rich ecosystem of libraries to solve common problems. We collect React Native libraries in the reactnative.directory website, and this is a great resource to bookmark for every React Native developer. #### custom-cxx-types This guide assumes that you are familiar with the Pure C++ Turbo Native Modules guide. This will build on top of that guide. - [Advanced: Custom C++ Types](/docs/the-new-architecture/custom-cxx-types.md): This guide assumes that you are familiar with the Pure C++ Turbo Native Modules guide. This will build on top of that guide. #### direct-manipulation-new-architecture It is sometimes necessary to make changes directly to a component without using state/props to trigger a re-render of the entire subtree. When using React in the browser for example, you sometimes need to directly modify a DOM node, and the same is true for views in mobile apps. setNativeProps is the React Native equivalent to setting properties directly on a DOM node. - [Direct Manipulation](/docs/the-new-architecture/direct-manipulation-new-architecture.md): It is sometimes necessary to make changes directly to a component without using state/props to trigger a re-render of the entire subtree. When using React in the browser for example, you sometimes need to directly modify a DOM node, and the same is true for views in mobile apps. setNativeProps is the React Native equivalent to setting properties directly on a DOM node. #### fabric-component-native-commands In the base guide to write a new Native Component, you have explored how to create a new component, how to pass properties from the JS side to the native side, and how to emit events from native side to JS. - [Invoking native functions on your native component](/docs/the-new-architecture/fabric-component-native-commands.md): In the base guide to write a new Native Component, you have explored how to create a new component, how to pass properties from the JS side to the native side, and how to emit events from native side to JS. #### layout-measurements Sometimes, you need to measure the current layout to apply some changes to the overall layout or to make decisions and call some specific logic. - [Measuring the Layout](/docs/the-new-architecture/layout-measurements.md): Sometimes, you need to measure the current layout to apply some changes to the overall layout or to make decisions and call some specific logic. #### native-modules-custom-events In some circustamces, you may want to have a Native Module that listen to some events in the platform layer and then emit them to the JavaScript layer, to let you application react to such native events. In other cases, you might have long running operations that can emits events so that the UI can be updated when those happen. - [Emitting Events in Native Modules](/docs/the-new-architecture/native-modules-custom-events.md): In some circustamces, you may want to have a Native Module that listen to some events in the platform layer and then emit them to the JavaScript layer, to let you application react to such native events. In other cases, you might have long running operations that can emits events so that the UI can be updated when those happen. #### native-modules-lifecycle In React Native, Native Modules are singleton. The Native Module infrastructure lazily creates a Native Module the first time it is accessed and it keeps it around whenever the app requires it. This is a performance optimization that allows us to avoid the overhead of creating Native Modules eagerly, at app start, and it ensure faster startup times. - [Native Modules Lifecycle](/docs/the-new-architecture/native-modules-lifecycle.md): In React Native, Native Modules are singleton. The Native Module infrastructure lazily creates a Native Module the first time it is accessed and it keeps it around whenever the app requires it. This is a performance optimization that allows us to avoid the overhead of creating Native Modules eagerly, at app start, and it ensure faster startup times. #### pure-cxx-modules Writing a module in C++ is the best way to share platform-agnostic code between Android and iOS. With pure C++ modules, you can write your logic only once and reuse it right away from all the platforms, without the need of writing platform-specific code. - [Cross-Platform Native Modules (C++)](/docs/the-new-architecture/pure-cxx-modules.md): Writing a module in C++ is the best way to share platform-agnostic code between Android and iOS. With pure C++ modules, you can write your logic only once and reuse it right away from all the platforms, without the need of writing platform-specific code. #### turbo-modules-with-swift Swift is the official and default language for developing native application on iOS. - [iOS - Using Swift in Your Native Modules](/docs/the-new-architecture/turbo-modules-with-swift.md): Swift is the official and default language for developing native application on iOS. #### using-codegen This guide teaches how to: - [Using Codegen](/docs/the-new-architecture/using-codegen.md): This guide teaches how to: #### what-is-codegen Codegen is a tool to avoid writing a lot of repetitive code. Using Codegen is not mandatory: you can write all the generated code manually. However, Codegen generates scaffolding code that could save you a lot of time. - [What is Codegen?](/docs/the-new-architecture/what-is-codegen.md): Codegen is a tool to avoid writing a lot of repetitive code. Using Codegen is not mandatory: you can write all the generated code manually. However, Codegen generates scaffolding code that could save you a lot of time. ### timepickerandroid Use one of the community packages instead. - [❌ TimePickerAndroid](/docs/timepickerandroid.md): Use one of the community packages instead. ### timers Timers are an important part of an application and React Native implements the browser timers. - [Timers](/docs/timers.md): Timers are an important part of an application and React Native implements the browser timers. ### toastandroid React Native's ToastAndroid API exposes the Android platform's ToastAndroid module as a JS module. It provides the method show(message, duration) which takes the following parameters: - [ToastAndroid](/docs/toastandroid.md): React Native's ToastAndroid API exposes the Android platform's ToastAndroid module as a JS module. It provides the method show(message, duration) which takes the following parameters: ### touchablehighlight If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. - [TouchableHighlight](/docs/touchablehighlight.md): If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. ### touchablenativefeedback If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. - [TouchableNativeFeedback](/docs/touchablenativefeedback.md): If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. ### touchableopacity If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. - [TouchableOpacity](/docs/touchableopacity.md): If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. ### touchablewithoutfeedback If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. - [TouchableWithoutFeedback](/docs/touchablewithoutfeedback.md): If you're looking for a more extensive and future-proof way to handle touch-based input, check out the Pressable API. ### transforms Transforms are style properties that will help you modify the appearance and position of your components using 2D or 3D transformations. However, once you apply transforms, the layouts remain the same around the transformed component hence it might overlap with the nearby components. You can apply margin to the transformed component, the nearby components or padding to the container to prevent such overlaps. - [Transforms](/docs/transforms.md): Transforms are style properties that will help you modify the appearance and position of your components using 2D or 3D transformations. However, once you apply transforms, the layouts remain the same around the transformed component hence it might overlap with the nearby components. You can apply margin to the transformed component, the nearby components or padding to the container to prevent such overlaps. ### turbo-native-modules-android Now it's time to write some Android platform code to make sure localStorage survives after the application is closed. - [Turbo Native Modules: Android](/docs/turbo-native-modules-android.md): Now it's time to write some Android platform code to make sure localStorage survives after the application is closed. ### turbo-native-modules-introduction Your React Native application code may need to interact with native platform APIs that aren't provided by React Native or an existing library. You can write the integration code yourself using a Turbo Native Module. This guide will show you how to write one. - [Native Modules](/docs/turbo-native-modules-introduction.md): Your React Native application code may need to interact with native platform APIs that aren't provided by React Native or an existing library. You can write the integration code yourself using a Turbo Native Module. This guide will show you how to write one. ### turbo-native-modules-ios Now it's time to write some iOS platform code to make sure localStorage survives after the application is closed. - [Turbo Native Modules: iOS](/docs/turbo-native-modules-ios.md): Now it's time to write some iOS platform code to make sure localStorage survives after the application is closed. ### tutorial React Native is like React, but it uses native components instead of web components as building blocks. So to understand the basic structure of a React Native app, you need to understand some of the basic React concepts, like JSX, components, state, and props. If you already know React, you still need to learn some React Native specific stuff, like the native components. This tutorial is aimed at all audiences, whether you have React experience or not. - [Learn the Basics](/docs/tutorial.md): React Native is like React, but it uses native components instead of web components as building blocks. So to understand the basic structure of a React Native app, you need to understand some of the basic React concepts, like JSX, components, state, and props. If you already know React, you still need to learn some React Native specific stuff, like the native components. This tutorial is aimed at all audiences, whether you have React experience or not. ### typescript TypeScript is a language which extends JavaScript by adding type definitions. New React Native projects target TypeScript by default, but also support JavaScript and Flow. - [Using TypeScript](/docs/typescript.md): TypeScript is a language which extends JavaScript by adding type definitions. New React Native projects target TypeScript by default, but also support JavaScript and Flow. ### upgrading Upgrading to new versions of React Native will give you access to more APIs, views, developer tools and other goodies. Upgrading requires a small amount of effort, but we try to make it straightforward for you. - [Upgrading to new versions](/docs/upgrading.md): Upgrading to new versions of React Native will give you access to more APIs, views, developer tools and other goodies. Upgrading requires a small amount of effort, but we try to make it straightforward for you. ### usecolorscheme The useColorScheme React hook provides and subscribes to color scheme updates from the Appearance module. The return value indicates the current user preferred color scheme. The value may be updated later, either through direct user action (e.g. theme selection in device settings) or on a schedule (e.g. light and dark themes that follow the day/night cycle). - [useColorScheme](/docs/usecolorscheme.md): The useColorScheme React hook provides and subscribes to color scheme updates from the Appearance module. The return value indicates the current user preferred color scheme. The value may be updated later, either through direct user action (e.g. theme selection in device settings) or on a schedule (e.g. light and dark themes that follow the day/night cycle). ### usewindowdimensions useWindowDimensions automatically updates all of its values when screen size or font scale changes. You can get your application window's width and height like so: - [useWindowDimensions](/docs/usewindowdimensions.md): useWindowDimensions automatically updates all of its values when screen size or font scale changes. You can get your application window's width and height like so: ### vibration Vibrates the device. - [Vibration](/docs/vibration.md): Vibrates the device. ### view The most fundamental component for building a UI, View is a container that supports layout with flexbox, style, some touch handling, and accessibility controls. View maps directly to the native view equivalent on whatever platform React Native is running on, whether that is a UIView, `, android.view`, etc. - [View](/docs/view.md): The most fundamental component for building a UI, View is a container that supports layout with flexbox, style, some touch handling, and accessibility controls. View maps directly to the native view equivalent on whatever platform React Native is running on, whether that is a UIView, `, android.view`, etc. ### view-style-props Example - [View Style Props](/docs/view-style-props.md): Example ### viewtoken ViewToken object is returned as one of the properties in the onViewableItemsChanged callback (for example, in the FlatList component). It is exported by ViewabilityHelper.js. - [ViewToken Object Type](/docs/viewtoken.md): ViewToken object is returned as one of the properties in the onViewableItemsChanged callback (for example, in the FlatList component). It is exported by ViewabilityHelper.js. ### virtualizedlist Base implementation for the more convenient ` and components, which are also better documented. In general, this should only really be used if you need more flexibility than FlatList` provides, e.g. for use with immutable data instead of plain arrays. - [VirtualizedList](/docs/virtualizedlist.md): Base implementation for the more convenient ` and components, which are also better documented. In general, this should only really be used if you need more flexibility than FlatList` provides, e.g. for use with immutable data instead of plain arrays. ### virtualview VirtualView is a core component that behaves similar to View. - [VirtualView 🧪](/docs/virtualview.md): VirtualView is a core component that behaves similar to View. ## architecture ### bundled-hermes This page gives an overview of how Hermes and React Native are built. - [Bundled Hermes](/architecture/bundled-hermes.md): This page gives an overview of how Hermes and React Native are built. ### fabric-renderer Fabric is React Native's new rendering system, a conceptual evolution of the legacy render system. The core principles are to unify more render logic in C++, improve interoperability with host platforms, and to unlock new capabilities for React Native. Development began in 2018 and in 2021, React Native in the Facebook app is backed by the new renderer. - [Fabric](/architecture/fabric-renderer.md): Fabric is React Native's new rendering system, a conceptual evolution of the legacy render system. The core principles are to unify more render logic in C++, improve interoperability with host platforms, and to unlock new capabilities for React Native. Development began in 2018 and in 2021, React Native in the Facebook app is backed by the new renderer. ### glossary Dev Menu - [Glossary](/architecture/glossary.md): Dev Menu ### landing-page Since 2018, the React Native team has been redesigning the core internals of React Native to enable developers to create higher-quality experiences. As of 2024, this version of React Native has been proven at scale and powers production apps by Meta. - [About the New Architecture](/architecture/landing-page.md): Since 2018, the React Native team has been redesigning the core internals of React Native to enable developers to create higher-quality experiences. As of 2024, this version of React Native has been proven at scale and powers production apps by Meta. ### overview Welcome to the Architecture Overview! If you're getting started with React Native, please refer to Guides section. Continue reading to learn how internals of React Native work! - [Architecture Overview](/architecture/overview.md): Welcome to the Architecture Overview! If you're getting started with React Native, please refer to Guides section. Continue reading to learn how internals of React Native work! ### render-pipeline The React Native renderer goes through a sequence of work to render React logic to a host platform. This sequence of work is called the render pipeline and occurs for initial renders and updates to the UI state. This document goes over the render pipeline and how it differs in those scenarios. - [Render, Commit, and Mount](/architecture/render-pipeline.md): The React Native renderer goes through a sequence of work to render React logic to a host platform. This sequence of work is called the render pipeline and occurs for initial renders and updates to the UI state. This document goes over the render pipeline and how it differs in those scenarios. ### threading-model The React Native renderer distributes the work of the render pipeline across multiple threads. - [Threading Model](/architecture/threading-model.md): The React Native renderer distributes the work of the render pipeline across multiple threads. ### view-flattening View Flattening is an optimization by the React Native renderer to avoid deep layout trees. - [View Flattening](/architecture/view-flattening.md): View Flattening is an optimization by the React Native renderer to avoid deep layout trees. ### xplat-implementation The React Native renderer utilizes a core render implementation to be shared across platforms - [Cross Platform Implementation](/architecture/xplat-implementation.md): The React Native renderer utilizes a core render implementation to be shared across platforms ## community ### communities The React Native Community - [Communities](/community/communities.md): The React Native Community ### overview The React Native Community - [Overview](/community/overview.md): The React Native Community ### staying-updated The React Native Community - [Staying up to date](/community/staying-updated.md): The React Native Community ### support Where to get help - [Where to get help](/community/support.md): Where to get help ## showcase Thousands of apps are using React Native, check out these apps! - [Who is using React Native?](/showcase.md): Thousands of apps are using React Native, check out these apps! ## contributing ### bots-reference pull-bot - [Bots Reference](/contributing/bots-reference.md): pull-bot ### changelogs-in-pull-requests The changelog entry in your pull request serves as a sort of "tl;dr do they affect Android? are these breaking changes? is something new being added? - [Changelogs in Pull Requests](/contributing/changelogs-in-pull-requests.md): The changelog entry in your pull request serves as a sort of "tl;dr do they affect Android? are these breaking changes? is something new being added? ### contribution-license-agreement You must sign a Contribution License Agreement (CLA) before your pull request can be merged. This a one-time requirement for Meta projects in GitHub. You can read more about Contributor License Agreements (CLA) on Wikipedia. - [Contribution License Agreement](/contributing/contribution-license-agreement.md): You must sign a Contribution License Agreement (CLA) before your pull request can be merged. This a one-time requirement for Meta projects in GitHub. You can read more about Contributor License Agreements (CLA) on Wikipedia. ### how-to-build-from-source You will need to build React Native from source if you want to work on a new feature/bug fix, try out the latest features which are not released yet, or maintain your own fork with patches that cannot be merged to the core. - [How to Build from Source](/contributing/how-to-build-from-source.md): You will need to build React Native from source if you want to work on a new feature/bug fix, try out the latest features which are not released yet, or maintain your own fork with patches that cannot be merged to the core. ### how-to-contribute-code Thank you for your interest in contributing to React Native! From commenting on and triaging issues, to reviewing and sending PRs, all contributions are welcome. In this document, we'll cover the steps to contributing code to React Native. - [How to Contribute Code](/contributing/how-to-contribute-code.md): Thank you for your interest in contributing to React Native! From commenting on and triaging issues, to reviewing and sending PRs, all contributions are welcome. In this document, we'll cover the steps to contributing code to React Native. ### how-to-open-a-pull-request These instructions provide the step-by-step process to set up your machine to make contributions to the core React Native repository, and create your first pull request. - [How to Open a Pull Request](/contributing/how-to-open-a-pull-request.md): These instructions provide the step-by-step process to set up your machine to make contributions to the core React Native repository, and create your first pull request. ### how-to-report-a-bug Reporting a bug for React Native is one of the best way to start contributing to the project. We use GitHub issues as the main channel for handling new bug reports. - [How to Report a Bug](/contributing/how-to-report-a-bug.md): Reporting a bug for React Native is one of the best way to start contributing to the project. We use GitHub issues as the main channel for handling new bug reports. ### how-to-run-and-write-tests Running Tests - [How to Run and Write Tests](/contributing/how-to-run-and-write-tests.md): Running Tests ### labeling-github-issues Most of our labels have a prefix that provides a hint of their purpose. - [Labeling GitHub Issues](/contributing/labeling-github-issues.md): Most of our labels have a prefix that provides a hint of their purpose. ### managing-pull-requests Reviewing a pull request can take a considerable amount of time. In some cases, the review might require more time to perform than it took someone to write and submit their changes! It's therefore necessary to do some preliminary work to ensure each pull request is in a good state to be reviewed. - [Managing Pull Requests](/contributing/managing-pull-requests.md): Reviewing a pull request can take a considerable amount of time. In some cases, the review might require more time to perform than it took someone to write and submit their changes! It's therefore necessary to do some preliminary work to ensure each pull request is in a good state to be reviewed. ### overview How to contribute to React Native - [Contributing Overview](/contributing/overview.md): How to contribute to React Native ### triaging-github-issues Start out by looking at issues that need triage, as identified by the "Needs: Triage" label. - [Triaging GitHub Issues](/contributing/triaging-github-issues.md): Start out by looking at issues that need triage, as identified by the "Needs: Triage" label. ## versions - [React Native versions](/versions.md) ## blog Blog - [Blog · React Native](/blog.md): Blog ### 2023 #### 01 - [First-class Support for TypeScript](/blog/2023/01/03/typescript-first.md): With the release of 0.71, React Native is investing in the TypeScript experience with the following changes: - [React Native 0.71: TypeScript by Default, Flexbox Gap, and more...](/blog/2023/01/12/version-071.md): Today we’re releasing React Native version 0.71! This is a feature-packed release including: - [React Native 0.71-RC0 Android outage postmortem](/blog/2023/01/27/71rc1-android-outage-postmortem.md): 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. #### 06 - [React Native 0.72 - Symlink Support, Better Errors, and more](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md): Today we’re releasing 0.72! - [Package Exports Support in React Native](/blog/2023/06/21/package-exports-support.md): 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: #### 12 - [React Native 0.73 - Debugging Improvements, Stable Symlink Support, and more](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md): 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! ### 2024 #### 04 - [React Native 0.74 - Yoga 3.0, Bridgeless New Architecture, and more](/blog/2024/04/22/release-0.74.md): 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. #### 06 - [Use a framework to build React Native apps](/blog/2024/06/25/use-a-framework-to-build-react-native-apps.md): 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. #### 08 - [React Native 0.75 - Support for Percentage Values in Layout, New Architecture Stabilization, Template & init Updates, and more](/blog/2024/08/12/release-0.75.md): Today we are excited to release React Native 0.75! #### 10 - [React Native 0.76 - New Architecture by default, React Native DevTools, and more](/blog/2024/10/23/release-0.76-new-architecture.md): Today we are excited to release React Native 0.76! - [New Architecture is here](/blog/2024/10/23/the-new-architecture-is-here.md): React Native 0.76 with the New Architecture by default is now available on npm! ### 2025 #### 01 - [React Native 0.77 - New Styling Features, Android’s 16KB page support, Swift Template](/blog/2025/01/21/version-0.77.md): Today we are excited to release React Native 0.77! #### 02 - [React Native Core Contributor Summit 2024 Recap](/blog/2025/02/03/react-native-core-contributor-summit-2024.md): Every year, the core contributors in the React Native Community get together with the React Native team to collaboratively shape the direction of this project. - [React Native 0.78 - React 19 and more](/blog/2025/02/19/react-native-0.78.md): Today we are excited to release React Native 0.78! #### 04 - [React Native 0.79 - Faster tooling and much more](/blog/2025/04/08/react-native-0.79.md): Today we are excited to release React Native 0.79! #### 06 - [Moving Towards a Stable JavaScript API (New Changes in 0.80)](/blog/2025/06/12/moving-towards-a-stable-javascript-api.md): In React Native 0.80, we're introducing two significant changes to React Native's JavaScript API — the deprecation of deep imports, and our new Strict TypeScript API. These are part of an ongoing effort to accurately define our API and offer dependable type safety to users and frameworks. - [React Native 0.80 - React 19.1, JS API Changes, Freezing Legacy Arch and much more](/blog/2025/06/12/react-native-0.80.md): Today we are excited to release React Native 0.80! #### 08 - [React Native 0.81 - Android 16 support, faster iOS builds, and more](/blog/2025/08/12/react-native-0.81.md): Today we are excited to release React Native 0.81! #### 10 - [React Native 0.82 - A New Era](/blog/2025/10/08/react-native-0.82.md): Today we're excited to release React Native 0.82: the first React Native that runs entirely on the New Architecture. #### 12 - [React Native 0.83 - React 19.2, New DevTools features, no breaking changes](/blog/2025/12/10/react-native-0.83.md): Today we are excited to release React Native 0.83! ### 2026 #### 02 - [React Native 0.84 - Hermes V1 by Default](/blog/2026/02/11/react-native-0.84.md): Today we're excited to release React Native 0.84! - [React Native Comes to Meta Quest](/blog/2026/02/24/react-native-comes-to-meta-quest.md): React Native has always focused on helping developers reuse knowledge across platforms. What started with Android and iOS has steadily expanded to Apple TV, Windows, macOS, and even the web with react-strict-dom. In 2021, the Many Platform Vision post outlined a future where React Native could adapt to new devices and form factors without fragmenting the ecosystem. #### 04 - [React Native 0.85 - New Animation Backend, New Jest Preset Package](/blog/2026/04/07/react-native-0.85.md): Today we are excited to release React Native 0.85! --- # Full Documentation Content ## [React Native 0.85 - New Animation Backend, New Jest Preset Package](/blog/2026/04/07/react-native-0.85.md) April 7, 2026 · 6 min read ![Alan Lee](https://github.com/alanleedev.png) Alan Lee Software Engineer @ Meta [](https://github.com/alanleedev "GitHub") ![Calix Tang](https://github.com/CalixTang.png) Calix Tang Software Engineer @ Meta [](https://github.com/CalixTang "GitHub") ![Mathieu Acthernoene](https://github.com/zoontek.png) Mathieu Acthernoene Software Engineer @ Expo [](https://github.com/zoontek "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Bartłomiej Błoniarz](https://github.com/bartlomiejbloniarz.png) Bartłomiej Błoniarz Software Engineer @ Software Mansion [](https://github.com/bartlomiejbloniarz "GitHub") ![Dawid Małecki](https://github.com/coado.png) Dawid Małecki Software Engineer @ Software Mansion [](https://github.com/coado "GitHub") ![Zeya Peng](https://github.com/zeyap.png) Zeya Peng Software Engineer @ Meta [](https://github.com/zeyap "GitHub") ![Samuel Susla](https://github.com/sammy-SC.png) Samuel Susla Software Engineer @ Meta [](https://x.com/SamuelSusla "X")[](https://github.com/sammy-SC "GitHub") Today we are excited to release React Native 0.85! This release includes the New Animation Backend, moves the Jest preset to a dedicated package, and includes many other improvements and fixes. ### Highlights[​](#highlights "Direct link to Highlights") * [New Animation Backend](/blog/2026/04/07/react-native-0.85.md#new-animation-backend) * [React Native DevTools Improvements](/blog/2026/04/07/react-native-0.85.md#react-native-devtools-improvements) * [Metro TLS Support](/blog/2026/04/07/react-native-0.85.md#metro-tls-support) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Jest Preset Moved to New Package](/blog/2026/04/07/react-native-0.85.md#jest-preset-moved-to-new-package) * [Dropped Support for EOL Node.js Versions](/blog/2026/04/07/react-native-0.85.md#dropped-support-for-eol-nodejs-versions) * [`StyleSheet.absoluteFillObject` Removed](/blog/2026/04/07/react-native-0.85.md#stylesheetabsolutefillobject-removed) * [Other Breaking Changes](/blog/2026/04/07/react-native-0.85.md#other-breaking-changes) **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) [**Read more**](/blog/2026/04/07/react-native-0.85.md) --- # First-class Support for TypeScript January 3, 2023 · 6 min read ![Luna Wei](https://github.com/lunaleaps.png) Luna Wei Software Engineer @ Meta [](https://x.com/lunaleaps "X")[](https://github.com/lunaleaps "GitHub") ![Nick Gerleman](https://github.com/NickGerleman.png) Nick Gerleman Software Engineer @ Meta [](https://github.com/NickGerleman "GitHub") With the release of 0.71, React Native is investing in the TypeScript experience with the following changes: * [New app template is TypeScript by default](/blog/2023/01/03/typescript-first.md#new-app-template-is-typescript-by-default) * [TypeScript declarations shipped with React Native](/blog/2023/01/03/typescript-first.md#declarations-shipped-with-react-native) * [React Native documentation is TypeScript First](/blog/2023/01/03/typescript-first.md#documentation-is-typescript-first) In this post we’ll cover what these changes mean for you as a TypeScript or Flow user. ## New App Template is TypeScript By Default[​](#new-app-template-is-typescript-by-default "Direct link to New App Template is TypeScript By Default") 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! ``` npx react-native init My71App --version 0.71.0 ``` ![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 \"App.tsx\" to illustrate it is running a TypeScript file.](/assets/images/typescript-first-new-app-bde99d698e8a3a0733e8b0b455392f74.png) The starting point of a newly generated app will be `App.tsx` instead of `App.js` – fully TypeScript typed. The new project is already set up with a `tsconfig.json` so out of the box your IDE will help you write typed code right away! ## Declarations Shipped with React Native[​](#declarations-shipped-with-react-native "Direct link to Declarations Shipped with React Native") 0.71 is the first release with built-in TypeScript (TS) declarations. Prior, TypeScript declarations for React Native were provided by [`@types/react-native`](https://www.npmjs.com/package/@types/react-native) hosted in the [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) repository. The decision to co-locate TypeScript types with React Native source was for improved correctness and maintenance. `@types/react-native` 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 `@types/react-native` 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. 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. This change also removes a dependency for React Native users to manage. When upgrading to 0.71 or above, you can remove `@types/react-native` as a dependency. [Refer to the new app template on how to set up TypeScript support.](https://github.com/facebook/react-native/blob/main/template/tsconfig.json) We plan to deprecate `@types/react-native` for versions 0.73 and onward. Concretely this means: * `@types/react-native` 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. * For React Native 0.73 and onward, TS types will only be available from React Native. ### How to Migrate[​](#how-to-migrate "Direct link to How to Migrate") Please migrate to the new co-located types at your earliest convenience. Here are more details on migrating based on your needs. #### App Maintainer[​](#app-maintainer "Direct link to App Maintainer") Once you upgrade to React Native >= 0.71, you can remove the `@types/react-native` from your `devDependency`. note If you have warnings because a library you use references `@types/react-native` as a `peerDependency`, file an issue or open a PR for that library to use [optional peerDependencies](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependenciesmeta) and ignore the warning for now. #### Library Maintainer[​](#library-maintainer "Direct link to Library Maintainer") Libraries that target versions of React Native below 0.71 may use a `peerDependency` of `@types/react-native` to typecheck against the apps version of typings. This dependency should be marked as optional in [`peerDependenciesMeta`](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#peerdependenciesmeta) so that the typings are not required for users without TypeScript or for 0.71 users where typings are built-in. #### Maintainer of TypeScript declarations that depend on `@types/react-native`[​](#maintainer-of-typescript-declarations-that-depend-on-typesreact-native "Direct link to maintainer-of-typescript-declarations-that-depend-on-typesreact-native") Check out the [breaking changes introduced with 0.71](https://github.com/facebook/react-native/blob/main/CHANGELOG.md) to see if you’re ready to migrate. ### What if I use Flow?[​](#what-if-i-use-flow "Direct link to What if I use Flow?") 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. Flow users have previously upgraded React Native’s Flow types by merging in the `.flowconfig` from the new app template and manually updating `flow-bin`. The new app template no longer has a `.flowconfig`, but [one is still present in the React Native repository](https://github.com/facebook/react-native/blob/main/.flowconfig) that can be used as a basis for your app. If you need to start a new React Native app in Flow, you can reference the [new app template from 0.70](https://github.com/facebook/react-native/tree/0.70-stable/template). ### What if I find a bug in the TypeScript declaration?[​](#what-if-i-find-a-bug-in-the-typescript-declaration "Direct link to What if I find a bug in the TypeScript declaration?") Regardless of whether you’re using built-in TS types or `@types/react-native`, if you find a bug please submit a PR to both [React Native](https://github.com/facebook/react-native) and [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) repositories. If you don’t know how to fix it, please file a GitHub issue in the React Native repository and mention [@lunaleaps](https://github.com/lunaleaps) on the issue. ## Documentation is TypeScript First[​](#documentation-is-typescript-first "Direct link to Documentation is TypeScript First") To ensure a consistent TypeScript experience, we have made several updates to the React Native documentation to reflect TypeScript as the new default language. 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. 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! ## Thank you to the React Native TypeScript community\![​](#thank-you-to-the-react-native-typescript-community "Direct link to Thank you to the React Native TypeScript community!") 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. We want to thank all the [contributors](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-native/index.d.ts#L3) that have been maintaining `@types/react-native` since [2015](https://github.com/DefinitelyTyped/DefinitelyTyped/commit/efce0c25ec532a4651859f10eda49e97a5716a42)! We see the effort and care you all have put into making sure React Native users have the best experience. Thank you to [@acoates](https://github.com/acoates), [@eps1lon](https://github.com/eps1lon), [@kelset](https://github.com/kelset), [@tido64](https://github.com/tido64), [@Titozzz](https://github.com/Titozzz), and [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT) for your help consulting, questioning, communicating and reviewing changes to move the TypeScript types to React Native. Similarly, we want to thank the [maintainers of `react-native-template-typescript`](https://github.com/react-native-community/react-native-template-typescript/graphs/contributors) for supporting the TypeScript experience for new app development in React Native since day one. We look forward to collaborating more directly in the React Native repository and continue improving the React Native developer experience! **Tags:** * [typescript](/blog/tags/typescript) * [engineering](/blog/tags/engineering) --- # React Native 0.71: TypeScript by Default, Flexbox Gap, and more... January 12, 2023 · 13 min read ![Matt Carroll](https://github.com/mattcarrollcode.png) Matt Carroll Developer Advocate @ Meta [](https://github.com/mattcarrollcode "GitHub") ![Nick Gerleman](https://github.com/NickGerleman.png) Nick Gerleman Software Engineer @ Meta [](https://github.com/NickGerleman "GitHub") ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") ![Lorenzo Sciandra](https://github.com/kelset.png) Lorenzo Sciandra Senior Software Engineer @ Microsoft [](https://x.com/kelset "X")[](https://github.com/kelset "GitHub") Today we’re releasing React Native version 0.71! This is a feature-packed release including: * [TypeScript by default](/blog/2023/01/12/version-071.md#typescript-by-default) * [Simplifying layouts with Flexbox Gap](/blog/2023/01/12/version-071.md#simplifying-layouts-with-flexbox-gap) * [Web-inspired props for accessibility, styles, and events](/blog/2023/01/12/version-071.md#web-inspired-props-for-accessibility-styles-and-events) * [Restoring PropTypes](/blog/2023/01/12/version-071.md#restoring-proptypes) * [Developer Experience Improvements](/blog/2023/01/12/version-071.md#developer-experience-improvements) * [New Architecture Updates](/blog/2023/01/12/version-071.md#new-architecture) In this post we’ll cover some of the highlights of 0.71. info For a full list of changes, check out [CHANGELOG.md](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v071). ## TypeScript by default[​](#typescript-by-default "Direct link to TypeScript by default") In this release, we’re investing in the TypeScript experience of React Native. 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 `tsconfig.json` so out of the box your IDE will help you write typed code right away. We’re also offering built-in, more accurate TypeScript declarations directly from the `react-native` package. This means you won’t need `@types/react-native` any longer, and the types will be updated in lockstep with React Native releases. Finally, our documentation has been updated to feature TypeScript for all examples. note After upgrading to React Native 0.71, we recommend removing `@types/react-native` from your package.json `devDependencies`. For more details on this change, including migration steps and how this affects Flow users, check out our previous post [First-class Support for TypeScript](https://reactnative.dev/blog/2023/01/03/typescript-first). ## Simplifying layouts with Flexbox gap[​](#simplifying-layouts-with-flexbox-gap "Direct link to Simplifying layouts with Flexbox gap") With React Native you can flexibly layout components on different screen sizes using Flexbox. Browsers have supported the Flexbox properties [gap](https://developer.mozilla.org/en-US/docs/Web/CSS/gap), [rowGap](https://developer.mozilla.org/en-US/docs/Web/CSS/row-gap), and [columnGap](https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap), which allow you to specify the amount of space between all items in a Flexbox. 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. 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. The following shows a layout where we start by giving each child `margin: 10` style: ![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.](/assets/images/FlexboxGapBefore-df4400a35538a4cc6118d5eaf6ffeb1c.png) 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. With flex gap, this layout can be achieved by setting `gap: 10` on the container for a 10 pixel gap between the interior of the cards: ![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.](/assets/images/FlexboxGapAfter-be4a3ee8b621e11a32f9096e72ac2a65.png) For more information on Flexbox gaps, see [this blogpost from CSS Tricks](https://css-tricks.com/minding-the-gap/#aa-flexbox-gaps). ## Web-inspired props for accessibility, styles, and events[​](#web-inspired-props-for-accessibility-styles-and-events "Direct link to Web-inspired props for accessibility, styles, and events") 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. 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 `src` prop alias for `source` on the Image component to align with the `src` prop on web. If both `src` and `source` are provided, the new `src` prop will be used. note For more background on aligning React Native to web standards, check out this [proposal](https://github.com/necolas/discussions-and-proposals/blob/reduce-fragmentation/proposals/0000-reduce-fragmentation.md) and [related discussion](https://github.com/react-native-community/discussions-and-proposals/pull/496). #### Accessibility[​](#accessibility "Direct link to Accessibility") We introduced ARIA props as alias to existing React Native accessibility props. These props now exist on all core components of React Native:`aria-label`, `aria-labelledby`,`aria-modal`, `id`, `aria-busy`, `aria-checked`, `aria-disabled`, `aria-expanded`, `aria-selected`, `aria-valuemax`, `aria-valuemin`, `aria-valuenow`, and `aria-valuetext`. We also introduced equivalent web behavior for: `aria-hidden`, `aria-live`, `role`, and `tabIndex`. See this [issue](https://github.com/facebook/react-native/issues/34424) for more details. #### Component-Specific Behavior[​](#component-specific-behavior "Direct link to Component-Specific Behavior") There were also props introduced to align prop names with equivalent DOM prop names for core components. * **Image**: `alt`, `tintColor`, `crossOrigin`, `height`, `referrerPolicy`, `src`, `srcSet`, and `width`. * **TextInput**: `autoComplete`, `enterKeyHint`, `inputMode`, `readOnly`, and `rows`. See this [issue](https://github.com/facebook/react-native/issues/34424) for more details. #### Styles[​](#styles "Direct link to Styles") To align with certain CSS styles, there have been feature extensions for the following styles: * [`aspectRatio`](https://reactnative.dev/docs/layout-props#aspectratio) now supports string values * [`fontVariant`](https://reactnative.dev/docs/text-style-props#fontvariant) now supports space-separated string values * [`fontWeight`](https://reactnative.dev/docs/text-style-props#fontWeight) now supports number values * [`transform`](https://developer.mozilla.org/en-US/docs/Web/CSS/transform) now supports string values The following aliases have been added to shadow existing React Native styles: * [`objectFit`](https://reactnative.dev/docs/image#objectfit) * [`pointerEvents`](https://reactnative.dev/docs/view-style-props#pointerevents) * [`userSelect`](https://developer.mozilla.org/en-US/docs/Web/CSS/user-select) * [`verticalAlign`](https://reactnative.dev/docs/text-style-props#verticalalign-android) See this [issue](https://github.com/facebook/react-native/issues/34425) for more details. #### Events[​](#events "Direct link to Events") Finally, we also added an opt-in implementation of [PointerEvents](https://w3c.github.io/pointerevents) Once enabled, the following handlers on `View` will support hover: * `onPointerOver`, `onPointerOut` * `onPointerEnter`, `onPointerLeave` These events are also implemented in `Pressability` for new opt-in support for hover. To enable these features, set the following flags to true: ``` import ReactNativeFeatureFlags from 'react-native/Libraries/ReactNative/ReactNativeFeatureFlags'; // enable the JS-side of the w3c PointerEvent implementation ReactNativeFeatureFlags.shouldEmitW3CPointerEvents = () => true; // enable hover events in Pressibility to be backed by the PointerEvent implementation. // shouldEmitW3CPointerEvents should also be true ReactNativeFeatureFlags.shouldPressibilityUseW3CPointerEventsForHover = () => true; ``` note You’ll also need to enable React feature flags on your [Android](https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#android-specific) and [iOS](https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native#ios-specific) native setup. Check out our dedicated [PointerEvents post](https://reactnative.dev/blog/2022/12/13/pointer-events-in-react-native) to learn more. ## Restoring PropTypes[​](#restoring-proptypes "Direct link to Restoring PropTypes") React Native’s prop types, such as `ViewPropTypes` and `Text.propTypes`, 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. 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 ([issue one](https://github.com/facebook/react-native/pull/34650), [issue two](https://github.com/react-native-community/cli/pull/1699)). Second, the deprecation warnings were being [incorrectly filtered](https://github.com/facebook/react-native/commit/fa2842d) by `LogBox.ignoreLogs`. Both of these have now been fixed, but we want to give people more time to upgrade the deprecated call sites. 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 `deprecated-react-native-prop-types` 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. caution As part of this change, we are also removing the console filtering from `LogBox.ignoreLog`. This means logs that you have previously filtered with `Logbox.ignoreLog` will start appearing again in the console when you upgrade. This is expected, because it allows logs such as deprecation warnings to be found and fixed. ## Developer Experience Improvements[​](#developer-experience-improvements "Direct link to Developer Experience Improvements") ### React DevTools[​](#react-devtools "Direct link to React DevTools") In this release, we've brought two popular React DevTools features on web to React Native. "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. 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. Here are both features in action: ![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.](/assets/images/ElementInspecting-88d15de53d0f0256fbb90d949567f703.gif) ### Hermes[​](#hermes "Direct link to Hermes") In React Native 0.70, we made [Hermes the default engine for React Native](https://reactnative.dev/blog/2022/07/08/hermes-as-the-default). In React Native 0.71, we’re upgrading Hermes with a few notable improvements: * **Improve source maps**: 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. * **Improve `JSON.parse` performance**: This version includes a performance optimization that improves the performance of `JSON.parse` up to 30%. * **Add support for `.at()`**: Hermes now [supports](https://github.com/facebook/hermes/issues/823)`.at()` for `String`, `TypedArray`, and `Array`. For a full list of changes see [the Road to 71 issue](https://github.com/reactwg/react-native-releases/discussions/41#discussioncomment-4089256). ### New Architecture[​](#new-architecture "Direct link to New Architecture") This release brings many improvements to the experimental New Architecture experience based on user feedback and reports we collected so far. * **Reduced build times**: 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. [Read more here](https://github.com/reactwg/react-native-new-architecture/discussions/105). * **Write less C++ code**: 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. [Read more here](https://github.com/reactwg/react-native-new-architecture/discussions/101). * **Better encapsulation of iOS app setup**: On iOS, we followed a similar approach to Android and encapsulated most of the logic to set up the New Architecture in the `RCTAppDelegate` class, which will simplify upgrades in the future with fewer manual breaking changes. * **Better dependency management on iOS**: For library maintainers, we've added a new `install_module_dependencies` function to call inside your package `podspec` which will install all the required dependencies for the New Architecture. * **Bug fixes and better IDE support**: we fixed several bugs and issues (like [better IDE support for Android](https://github.com/reactwg/react-native-new-architecture/discussions/102)) that were reported by our users in the [New Architecture Working Group](https://github.com/reactwg/react-native-new-architecture/discussions). 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 [New Architecture documentation](https://reactnative.dev/docs/new-architecture-intro) and post any feedback you have to the [New Architecture Working Group](https://github.com/reactwg/react-native-new-architecture/discussions). ### Other Notable Fixes[​](#other-notable-fixes "Direct link to Other Notable Fixes") * **Better stack frame collapsing**: We've [updated the list of internal frames](https://github.com/react-native-community/cli/pull/1699) for React Native so LogBox will show your code more often rather than internal React Native frames, helping you to debug issues faster. * **Build time improvements:** 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. * **Android template improvements**: 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 [new dedicated page on the website](https://reactnative.dev/docs/react-native-gradle-plugin). ## Breaking changes[​](#breaking-changes "Direct link to Breaking changes") * **Changes to Console Logging:** `LogBox.ignoreLog` no longer filters console logs. This means you will start seeing logs in the console that you have silenced in LogBox. See [this comment](https://github.com/facebook/react-native/pull/34476#issuecomment-1240667794) for more details. * **Removed AsyncStorage and MaskedViewIOS**: These components have been deprecated since version [0.59](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#deprecated-8), so it’s time we remove them entirely. For alternatives, please check [React Native Directory](https://reactnative.directory/) for community packages that cover those use cases. * **JSCRuntime moved to react-jsc:** 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 ([facebook/react-native@6b129d8](https://github.com/facebook/react-native/commit/6b129d81ed8cab301775d2a04971e255df9290de)). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") This release is possible thanks to the work of 70+ contributors adding over 1000 commits. We especially want to thank those who contributed to these major React Native projects: * **Flexbox Gap Support**: [@intergalacticspacehighway](https://github.com/intergalacticspacehighway) and [@jacobp100](https://github.com/jacobp100). * **Web-inspired props**: [@gabrieldonadel](https://github.com/gabrieldonadel) [@dakshbhardwaj](https://github.com/dakshbhardwaj) [@dhruvtailor7](https://github.com/dhruvtailor7) [@ankit-tailor](https://github.com/ankit-tailor) [@madhav23bansal](https://github.com/madhav23bansal). * **Codegen Improvements**: [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky), [@MaeIg](https://github.com/MaeIg), [@Marcoo09](https://github.com/Marcoo09), [@Naturalclar](https://github.com/Naturalclar), [@Pranav-yadav](https://github.com/Pranav-yadav), [@ZihanChen-MSFT](https://github.com/ZihanChen-MSFT), [@dakshbhardwaj](https://github.com/dakshbhardwaj), [@dhruvtailor7](https://github.com/dhruvtailor7), [@gabrieldonadel](https://github.com/gabrieldonadel), [@harshsiri110](https://github.com/harshsiri110), [@ken0nek](https://github.com/ken0nek), [@kylemacabasco](https://github.com/kylemacabasco), [@matiassalles99](https://github.com/matiassalles99), [@mdaj06](https://github.com/mdaj06), [@mohitcharkha](https://github.com/mohitcharkha), [@tarunrajput](https://github.com/tarunrajput), [@vinayharwani13](https://github.com/vinayharwani13), [@youedd](https://github.com/youedd), [@byCedric](https://github.com/byCedric). Finally, thanks to [@cortinico](https://github.com/cortinico), [@kelset](https://github.com/kelset), [@dmytrorykun](https://github.com/dmytrorykun), [@cipolleschi](https://github.com/cipolleschi), and [@titozzz](https://github.com/titozzz) for cutting this release! ## Try out 0.71.0 now\![​](#try-out-0710-now "Direct link to Try out 0.71.0 now!") For React Native CLI users, see the [upgrade documentation](https://reactnative.dev/docs/upgrading) for how to update your existing project, or create a new project with `npx react-native init MyProject`. React Native version 0.71 will be supported in Expo SDK version 48. info 0.71 is now the latest stable version of React Native and 0.68.x versions are now unsupported. For more information see [React Native’s support policy](https://github.com/reactwg/react-native-releases#releases-support-policy). **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) --- # React Native 0.71-RC0 Android outage postmortem January 27, 2023 · 8 min read ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") ![Lorenzo Sciandra](https://github.com/kelset.png) Lorenzo Sciandra Senior Software Engineer @ Microsoft [](https://x.com/kelset "X")[](https://github.com/kelset "GitHub") Now that 0.71 is [available](/blog/2023/01/12/version-071.md), 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. 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. ## What happened[​](#what-happened "Direct link to What happened") On November 4th 2022, we published the version `0.71.0-rc0` of React Native, the first release candidate for 0.71, on several public repositories. 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 [RFC#508](https://github.com/react-native-community/discussions-and-proposals/pull/508) and [related discussions](https://github.com/reactwg/react-native-new-architecture/discussions/105). 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 `0.71.0-rc0` instead of the version they were using in their project (like `0.68.0`). ## Why this happened[​](#why-this-happened "Direct link to Why this happened") The React Native template provides a `build.gradle` file to build Android apps. This file contains a dependency on the React Native Android library as follows: `implementation("com.facebook.react:react-native:+")`. Importantly, the `+` part of this dependency (a [Gradle Dynamic version](https://docs.gradle.org/current/userguide/dynamic_versions.html)) 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. We were aware of the issues dynamic versions could cause, so in `0.71` we cleaned up the new app template and removed all the `+` dependencies. However, users on older versions of React Native were still using a `+` version. This caused builds with React Native versions before `0.71.0-rc.0` 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 `0.68.0`) and artifacts from Maven Central (`0.71.0-rc.0`) caused these builds to fail. Further technical details on this event area are also available [on this GitHub issue](https://github.com/facebook/react-native/issues/35210). ## How we mitigated & resolved[​](#how-we-mitigated--resolved "Direct link to How we mitigated & resolved") 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. 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. At the same time, we [reached out to Sonatype](https://issues.sonatype.org/browse/OSSRH-86006) to ask for the removal of the offending artifacts. The issue was fully resolved on November 8th when the artifacts were fully removed from Maven Central. ## Timeline of events[​](#timeline-of-events "Direct link to Timeline of events") *This section contains a brief timeline of the events. All times are GMT/UTC +0* * Nov 4th - 5:06 PM: [0.71-RC0 is released](https://github.com/facebook/react-native/releases/tag/v0.71.0-rc.0). * Nov 4th - 6:20 PM: [First report of build issue is opened](https://github.com/facebook/react-native/issues/35204). * Nov 4th - 7:45 PM: [Issue is identified by community](https://github.com/facebook/react-native/issues/35204#issuecomment-1304090948). * Nov 4th - 9:39 PM: [Workarounds are communicated, Expo ](https://github.com/facebook/react-native/issues/35204#issuecomment-1304281740)deploys fix to all their users. * Nov 5th - 03:04 AM: [New issue is open to communicate status and workarounds](https://github.com/facebook/react-native/issues/35210). * Nov 6th - 04:11 PM: [Ticket to SonaType](https://issues.sonatype.org/browse/OSSRH-86006?focusedCommentId=1216303\&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1216303) asking for removal of the artifacts is open. * Nov 6th - 04:40 PM: [First tweet](https://twitter.com/reactnative/status/1589296764678705155) from @reactnative with ack + link to issue. * Nov 6th - 07:05 PM: Decision to patch React Native versions back to 0.63. * Nov 7th - 12:47 AM: Last patched release is released: [0.63.5](https://github.com/facebook/react-native/releases/tag/v0.63.5). * Nov 8th - 08:04 PM: Artifacts on Maven Central are [fully removed](https://issues.sonatype.org/browse/OSSRH-86006?focusedCommentId=1216303\&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1216303). * Nov 10th - 11:51 AM: Issue about the [incident is closed](https://github.com/facebook/react-native/issues/35210#issuecomment-1310170361). ## Lessons Learned[​](#lessons-learned "Direct link to Lessons Learned") 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. ### Incident response strategy[​](#incident-response-strategy "Direct link to Incident response strategy") This incident highlighted gaps in our incident response strategy for open-source issues related to React Native. 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. 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. 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. ### Release Support Policy[​](#release-support-policy "Direct link to Release Support Policy") As visualized in the [rn-versions tool](https://rn-versions.github.io/), 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. 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. 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. 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 [release support policy](https://github.com/reactwg/react-native-releases#releases-support-policy) was getting defined and wasn’t broadcasted or enforced yet. In the future, we will communicate our support policy over our communication channels and we will consider [deprecating older versions of React Native on npm](https://docs.npmjs.com/deprecating-and-undeprecating-packages-or-package-versions). ### Improved testing and best practices for 3rd party libraries[​](#improved-testing-and-best-practices-for-3rd-party-libraries "Direct link to Improved testing and best practices for 3rd party libraries") This incident highlighted the importance of having better release testing and better guidance to 3rd party libraries. On the testing side, releasing versions down to `0.63.x` 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. Specifically, we are now encouraging and supporting 3rd party library testing as part of the [release of react native](https://github.com/reactwg/react-native-releases/discussions/41). We’re also adding some new channels and roles in the [Core Contributors Discord Server](https://github.com/facebook/react-native/blob/main/ECOSYSTEM.md#core-contributors). On top of this, we started a closer collaboration with Callstack, the maintainers of [create-react-native-library](https://github.com/callstack/react-native-builder-bob/tree/main/packages/create-react-native-library), 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 `create-react-native-library` is now fully compatible with 0.71 projects while still offering backward compatibility. ## Conclusions[​](#conclusions "Direct link to Conclusions") 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. 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. 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. **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.72 - Symlink Support, Better Errors, and more June 21, 2023 · 8 min read ![Lorenzo Sciandra](https://github.com/kelset.png) Lorenzo Sciandra Senior Software Engineer @ Microsoft [](https://x.com/kelset "X")[](https://github.com/kelset "GitHub") ![Marek Fořt](https://github.com/fortmarek.png) Marek Fořt Software Engineer @ Shopify [](https://x.com/marekfort "X")[](https://github.com/fortmarek "GitHub") ![Riccardo Cipolleschi](https://github.com/cipolleschi.png) Riccardo Cipolleschi Software Engineer @ Meta [](https://x.com/CipolleschiR "X")[](https://github.com/cipolleschi "GitHub") ![Luna Wei](https://github.com/lunaleaps.png) Luna Wei Software Engineer @ Meta [](https://x.com/lunaleaps "X")[](https://github.com/lunaleaps "GitHub") Today we’re releasing 0.72! 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 [2022 community survey](https://github.com/react-native-community/discussions-and-proposals/discussions/528) -- thank you to all those that participated! ### Highlights[​](#highlights "Direct link to Highlights") * [New Metro Features](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#new-metro-features) * [Developer Experience Improvements](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#developer-experience-improvements) * [Moving New Architecture Updates](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#moving-new-architecture-updates) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Deprecated Component Removals](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#deprecated-component-removals) * [Package Renames](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#package-renames) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### New Metro Features[​](#new-metro-features "Direct link to New Metro Features") #### Symlink Support (Beta)[​](#symlink-support-beta "Direct link to Symlink Support (Beta)") 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. Symlink support enables React Native to work transparently with monorepo setups and pnpm, removing the need for workarounds. See [Enabling Beta Features](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#enabling-beta-features) to use in your app. It is currently in beta to collect feedback on developer experience given varying workflows, see more details [here](https://twitter.com/robjhogan/status/1672293540632641554). We plan to default enable symlinks in 0.73. #### Package Exports Support (Beta)[​](#package-exports-support-beta "Direct link to Package Exports Support (Beta)") [Package Exports](https://nodejs.org/api/packages.html#exports) is the modern alternative to the package.json `"main"` field and provides new capabilities for npm packages to define their public API and target React Native. By enabling Package Exports support in your Metro config, your app will be compatible with the wider JavaScript ecosystem, including via the new ["react-native" community condition](https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions). See [Enabling Beta Features](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#enabling-beta-features) to use in your app. tip See [Package Exports Support in React Native](/blog/2023/06/21/package-exports-support.md) to learn more about this feature and our plans for stable rollout. #### Enabling Beta Features[​](#enabling-beta-features "Direct link to Enabling Beta Features") To enable these features in your project, update your app’s `metro.config.js` file and set either the `resolver.unstable_enableSymlinks` or `resolver.unstable_enablePackageExports` options. ``` const config = { // ... resolver: { unstable_enableSymlinks: true, unstable_enablePackageExports: true, }, }; ``` #### New `metro.config.js` Setup[​](#new-metroconfigjs-setup "Direct link to new-metroconfigjs-setup") In React Native 0.72, we’ve changed the config loading setup for Metro in React Native CLI. Please update your project’s `metro.config.js` file to match the [template’s version](https://github.com/facebook/react-native/blob/76a42c292de838a0dd537935db792eaa81410b9b/packages/react-native/template/metro.config.js). info Please update your config file to the following [format](https://github.com/facebook/react-native/blob/76a42c292de838a0dd537935db792eaa81410b9b/packages/react-native/template/metro.config.js). You can also follow the [upgrade-helper](https://react-native-community.github.io/upgrade-helper/?from=0.71.8\&to=0.72.0). These format changes to `metro.config.js` will become required in 0.73. For 0.72, we will log a warning if not updated. 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 `metro get-dependencies`, will now work. ### Developer Experience Improvements[​](#developer-experience-improvements "Direct link to Developer Experience Improvements") #### No more redboxes with invalid style properties[​](#no-more-redboxes-with-invalid-style-properties "Direct link to No more redboxes with invalid style properties") 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. 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. #### Better error readability for Hermes[​](#better-error-readability-for-hermes "Direct link to Better error readability for Hermes") Hermes has added a better error message when invoking an undefined callable. ``` var x = undefined; x(); // Before: undefined is not a function // After: x is not a function (it is undefined) ``` In addition, LogBox stack traces now filter out internal Hermes bytecode frames that are not relevant to app users. #### Improved error output of the React Native CLI[​](#improved-error-output-of-the-react-native-cli "Direct link to Improved error output of the React Native CLI") 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 `init`, `run-android`, and `run-ios`. You can find other improvements in the [React Native CLI changelogs](https://github.com/react-native-community/cli/releases). #### Faster Compilation and JSON Parsing in Hermes[​](#faster-compilation-and-json-parsing-in-hermes "Direct link to Faster Compilation and JSON Parsing in Hermes") Hermes has improved the compilation time of large object literals. For example, in one reported issue, [#852](https://github.com/facebook/hermes/issues/852), 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% ([221c](https://github.com/facebook/hermes/commit/221ce21a209e2e32a3eaaa2d9e28ca81842fad20)). These improvements will benefit build times for apps that bundle many objects. Multiple optimizations ([de9c](https://github.com/facebook/hermes/commit/de9cff2aa41fc1f297b568848143347823d73659), [6e2d](https://github.com/facebook/hermes/commit/6e2dd652c8d90c5d59737a81f66a259efffdcd00)) to JSON parsing have also landed, benefiting apps using libraries like redux-persist that rely heavily on JSON manipulation. #### More ECMAScript Support in Hermes[​](#more-ecmascript-support-in-hermes "Direct link to More ECMAScript Support in Hermes") Support for the following specifications in Hermes has landed in React Native 0.72: * `prototype.at` support for [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at), [TypedArray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/at) and [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/at). See [#823](https://github.com/facebook/hermes/issues/823) ([ebe2](https://github.com/facebook/hermes/commit/ebe2915ac386a6b73dec39c2af4ac7063e68cd99)). * Implement [well-formed JSON.stringify](https://github.com/tc39/proposal-well-formed-stringify) ([d41d](https://github.com/facebook/hermes/commit/d41decf244aa814b1e58827a9de982f3b71667de)) to prevent ill-formed Unicode strings * Implement [AggregateError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError) ([9b25](https://github.com/facebook/hermes/commit/9b25a2530eb515f6c4fbd397ae290b6c97c049b2)) that represents several errors wrapped in a single error. Useful for multiple errors like from [`Promise.any()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any) when all promises passed to it reject. For users on JSC, these features are already available. ### Moving New Architecture Updates[​](#moving-new-architecture-updates "Direct link to Moving New Architecture Updates") 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 [working group](https://github.com/reactwg/react-native-new-architecture/discussions). This change will also allow for more frequent updates, such as work that ships in our nightlies. You can read the 0.72 updates for the New Architecture [here](https://github.com/reactwg/react-native-new-architecture/discussions/136). Subscribe to the working group GitHub notifications to stay informed on our progress on the New Architecture. ## Breaking Changes[​](#breaking-changes-1 "Direct link to Breaking Changes") ### Deprecated Component Removals[​](#deprecated-component-removals "Direct link to Deprecated Component Removals") The following packages have been removed from React Native in 0.72. Please migrate to the recommended community package: * [Slider](https://reactnative.dev/docs/0.72/slider) is superseded by [@react-native-community/slider](https://github.com/callstack/react-native-slider/tree/main/package) * [DatePickerIOS](https://reactnative.dev/docs/0.72/datepickerios) is superseded by [@react-native-community/datetimepicker](https://github.com/react-native-datetimepicker/datetimepicker) * [ProgressViewIOS](https://reactnative.dev/docs/0.72/progressviewios) is superseded by [@react-native-community/progress-view](https://github.com/react-native-progress-view/progress-view) ### Package Renames[​](#package-renames "Direct link to Package Renames") All packages published from the [`react-native`](https://github.com/facebook/react-native) core repository now live under `react-native/packages`, and are published under the [@react-native npm scope](https://www.npmjs.com/search?q=%40react-native) to ensure clear ownership. There are no changes to the [react-native](https://www.npmjs.com/package/react-native) package. | Old Package Name | New Package Name | | --------------------------------------- | -------------------------------- | | `@react-native-community/eslint-config` | `@react-native/eslint-config` | | `@react-native-community/eslint-plugin` | `@react-native/eslint-plugin` | | `@react-native/polyfills` | `@react-native/js-polyfills` | | `@react-native/normalize-color` | `@react-native/normalize-colors` | | `@react-native/assets` | `@react-native/assets-registry` | | `react-native-codegen` | `@react-native/codegen` | | `react-native-gradle-plugin` | `@react-native/gradle-plugin` | 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. You can read the motivation that led to these changes [in the dedicated RFC](https://github.com/react-native-community/discussions-and-proposals/pull/480). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") A lot of this release came from the direct feedback from the community. From reports on [noisy redboxes](https://twitter.com/baconbrix/status/1623039650775371792), [bugs with Package Exports](https://github.com/facebook/metro/issues/965), [benchmarks for the New Architecture](https://github.com/reactwg/react-native-new-architecture/discussions/85) — all of it is valuable to hear and we appreciate the time it takes to share feedback. 0.72 contains over [1100 commits](https://github.com/facebook/react-native/compare/v0.71.8...v0.72.0) from 66 contributors. Thank you for all your hard work! ## Upgrade to 0.72[​](#upgrade-to-072 "Direct link to Upgrade to 0.72") Check out the list of needed changes in the [upgrade-helper](https://react-native-community.github.io/upgrade-helper/), or read the [upgrade documentation](/docs/upgrading.md) for how to update your existing project, or create a new project with `npx react-native@latest init MyProject`. If you use Expo, React Native version 0.72 will be supported in the Expo SDK 49 release. info 0.72 is now the latest stable version of React Native and 0.69.x version moves now to unsupported. For more information see [React Native’s support policy](https://github.com/reactwg/react-native-releases#releases-support-policy). **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) --- # Package Exports Support in React Native June 21, 2023 · 10 min read ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") With the release of [React Native 0.72](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md), Metro — our JavaScript build tool — now includes beta support for the `package.json` [`"exports"`](https://nodejs.org/docs/latest-v18.x/api/packages.html#exports) field. When [enabled](/blog/2023/06/21/package-exports-support.md#enabling-package-exports-beta), it adds the following functionality: * [React Native projects will work with more npm packages out-of-the-box](/blog/2023/06/21/package-exports-support.md#for-app-developers) * [New capabilities for packages to define their API and target React Native](/blog/2023/06/21/package-exports-support.md#for-package-maintainers-preview) * [Some breaking changes to package resolution (in edge cases)](/blog/2023/06/21/package-exports-support.md#breaking-changes) 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. ## What is Package Exports?[​](#what-is-package-exports "Direct link to What is Package Exports?") Introduced in Node.js 12.7.0, Package Exports is the modern approach for npm packages to specify **entry points** — the mapping of package subpaths which can be externally imported and which file(s) they should resolve to. Supporting `"exports"` improves how React Native projects will work with the wider JavaScript ecosystem ([used in \~16.6k packages today](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\&type=code)), and gives package authors a standardised feature set for multiplatform packages to target React Native. [`"exports"`](https://nodejs.org/docs/latest-v19.x/api/packages.html#exports) can be used alongside, or instead of, [`"main"`](https://nodejs.org/docs/latest-v19.x/api/packages.html#main) in a `package.json` file. ``` { "name": "@storybook/addon-actions", "main": "./dist/index.js", ... "exports": { ".": { "node": "./dist/index.js", "import": "./dist/index.mjs", "default": "./dist/index.js" }, "./preview": { "import": "./dist/preview.mjs", "default": "./dist/preview.js" }, ... "./package.json": "./package.json" } } ``` Here's some app code consuming the above package by importing different subpaths of `@storybook/addon-actions`. ``` import {action} from '@storybook/addon-actions'; // -> '@storybook/addon-actions/dist/index.js' import {action} from '@storybook/addon-actions/preview'; // -> '@storybook/addon-actions/dist/preview.js' import helpers from '@storybook/addon-actions/src/preset/addArgsHelpers'; // Inaccessible - not listed in "exports"! ``` The headlining features of Package Exports are: * **Package encapsulation**: Only subpaths defined in `"exports"` can be imported from outside the package — giving packages control over their public API. * **Subpath aliases**: Packages can define custom subpaths which map to a different file location (including via [subpath patterns](https://nodejs.org/docs/latest-v19.x/api/packages.html#subpath-patterns)) — allowing relocation of files while preserving the public API. * **Conditional exports**: A subpath may resolve to a different underlying file depending on environment. For example, to target `"node"`, `"browser"`, or `"react-native"` runtimes — replacing the [`"browser"` field spec](https://github.com/defunctzombie/package-browser-field-spec). note The full capabilities for `"exports"` are detailed in the [Node.js Package Entry Points spec](https://nodejs.org/docs/latest-v19.x/api/packages.html#package-entry-points). Since these features overlap with existing React Native concepts (such as [platform-specific extensions](/docs/platform-specific-code.md)), and since `"exports"` 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 ([PR](https://github.com/react-native-community/discussions-and-proposals/pull/534), [final RFC](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0534-metro-package-exports-support.md)). ## For app developers[​](#for-app-developers "Direct link to For app developers") Package Exports can be enabled today, in beta. * Imports against packages that depend on Package Exports features (such as [**Firebase**](https://www.npmjs.com/package/firebase) and [**Storybook**](https://www.npmjs.com/search?q=%40storybook)) should now work as designed. * React Native for Web projects using Metro will now be able to use the `"browser"` conditional export, removing the need for workarounds. Enabling Package Exports brings a few [edge-case breaking changes](#breaking-changes) that may affect specific projects, and which you can [test today](#validating-changes-in-your-project). **In a future React Native release, Package Exports will be enabled by default**. In a chicken-and-egg situation, React Native apps were previously a holdout for some packages to migrate to `"exports"` — or used our `"react-native"` root field escape hatch. Supporting these features in Metro will allow the ecosystem to move forward. ### Enabling Package Exports (beta)[​](#enabling-package-exports-beta "Direct link to Enabling Package Exports (beta)") Package Exports can be enabled in your app's [**metro.config.js**](https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/template/metro.config.js) file via the [`resolver.unstable_enablePackageExports`](https://metrobundler.dev/docs/configuration/#unstable_enablepackageexports-experimental) option. ``` const config = { // ... resolver: { unstable_enablePackageExports: true, }, }; ``` Metro exposes two further resolver options which configure how conditional exports behave: * [`unstable_conditionNames`](https://metrobundler.dev/docs/configuration/#unstable_conditionnames-experimental) — The set of [condition names](https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions) to assert when resolving conditional exports. By default, we match `['require', 'import', 'react-native']`. * [`unstable_conditionsByPlatform`](https://metrobundler.dev/docs/configuration/#unstable_conditionsbyplatform-experimental) — The additional condition names to assert when resolving for a given platform target. By default, this matches `'browser'` when the platform is `'web'`. tip **Remember to use the React Native [Jest preset](https://github.com/facebook/react-native/blob/main/template/jest.config.js#L2)!** Jest includes support for Package Exports by default. In tests, you can override which `customExportConditions` are resolved using the [`testEnvironmentOptions`](https://jestjs.io/docs/configuration#testenvironmentoptions-object) option. **If you are using TypeScript**, resolution behaviour can be matched by setting [`moduleResolution: 'bundler'`](https://www.typescriptlang.org/tsconfig#moduleResolution) and [`resolvePackageJsonImports: false`](https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports) within your project's `tsconfig.json`. #### Validating changes in your project[​](#validating-changes-in-your-project "Direct link to Validating changes in your project") For existing projects, we recommend that early adopters follow these steps to see if resolution changes occur after enabling `unstable_enablePackageExports`. 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. 💡 Validating changes in your project note If you are not using Yarn, substitute `yarn` for `npx` (or the relevant tool used in your project). 1. Get all resolved dependencies (before changes): ``` # Replace index.js with your entry file if needed, such as App.js yarn metro get-dependencies index.js --platform android --output before.txt ``` * **Expo CLI**: Run `npx expo customize metro.config.js` if your project doesn't have a `metro.config.js` file yet. * For full coverage, substitute `--platform android` for the other platforms in use by your app (e.g. `ios`, `web`). 2. Enable `resolver.unstable_enablePackageExports` in `metro.config.js`. 3. Get all resolved dependencies (after changes): ``` yarn metro get-dependencies index.js --platform android --output after.txt ``` 4. Compare! ``` diff before.txt after.txt ``` ### Breaking changes[​](#breaking-changes "Direct link to Breaking changes") 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). The key breaking change is that when `"exports"` is provided by a package, it will be consulted first (before any other `package.json` fields) — and a matched subpath target will be used directly. * Metro will not expand [`sourceExts`](https://metrobundler.dev/docs/configuration/#sourceexts) against the import specifier. * Metro will not resolve [platform-specific extensions](/docs/platform-specific-code.md) against the target file. For more details, please see all [**breaking changes**](https://metrobundler.dev/docs/package-exports#summary-of-breaking-changes) in the Metro docs. ### Package encapsulation is lenient[​](#package-encapsulation-is-lenient "Direct link to Package encapsulation is lenient") When Metro encounters a subpath that isn't listed in `"exports"`, **it will fall back to legacy resolution**. This is a compatibility feature intended to reduce user friction for previously allowable imports in existing React Native projects. Instead of throwing an error, Metro will log a warning. ``` warn: You have imported the module "foo/private/fn.js" which is not listed in the "exports" of "foo". Consider updating your call site or asking the package maintainer(s) to expose this API. ``` note We plan to implement a strict mode for package encapsulation in future, to align with Node's default behaviour. Therefore, **we recommend that all developers address these warnings** if raised by users. ## For package maintainers (preview)[​](#for-package-maintainers-preview "Direct link to For package maintainers (preview)") info Per our [rollout plan](#the-future-stable-exports-enabled-by-default), Package Exports will be enabled for most projects in the next React Native release (0.73) later this year. **We have no plans to remove support for the `"main"` field and other current package resolution features any time soon.** 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. ### If you are using `"exports"` today[​](#if-you-are-using-exports-today "Direct link to if-you-are-using-exports-today") If your package uses `"exports"` alongside the current `"react-native"` root field, please bear in mind the [breaking changes](#breaking-changes) for users above. For users enabling this feature in Metro, `"exports"` will now be considered first during module resolution. In practice, we anticipate the main change for users will be the enforcement (via warnings) of any inaccessible subpaths in their apps, from respecting `"exports"` package encapsulation. ### Migrating to `"exports"`[​](#migrating-to-exports "Direct link to migrating-to-exports") **Adding an `"exports"` field to your package is entirely optional**. Existing package resolution features will behave identically for packages which don't use `"exports"` — and we have no plans to remove this behaviour. We believe that the new features of `"exports"` provide a compelling feature set for React Native package maintainers. * **Tighten your package API**: 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. * **Conditional exports**: If your package targets React Native for Web (i.e. `"react-native"` and `"browser"`), we now give packages control of the resolution order of these conditions (see next heading). If you decide to introduce `"exports"`, **we recommend making this as a breaking change**. We've prepared a [**migration guide**](https://metrobundler.dev/docs/package-exports#migration-guide-for-package-maintainers) in the Metro docs which includes how to replace features such as platform-specific extensions. note **Please do not rely on the lenient behaviours of Metro's implementation.** While Metro is backwards-compatible, packages should follow how `"exports"` is documented in the spec and strictly implemented by other tools. ### The new `"react-native"` condition[​](#the-new-react-native-condition "Direct link to the-new-react-native-condition") We've introduced `"react-native"` as a community condition (for use with conditional exports). This represents React Native, the framework, sitting alongside other recognised runtimes such as `"node"` and `"deno"` ([RFC](https://github.com/nodejs/node/pull/45367)). info [Community Conditions Definitions — **`"react-native"`**](https://nodejs.org/docs/latest-v19.x/api/packages.html#community-conditions-definitions) *Will be matched by the React Native framework (all platforms). To target React Native for Web, "browser" should be specified before this condition.* This replaces the previous `"react-native"` root field. The priority order for how this was previously resolved was determined by projects, [which created ambiguity when using React Native for Web](https://github.com/expo/router/issues/37#issuecomment-1275925758). Under `"exports"`, *packages concretely define the resolution order for conditional entry points* — removing this ambiguity. ``` "exports": { "browser": "./dist/index-browser.js", "react-native": "./dist/index-react-native.js", "default": "./dist/index.js" } ``` note We chose not to introduce `"android"` and `"ios"` 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 [`Platform.select()`](/docs/platform.md#select) API instead. ## The future: Stable `"exports"`, enabled by default[​](#the-future-stable-exports-enabled-by-default "Direct link to the-future-stable-exports-enabled-by-default") In the next React Native release, we are aiming to remove the `unstable_` prefix for this feature (having addressed planned performance work and any bugs) and will enable Package Exports resolution by default. With `"exports"` 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. ![Rollout plan for Package Exports support](/assets/images/package-exports-rollout-4d6544def64335059e0d23df72bfa98a.png) ## Thanks[​](#thanks "Direct link to Thanks") Thanks to members of the React Native community that gave feedback on the RFC: [@SimenB](https://github.com/SimenB), [@tido64](https://github.com/tido64), [@byCedric](https://github.com/byCedric), [@thymikee](https://github.com/thymikee). Huge thanks to [@motiz88](https://github.com/motiz88) and [@robhogan](https://github.com/robhogan) at Meta for supporting the development of this feature. **Tags:** * [announcement](/blog/tags/announcement) * [metro](/blog/tags/metro) --- # React Native 0.73 - Debugging Improvements, Stable Symlink Support, and more December 6, 2023 · 13 min read ![Marek Fořt](https://github.com/fortmarek.png) Marek Fořt Software Engineer @ Shopify [](https://x.com/marekfort "X")[](https://github.com/fortmarek "GitHub") ![Thibault Malbranche](https://github.com/titozzz.png) Thibault Malbranche Lead Mobile Engineer @ Brigad [](https://x.com/titozzz "X")[](https://github.com/titozzz "GitHub") ![Hur Ali](https://github.com/hurali97.png) Hur Ali Software Engineer @ Callstack [](https://x.com/hurali97 "X")[](https://github.com/hurali97 "GitHub") ![Luna Wei](https://github.com/lunaleaps.png) Luna Wei Software Engineer @ Meta [](https://x.com/lunaleaps "X")[](https://github.com/lunaleaps "GitHub") ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") 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! ### Highlights[​](#highlights "Direct link to Highlights") * [Debugging Improvements](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#debugging-improvements) * [Stable Symlink Support in Metro](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#stable-symlink-support-in-metro) * [Kotlin Template on Android](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#kotlin-template-on-android) * [Android 14 Support](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#android-14-support) * [New Architecture Updates](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#new-architecture-updates) * [Deprecated Debugging Features](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#deprecated-debugging-features) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Babel Package Renames](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#babel-package-renames) * [Other Breaking Changes](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#other-breaking-changes) * [React Native CLI Changes](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#react-native-cli-changes) * [Deprecated @types/react-native](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#deprecated-typesreact-native) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### Debugging Improvements[​](#debugging-improvements "Direct link to Debugging Improvements") 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. #### Console Log History in Hermes[​](#console-log-history-in-hermes "Direct link to Console Log History in Hermes") `console.log()` 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. In React Native 0.73 we've addressed this issue. Hermes now captures all `console.log()` 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. #### Updated Debugging Docs[​](#updated-debugging-docs "Direct link to Updated Debugging Docs") We've refreshed the [Debugging](/docs/debugging.md) 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. ![Overview of the Debugging docs as of 0.73](/assets/images/0.73-debugging-docs-b1aed77a7676fb519118e13ce67677f7.jpg) #### Experimental New Debugger[​](#experimental-new-debugger "Direct link to Experimental New Debugger") 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. note The new debugger is **experimental** and has some [known issues](https://github.com/react-native-community/discussions-and-proposals/discussions/733) we are actively working to solve in a future release of React Native. If you are trying it out, please use the [same discussion thread](https://github.com/react-native-community/discussions-and-proposals/discussions/733) to report feedback. ![The new debugger frontend opened to the \"Welcome\" pane](/assets/images/debugging-debugger-welcome-f17b086109690d6ae376ca5096cc55f4.jpg) Learn more about enabling this experience [in the docs](/docs/next/debugging?js-debugger=new-debugger#opening-the-debugger). ### Stable Symlink Support in Metro[​](#stable-symlink-support-in-metro "Direct link to Stable Symlink Support in Metro") Support for resolving symlinks in Metro is now **enabled by default**. Symlink support enables React Native to work with monorepo setups when containing directories are configured with [`watchFolders`](https://metrobundler.dev/docs/configuration/#watchfolders). Symlinks are deeply represented in Metro's internals, meaning they work with features such as [Fast Refresh](/docs/fast-refresh.md), and incur little performance overhead during bundling. Symlinks are supported on all desktop platforms, with and without Watchman. info #### Monorepo workarounds[​](#monorepo-workarounds "Direct link to Monorepo workarounds") 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 — but which we aim to ship as soon as possible. **For React Native template projects (`npx react-native init`)**, you will need to configure any [`watchFolders`](https://metrobundler.dev/docs/configuration/#watchfolders) outside of the project root in order for Metro to discover them ([more info](https://metrobundler.dev/docs/configuration/#unstable_enablesymlinks-experimental)). You may also need to update file paths if your `react-native` dependency is installed to a folder at a different level. **For Expo apps**, support for Yarn (Classic) workspaces is configured out of the box. See also the [Work with monorepos](https://docs.expo.dev/guides/monorepos/) guide in the Expo docs. ### Kotlin Template on Android[​](#kotlin-template-on-android "Direct link to Kotlin Template on Android") We're excited to announce that, starting from 0.73, Kotlin is now the **recommended language** 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. We've updated React Native's template on Android to use Kotlin instead of Java. The new `MainActivity.kt` and `MainApplication.kt` files are 36% smaller in size. The [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) has also been updated to make it easier to migrate your `.java` files to `.kt` 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 > Convert Java file to Kotlin File` utility of Android Studio (also accessible with the shortcut `Cmd ⌘` + `Shift ⇧` + `Option ⌥` + `K`). ### Android 14 Support[​](#android-14-support "Direct link to Android 14 Support") 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, [API Level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element?hl=en#ApiLevels) (*Upside Down Cake*). #### Java 17 and Android Gradle Plugin upgrade[​](#java-17-and-android-gradle-plugin-upgrade "Direct link to Java 17 and Android Gradle Plugin upgrade") In order to support Android 14, we've updated the version of Android Gradle Plugin (AGP) used to build Android apps from `7.4.x` to `8.1.x`. This major version bump of AGP comes with a series of breaking changes that are available in the release notes from Google ([8.0.0](https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes) and [8.1.0](https://developer.android.com/build/releases/past-releases/agp-8-1-0-release-notes)). Most importantly, **Java 17** is now a requirement to build Android apps. You can update your Java version to 17 by running: ``` brew install --cask zulu@17 ``` and by updating your `JAVA_HOME` as documented in the [Getting Started guide](https://reactnative.dev/docs/environment-setup). If you're a library developer, your libraries should work with React Native 0.73 without changes. Earlier this year, [we published a note](https://github.com/react-native-community/discussions-and-proposals/issues/671) with a clarification on what the AGP bump means for you as a library author. #### Grant partial access to photos and videos[​](#grant-partial-access-to-photos-and-videos "Direct link to Grant partial access to photos and videos") [Selected Photos Access](https://developer.android.com/about/versions/14/changes/partial-photo-video-access) 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 `READ_MEDIA_VISUAL_USER_SELECTED` permission in the [`PermissionsAndroid`](/docs/permissionsandroid.md) API. ![Selected Photos Access in Android 14](/assets/images/0.73-android-media-picker-e5f99ca2d5d41618686d78e49343621c.jpg) #### Min SDK bump[​](#min-sdk-bump "Direct link to Min SDK bump") 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 [here](https://github.com/react-native-community/discussions-and-proposals/discussions/740). ### New Architecture Updates[​](#new-architecture-updates "Direct link to New Architecture Updates") We continue the rollout of React Native's New Architecture, to make it available to everyone in the Open Source community. 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. Today we're releasing another piece of the New Architecture: [**Bridgeless Mode**](https://github.com/reactwg/react-native-new-architecture/discussions/154). 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. 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 [Renderer Interop Layer](https://github.com/reactwg/react-native-new-architecture/discussions/135) introduced in React Native 0.72 has also been adapted to work with Bridgeless Mode. 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 [New Architecture working group](https://github.com/reactwg/react-native-new-architecture/discussions). ### Deprecated Debugging Features[​](#deprecated-debugging-features "Direct link to Deprecated Debugging Features") #### Flipper ↔ React Native integration[​](#flipper--react-native-integration "Direct link to Flipper ↔ React Native integration") 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 — meaning parts of Flipper such as the Network plugin will cease to work. **Unchanged**: 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 [manually add Flipper to their app](https://fbflipper.com/docs/getting-started/android-native/) if they wish. For more information on why we are moving away from Flipper, [view the RFC](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0641-decoupling-flipper-from-react-native-core.md). #### Remote JavaScript Debugging[​](#remote-javascript-debugging "Direct link to Remote JavaScript Debugging") 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. `http://localhost:8081/debugger-ui`. This model could lead to inconsistent app behaviour while debugging, and is incompatible with native modules under the New Architecture. In 0.73, [Remote JavaScript Debugging is deprecated](https://github.com/react-native-community/discussions-and-proposals/discussions/734) and has been removed from the Dev Menu. Enabling the remote debugger must now be done manually via the `NativeDevSettings` API. Doing this is covered in the [Other Debugging Methods docs](/docs/next/other-debugging-methods#remote-js-debugging). info Remote JavaScript Debugging was previously the default debugging experience for apps using JavaScriptCore (JSC). We recommend [Safari Developer Tools (direct JSC debugging)](/docs/next/other-debugging-methods#safari-developer-tools-direct-jsc-debugging) instead, for iOS apps. We recommend using [Hermes](/docs/hermes.md) for a consistent debugging experience on all platforms. ## Breaking Changes[​](#breaking-changes-1 "Direct link to Breaking Changes") ### Babel Package Renames[​](#babel-package-renames "Direct link to Babel Package Renames") 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. Please follow the [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) when upgrading, to ensure you have updated these dependencies. Some packages have been renamed: | Old Package Name | New Package Name | | -------------------------------------- | --------------------------------------- | | `metro-react-native-babel-preset` | `@react-native/babel-preset` | | `metro-react-native-babel-transformer` | `@react-native/metro-babel-transformer` | info `@react-native/babel-preset` now includes `@react-native/babel-plugin-codegen`, this no longer needs to be specified separately in your Babel config file. ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") These are some of the key breaking changes in 0.73. Please consult the [full changelog](https://github.com/facebook/react-native/blob/main/CHANGELOG.md) for the complete list of breaking changes. * Raise minimum Node.js requirement to 18.x ([#37709](https://github.com/facebook/react-native/pull/37709)) (see also [Node.js 16 EOL](https://nodejs.org/en/blog/announcements/nodejs16-eol)). * The template now uses TypeScript 5.0 ([#36862](https://github.com/facebook/react-native/pull/36862)). * React Native types continue working on TypeScript 4.8. * **Android**: Java 17 is now a requirement to build Android apps ([see above](#java-17-and-android-gradle-plugin-upgrade)). * **Android**: Major bump of Fresco to 3.0 ([#38275](https://github.com/facebook/react-native/pull/38275)). * **iOS**: Raise minimum iOS version to 13.4 ([#36795](https://github.com/facebook/react-native/pull/36795)). * **iOS**: Metro will no longer be automatically started when running builds via Xcode ([#38242](https://github.com/facebook/react-native/pull/38242)). For library authors: * **Android**: Bump to AGP 8.1.1 ([discussion](https://github.com/react-native-community/discussions-and-proposals/issues/671)) ### React Native CLI Changes[​](#react-native-cli-changes "Direct link to React Native CLI Changes") #### Highlighted breaking changes[​](#highlighted-breaking-changes "Direct link to Highlighted breaking changes") * Change default task prefix in `build-android` command. From now on, when you run `build-android`, the `bundle` task will be run instead of `assemble` ([#1913](https://github.com/react-native-community/cli/pull/1913)). * Remove fallback flow for Metro config defaults ([#1972](https://github.com/react-native-community/cli/pull/1972)). * The [updated `metro.config.js` format](/blog/2023/06/21/0.72-metro-package-exports-symlinks.md#new-metroconfigjs-setup) from 0.72 is now required in 0.73, as we have removed the fallback copy of these defaults from CLI. * Remove `--configuration` option from `run-ios` (replaced with `--mode`) ([#2028](https://github.com/react-native-community/cli/pull/2028)). * Remove `--variant` option from `build-android` command (replaced with `--mode`) ([#2026](https://github.com/react-native-community/cli/pull/2026)). [See full changelog for v12.0.0](https://github.com/react-native-community/cli/releases/tag/v12.0.0). ### Deprecated `@types/react-native`[​](#deprecated-typesreact-native "Direct link to deprecated-typesreact-native") As mentioned in [First-class Support for TypeScript](/blog/2023/01/03/typescript-first.md#declarations-shipped-with-react-native), we have shipped TypeScript types with `react-native` since 0.71 and we are now deprecating `@types/react-native` for 0.73. We will not ship any future patches for existing versions. The guidance is to migrate away from `@types/react-native`. See instructions on [how to migrate](/blog/2023/01/03/typescript-first.md#how-to-migrate). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.73 contains over [2259 commits](https://github.com/facebook/react-native/compare/v0.72.7...v0.73.0) from 68 contributors. Thanks for all your hard work! ## Upgrade to 0.73[​](#upgrade-to-073 "Direct link to Upgrade to 0.73") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [Upgrading docs](/docs/upgrading.md). You can also create a new project with `npx react-native@latest init MyProject`. If you use Expo, React Native 0.73 will be supported in the Expo SDK 50 release. info 0.73 is now the latest stable version of React Native and **0.70.x now moves to unsupported**. For more information see [React Native’s support policy](https://github.com/reactwg/react-native-releases#releases-support-policy). **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) * [debugging](/blog/tags/debugging) --- # React Native 0.74 - Yoga 3.0, Bridgeless New Architecture, and more April 22, 2024 · 15 min read ![Hur Ali](https://github.com/hurali97.png) Hur Ali Software Engineer @ Callstack [](https://x.com/hurali97 "X")[](https://github.com/hurali97 "GitHub") ![Alan Hughes](https://github.com/alanjhughes.png) Alan Hughes Software Engineer @ Expo [](https://github.com/alanjhughes "GitHub") ![Alfonso Curbelo](https://github.com/alfonsocj.png) Alfonso Curbelo Software Engineer @ Coinbase [](https://github.com/alfonsocj "GitHub") ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") 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. We are also removing deprecated APIs, with the removal of `PropTypes` and breaking changes to `PushNotificationIOS`. On Android, SDK 23 (Android 6.0) is now the minimum supported version. ### Highlights[​](#highlights "Direct link to Highlights") * [Yoga 3.0](/blog/2024/04/22/release-0.74.md#yoga-30) * [New Architecture: Bridgeless by Default](/blog/2024/04/22/release-0.74.md#new-architecture-bridgeless-by-default) * [New Architecture: Batched `onLayout` Updates](/blog/2024/04/22/release-0.74.md#new-architecture-batched-onlayout-updates) * [Yarn 3 for New Projects](/blog/2024/04/22/release-0.74.md#yarn-3-for-new-projects) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Android Minimum SDK Bump (Android 6.0)](/blog/2024/04/22/release-0.74.md#android-minimum-sdk-bump-android-60) * [API Changes to PushNotificationIOS (Deprecated)](/blog/2024/04/22/release-0.74.md#api-changes-to-pushnotificationios-deprecated) * [Removal of Deprecated `PropTypes`](/blog/2024/04/22/release-0.74.md#removal-of-deprecated-proptypes) * [Removal of Flipper React Native Plugin](/blog/2024/04/22/release-0.74.md#removal-of-flipper-react-native-plugin) * [Other Breaking Changes](/blog/2024/04/22/release-0.74.md#other-breaking-changes) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### Yoga 3.0[​](#yoga-30 "Direct link to Yoga 3.0") #### New Layout Behaviors[​](#new-layout-behaviors "Direct link to New Layout Behaviors") React Native 0.74 includes [Yoga 3.0](https://yogalayout.dev/blog/announcing-yoga-3.0), 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. 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. warning React Native [previously flipped](https://yogalayout.dev/blog/announcing-yoga-3.0#correct-handling-of-logical-edges-in-row-reverse-containers) `left`/`right` (and `start`/`end`) edges when dealing with `margin`, `padding`, or `border`, set on a `row-reverse` 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. | Style | Before | After | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ``` ``` | ![Previous layout](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkAgMAAAC+6JeYAAAACVBMVEX/AAAAgAIAAP/8wXIfAAAANklEQVR42u3LoQ0AIAwAsJ2I4T8MhiuxM8v0ktY3XnJ3YUWmKIqiKIqiTCy9oyiKoiiKoowuHxexOPfpM7ojAAAAAElFTkSuQmCC) | ![New layout](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkAgMAAAC+6JeYAAAACVBMVEX/AAAAgAIAAP/8wXIfAAAAMklEQVR42u3LoQ0AMAgAsOn9x5NcicUQNEnr+7qfTUwURVEURVGU+2WnKIqiKIqinCsFTv3+UKPaRfkAAAAASUVORK5CYII=) | #### Support for `align-content: 'space-evenly'`[​](#support-for-align-content-space-evenly "Direct link to support-for-align-content-space-evenly") Yoga 3.0 brings support for [`alignContent: 'space-evenly'`](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content#space-evenly). `space-evenly` distributes the lines in a multi-line flex container using evenly spaced gaps, placed between line and container edges. ![Visual reference for alignContent behaviors](/blog/assets/0.74-align-content.png) Source: [World Wide Web Consortium](https://www.w3.org/TR/css-align-3/#distribution-values) #### Support for `position: 'static'`[​](#support-for-position-static "Direct link to support-for-position-static") info `position: 'static'` is supported only in the New Architecture. Elements marked as [`position: 'static'`](https://developer.mozilla.org/en-US/docs/Web/CSS/position#static) may not be offset, and are not considered when determining the [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block) of an absolutely positioned element. This allows positioning an element relative to an ancestor which is not its direct parent. | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ``` ``` | ![Static Example](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGOCAMAAACOvaUVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAABkKADAAQAAAABAAABjgAAAAA32yssAAAACXBIWXMAAAsTAAALEwEAmpwYAAACymlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yODg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI4NjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoqdD14AAACTFBMVEUAAP8Afz//ACgAgSoAiQAAfEIAfEH/ACAAiAAAe0L3ADLZAIAAgCb2ADIAhwDWAIQAgCH/ABcAfyUAhgDVAIMAgBsAfyAAgBoAfx8AhQD/ABAAgBkAfx4AgBgAfScAgBcAfSYAgBb/AAwAfxr/AAsAhAAAfCkAgBQAgBMAfCf+AAsAgBIAfCbOAIgAfxYAfCUAgBAAgwAAfxQAgA4AfxMAgA0AfxIAgAwAfxEAgAsAfxAAggAAgAr/AAAAgAkAbWn+AAAAgQAAgAUAanUAgAMAgAIAa24AaH0AgAEAZoYAgAD7AAAAZoUAbGYAam8Aam4AZYcAam0AZYYAZYUAZ3oAaW8AdDMAb0oAczUAczQAczMAZ28AcjUAdxoAcDcAWKkAVq4AdQ0AVLEAU7IAU7EAWosAVJ6sAImrAIerAIYAUaMAT6iuAHQAT6MATqgAS7AATKoATKgARcKMAKwAPMNnANdlANlhANkAMtJYAOAAMsJXAN8AMsEAMsBXANwAMr4AMcIAMcEAKekAMMEAKOoAL8MAJ+sAJuwAJusAJesAJOwAI+wAJ9QAIutEAOcAH/AAHu48AOgAHPAAHeUAFfMlAPokAPsjAPoAEfYADP4YAPgWAP0VAP0ACv4SAP8TAPwRAP8ACfsQAP8ACfkACP4QAP0ACfgACPwACPsAB/4ABv8ABf8ABf4ABf0IAP8ABP8HAP4AA/8GAP4AA/4AA/0EAP8AAv8AAv4AAv0CAP8AAf8CAP4AAf4BAP8AAP4AAP0AAPgAAPcAAPMAAPJvRcS8AAAD2klEQVR42u3dT2scZQDH8d8zM7ubuI0WE6uCClLx6sFXoEjFV+Hb8nVYECxGTx5EPHoQxINQFaSlrUk2+2dmPLRCwcuMMLIJn88hgTyHwO/LPLu3CQAAAAAAAAAAAAAAAAAAAABcTyWjfbVLnzFK85Ghh2oy2vmmzyhlaecpg8wXu5H/obHzdFfWvaYupc8Ipe/6Dyw90RPyxZ3Pfm7XTdoMVff1wRu5u7hj7CmCbHP5eN33bdtkoO7w4rV1LmpbTxHk68fZ/Prkx9s5y2APH366ytmRrSf6UC/Ln179vZ7vMkh1cP+976vK0NMFSTdfrl5+YViQrpr/Oa9LMfR0QfrdYU5emWWo2WYnyJRBkrZq2lmXIdrMOiOPUeW/OMtQvlyNDjKp2sf5SAYTBEEEQRBBEEQQBBEEQRBEEAQRBEEEQRBBEARBBEEQQRBEEAQRBEEQRBAEEQRBBEEQQRAEQQRBEEEQRBAEEQRBEEQQBBEEQQRBEEEQBEEEQRBBEEQQBBEEQRBEEAQRBEEEQRBBEARBBEEQQRBEEAQRBEEQRBAEuf5BasNNpclYZZEsK4/W3gRJ384ebG6sM0C1axbbNGaeMki/Ot/99eSgyyBVs0tr5kmDbN787u2ziww0P/qh3W6y29p6kiBVDm+fN7c2WWWYZdsvjo+ynNl6iiAfJifvrt4pZddkkG1pZ/MXb+b4E1tPdGWdLLbreUqfJCl59rtP8q+/lPSlz2ZxYx49uJpKRru77kpG6Kul5wMAAAAAAAAAAAAAAAAAAACA/13JNXF6uU2Vq6/JNdE9ukjxgO2L01NX1j758uPP/zh7tHVl7YvzPFjdX29LEWQ/nOXyt3tvfZOkTvvPj7ZOm6eeHdQZfdDWzx3U7XMHyYiD9unpgIPrEWSXrvvl5vtxZe2NUpp8+9LxhSB7oUqfWWav32q9HWGfbFqvq9grnfeHIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIggiCIIAgiCIIgiCAIIgiCCIIggiAIggiCIIIgiCAIIgiCIIggCCIIggiCIIIgCIIIgiCCIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIggiCIIAgiCIIIgiAIIgiCCIIggiCIIAiCIIIgiCAIIgiCCIIgCCIIggiCIIIgiCAIgiCCIIggCCIIggiCIAgiCIIIgiCCIIggCIIggiCIIAgiCIIIgiAIIgiCCIIggiCIIAiCIIIgiCAIIgiCCIIgCCIIggiCIIIgiCAIIgiCIIggCCIIggiCIIIgCIIIgiCCIIggCCIIgiCIIAgiCIIIgiCCIAiCCIIgV9nfQaK7IvVKYtEAAAAASUVORK5CYII=) | Notice how the green `` declares `left` and `top` and it is positioned relative to the blue ``, not its parent. React Native continues to default to `position: 'relative'` when no `position` is set. ### New Architecture: Bridgeless by Default[​](#new-architecture-bridgeless-by-default "Direct link to New Architecture: Bridgeless by Default") 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 [this post](https://github.com/reactwg/react-native-new-architecture/discussions/174). 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. 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 [here](https://github.com/reactwg/react-native-new-architecture/discussions/175). Finally, if you want to learn more about the New Architecture, you can find documentation in the [react-native-new-architecture](https://github.com/reactwg/react-native-new-architecture/tree/main/docs) repo. When the New Architecture becomes the default, this information will be incorporated into [reactnative.dev](https://reactnative.dev). ### New Architecture: Batched `onLayout` updates[​](#new-architecture-batched-onlayout-updates "Direct link to new-architecture-batched-onlayout-updates") State updates in `onLayout` callbacks are now batched. Previously, each state update in the `onLayout` event would result in a new render commit. ``` function MyComponent(props) { const [state1, setState1] = useState(false); const [state2, setState2] = useState(false); return ( { setState1(true); }}> { // When this event is executed, state1's new value is no longer observable here. setState2(true); }}> ); } ``` In 0.74, `setState1` and `setState2` updates are batched together. This change is [expected behavior in React](https://react.dev/learn/queueing-a-series-of-state-updates#react-batches-state-updates) and allows for less re-renders. danger This change **may break code** that has relied on un-batched state updates. You'll need to refactor this code to use [updater functions](https://react.dev/learn/queueing-a-series-of-state-updates#updating-the-same-state-multiple-times-before-the-next-render) or equivalent. ### Yarn 3 for New Projects[​](#yarn-3-for-new-projects "Direct link to Yarn 3 for New Projects") [Yarn 3](https://yarnpkg.com/blog/release/3.0) is now the default JavaScript package manager for new projects initialized with React Native Community CLI. Yarn 3.x will be used with `nodeLinker: node-modules`, 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 [guide](https://yarnpkg.com/migration/guide). ``` $ yarn --help ━━━ Yarn Package Manager - 3.6.4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ $ yarn ``` The Community CLI also supports initializing projects with other package managers via the `--pm` flag ([read more](https://github.com/react-native-community/cli/blob/main/docs/init.md)). ## Breaking Changes[​](#breaking-changes-1 "Direct link to Breaking Changes") ### Android Minimum SDK Bump (Android 6.0)[​](#android-minimum-sdk-bump-android-60 "Direct link to Android Minimum SDK Bump (Android 6.0)") 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 [here](https://github.com/react-native-community/discussions-and-proposals/discussions/740). #### Bonus: Android app size reduction[​](#bonus-android-app-size-reduction "Direct link to Bonus: Android app size reduction") The minimum SDK bump, together with several improvements at our native build, allowed us to greatly reduce the app size on user devices. For example a newly created app with React Native 0.74 occupies \~13% less space on user device, resulting in \~4MB saved on device. ![Side-by-side comparison of a new React Native app in the Android system storage view](/assets/images/0.74-android-app-size-0dc90c5494d274e5c4691287866bf518.jpg) ### Removal of Deprecated `PropTypes`[​](#removal-of-deprecated-proptypes "Direct link to removal-of-deprecated-proptypes") Before 0.74, React Native continued to ship with `PropTypes`, an API that has been deprecated since React 15.5 in 2017! We are now removing all built-in `PropTypes` from React Native, reducing app size (26.4kB in a minified bundle) and memory overhead. The following `PropTypes` properties are removed: `Image.propTypes`, `Text.propTypes`, `TextInput.propTypes`, `ColorPropType`, `EdgeInsetsPropType`, `PointPropType`, `ViewPropTypes` (see [commit](https://github.com/facebook/react-native/commit/228cb80af9ded20107f3c7a30ffe00e24471bfeb)). If your app or library relies on `PropTypes`, we highly recommend migrating to a type system like TypeScript. ### API Changes to PushNotificationIOS (Deprecated)[​](#api-changes-to-pushnotificationios-deprecated "Direct link to API Changes to PushNotificationIOS (Deprecated)") In React Native 0.74, we are making steps to remove the deprecated [PushNotificationIOS](https://reactnative.dev/docs/pushnotificationios) library. The changes in this release are focused on removing references to older iOS APIs. PushNotificationIOS has been migrated onto Apple’s [User Notifications](https://developer.apple.com/documentation/usernotifications?language=objc) framework and exposes new APIs for scheduling and handling notifications. In the next release (0.75), we are planning to **remove this library**, relocating it out of React Native core and into the community package, [@react-native-community/push-notification-ios](https://github.com/react-native-push-notification/ios). If you are still relying on PushNotificationIOS, you’ll need to migrate over before the next release. #### API Changes[​](#api-changes "Direct link to API Changes") The `didRegisterUserNotificationSettings:` callback on `RCTPushNotificationManager` was a no-op and has been deleted. The following callbacks on `RCTPushNotificationManager` have been deprecated and will be removed in 0.75: ``` + (void)didReceiveLocalNotification:(UILocalNotification *)notification; + (void)didReceiveRemoteNotification:(NSDictionary *)notification; ``` In order to retrieve the notification which launched the app using `getInitialNotification()`, you’ll now need to explicitly set the `initialNotification` on `RCTPushNotificationManager`: ``` [RCTPushNotificationManager setInitialNotification:response.notification]; ``` On the JS side, properties on `Notification` have changed. `alertAction` and `repeatInterval` are now deprecated and will be removed in 0.75: ``` type Notification = { ... // NEW: Seconds from now to display the notification. fireIntervalSeconds?: ?number, // CHANGED: Used only for scheduling notifications. Will be null when // retrieving notifications using `getScheduledLocalNotifications` or // `getDeliveredNotifications`. soundName?: ?string, // DEPRECATED: This was used for iOS's legacy UILocalNotification. alertAction?: ?string, // DEPRECATED: Use `fireDate` or `fireIntervalSeconds` instead. repeatInterval?: ?string, }; ``` Finally, the `handler` parameter on `PushNotificationIOS.removeEventListener` is unused and has been removed. **💡 How to Migrate** #### iOS[​](#ios "Direct link to iOS") Your `AppDelegate` will need to implement `UNUserNotificationCenterDelegate`. This should be done on app startup in `application:willFinishLaunchingWithOptions:` or `application:didFinishLaunchingWithOptions:` (see [Apple Docs](https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate?language=objc) for more details). ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; return YES; } ``` Implement `userNotificationCenter:willPresentNotification:withCompletionHandler:`, which is called when a notification arrives and the app is in the *foreground*. Use the `completionHandler` to determine if the notification will be shown to the user and notify `RCTPushNotificationManager` accordingly: ``` - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { // This will trigger 'notification' and 'localNotification' events on PushNotificationIOS [RCTPushNotificationManager didReceiveNotification:notification]; // Decide if and how the notification will be shown to the user completionHandler(UNNotificationPresentationOptionNone); } ``` To handle when a notification is tapped, implement `userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:`. Note that if you set foreground notifications to be shown in `userNotificationCenter:willPresentNotification:withCompletionHandler:`, you should only notify `RCTPushNotificationManager` in one of these callbacks. If the tapped notification resulted in app launch, call `setInitialNotification:`. If the notification was not previously handled by `userNotificationCenter:willPresentNotification:withCompletionHandler:`, call `didReceiveNotification:` as well: ``` - (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { // This condition passes if the notification was tapped to launch the app if ([response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) { // Allow the notification to be retrieved on the JS side using getInitialNotification() [RCTPushNotificationManager setInitialNotification:response.notification]; } // This will trigger 'notification' and 'localNotification' events on PushNotificationIOS [RCTPushNotificationManager didReceiveNotification:response.notification]; completionHandler(); } ``` Finally, delete the following methods and adapt the logic into the callbacks above which will be called instead: 1. `` `application:didReceiveLocalNotification:` \[deprecated] 2. `` `application:didReceiveRemoteNotification:` \[deprecated] 3. `` `application:didReceiveRemoteNotification:fetchCompletionHandler:` \[not deprecated, but is superseded by the `UNUserNotificationCenterDelegate` methods] Delete any usages of `application:didRegisterUserNotificationSettings:` and `RCTPushNotificationManager`’s corresponding `didRegisterUserNotificationSettings:` as well. **Example:** See the RNTester `AppDelegate.mm`. #### JS[​](#js "Direct link to JS") 1. Remove any references to `alertAction`. 2. Remove the `handler` argument on any calls to `removeEventListener`. 3. Replace any usages of `repeatInterval` by firing multiple notifications using `fireDate` or `fireIntervalSeconds` instead. 4. Note that `soundName` will be null when it is accessed on a `Notification` returned from `getScheduledLocalNotifications()` and `getDeliveredNotifications()`. ### Removal of Flipper React Native Plugin[​](#removal-of-flipper-react-native-plugin "Direct link to Removal of Flipper React Native Plugin") Use of [Flipper](https://fbflipper.com/) for inspecting React Native layouts, network requests, and [other React Native plugin features](https://fbflipper.com/docs/features/react-native/), 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 [original RFC](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0641-decoupling-flipper-from-react-native-core.md)). The diff for removing Flipper in your app can be seen in the [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/). If you want to preserve Flipper in an existing app, ignore the relevant diff lines. **💡 To re-integrate Flipper** 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 ([Android guide](https://fbflipper.com/docs/getting-started/android-native/), [iOS guide](https://fbflipper.com/docs/getting-started/ios-native/)). We recommend that teams invest in switching to native debugging tooling in Android Studio and Xcode. tip #### Replacing Flipper[​](#replacing-flipper "Direct link to Replacing Flipper") There are a number of dedicated debugging tools which replace Flipper features. For more information, we recommend reading the excellent [*Why you don't need Flipper in your React Native app*](https://shift.infinite.red/why-you-dont-need-flipper-in-your-react-native-app-and-how-to-get-by-without-it-3af461955109) article by Jamon Holmgren. #### JavaScript debugging[​](#javascript-debugging "Direct link to JavaScript debugging") Using the [Hermes Debugger](https://reactnative.dev/docs/debugging?js-debugger=hermes#opening-the-debugger) remains our recommended debugging option for 0.74. You can also try the [Experimental New Debugger](https://reactnative.dev/docs/debugging?js-debugger=new-debugger#opening-the-debugger), which is also the default in Expo. This continues to be an early preview — known issues and updates can be followed [here](https://github.com/react-native-community/discussions-and-proposals/discussions/733). ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") **General** * Make `start`/`end` in styles always refer to writing direction ([#42251](https://github.com/facebook/react-native/pull/42251)). **Android** * Remove of `JSIModule*` from `FabricUIManagerProvider` ([#42059](https://github.com/facebook/react-native/pull/42059)). * This API was unused in open source — use [TurboModules](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/turbo-modules.md) instead. * Deprecate `UIManagerModule.showPopupMenu` and `UIManagerModule.dismissPopupMenu` ([#42441](https://github.com/facebook/react-native/pull/42441)) * This API has been moved to the [`@react-native/popup-menu-android`](https://www.npmjs.com/package/@react-native/popup-menu-android) npm package and will be removed in 0.75. **iOS** * Delete `configFilename` and `configKey` arguments from iOS codegen CLI ([#41533](https://github.com/facebook/react-native/pull/41533)). * Change how [`bundleURL`](https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29) is handled ([#43994](https://github.com/facebook/react-native/pull/43994)). * Before, `bundleURL` was set when React Native was started in an instance variable and it was not possible to update it. * Now, [`bundleUrl` is a function](https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29) which is re-evaluated when needed, enabling the use of a different URL across refreshes. * This change will affect your app only if you were changing the `bundleURL` variable after the app is started. In this case, move the logic that updates the variable to the [`bundleURL` function](https://github.com/facebook/react-native/blob/0.74-stable/packages/react-native/template/ios/HelloWorld/AppDelegate.mm#L22-L29) in `AppDelegate`. Please see the [full changelog](https://github.com/facebook/react-native/blob/main/CHANGELOG.md) for a complete list of breaking changes. ## Known Issues[​](#known-issues "Direct link to Known Issues") **iOS** * 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 [#44167](https://github.com/facebook/react-native/pull/44167) and will ship in 0.74.1. ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.74 contains over [1673 commits](https://github.com/facebook/react-native/compare/v0.73.6...v0.74.0) from 57 contributors. Thanks for all your hard work! Thanks to all the additional authors that worked on documenting features in this release post: * [Nick Gerleman](https://github.com/NickGerleman) for *Yoga 3.0* * [Joe Vilches](https://github.com/joevilches) for *Yoga 3.0* * [Riccardo Cipolleschi](https://twitter.com/CipolleschiR) for *New Architecture: Bridgeless by Default* * [Samuel Susla](https://twitter.com/SamuelSusla) for *New Architecture: Batched `onLayout` updates* * [Tim Yung](https://twitter.com/yungsters) for *Removal of Deprecated `PropTypes`* * [Ingrid Wang](https://github.com/ingridwang) for *API Changes to PushNotificationIOS (Deprecated)* ## Upgrade to 0.74[​](#upgrade-to-074 "Direct link to Upgrade to 0.74") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [Upgrading docs](/docs/upgrading.md). To create a new project: ``` npx react-native@latest init MyProject ``` If you use Expo, React Native 0.74 will be supported in Expo SDK 51. info 0.74 is now the latest stable version of React Native and **0.71.x moves to unsupported**. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases#releases-support-policy). We aim to publish a final end-of-life update of 0.71 at the beginning of May. **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) * [yoga](/blog/tags/yoga) --- # Use a framework to build React Native apps June 25, 2024 · 5 min read ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") At [React Conf](https://www.youtube.com/live/0ckOUBiuxVY?si=pU4qP4eB5iWfY0IG\&t=2320), 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. Using React Native frameworks, such as Expo, is now the **recommended** approach to create new apps. 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. ## What is a React Native framework?[​](#what-is-a-react-native-framework "Direct link to What is a React Native framework?") 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. 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. It takes a village to bring an app from idea to production without the right tools. We want you to focus on writing beautiful applications and features for your users, and not solving those common problems over and over. 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. We’ve found that **you’re either using a framework or you’re building your own framework**. 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. If you’ve been using React on web, you’re probably familiar with a similar concept of [production-grade React frameworks](https://react.dev/learn/start-a-new-react-project#production-grade-react-frameworks). As of today, the only recommended community framework for React Native is [Expo](https://docs.expo.dev/). 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. note Expo, the framework, is and will remain free and open source, while Expo Application Services (EAS) is an optional paid service. If you haven’t used Expo recently, make sure you don’t miss [this talk from Kadi @ Expo](https://www.youtube.com/live/0ckOUBiuxVY?si=N-WSfmAJSMfd6wDL\&t=3888) where she’s showcasing what you can do with Expo in 2024. We’ve also updated the [Getting Started page](https://reactnative.dev/docs/environment-setup) on the website to reflect this recommendation. ## How will frameworks affect you?[​](#how-will-frameworks-affect-you "Direct link to How will frameworks affect you?") If you’re already using a recommended framework such as Expo, you’re already good to go! If you'd like to migrate your existing app to Expo, you can find instructions on [the official Expo website](https://docs.expo.dev/bare/overview/). Expo offers many benefits, such as an easier way to [upgrade your React Native version](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/), a better developer experience, and much more. 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 [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) will keep on working as usual. The `react-native init` command has moved out of core and is now accessible via: ``` npx @react-native-community/cli@latest init ``` and on GitHub at [react-native-community/cli](https://github.com/react-native-community/cli). If you’re a React Native library developer, we collected a list of recommendations on which APIs to use. [Read more in the RFC](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). ## Further reading[​](#further-reading "Direct link to Further reading") If you’re interested in learning more about the reasoning behind this decision, we invite you to read the [RFC0759: React Native Frameworks](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). 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. While Expo today is the only recommended framework, the RFC also contains [guidelines](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md#becoming-a-react-native-framework) on how to become a recommended framework, as we hope to see more competition and innovation in this space. Moreover, you should check out the talk [useFrameworks()](https://www.youtube.com/watch?v=lifGTznLBcw) at App.js 2024 where we presented this RFC and the necessary changes in a short format. We believe that by clarifying the respective responsibilities of React Native Core and the Frameworks, we can foster a healthier ecosystem and drive growth & innovation for React Native. **Tags:** * [announcement](/blog/tags/announcement) --- # React Native 0.75 - Support for Percentage Values in Layout, New Architecture Stabilization, Template & init Updates, and more August 14, 2024 · 16 min read ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Siddharth Kulkarni](https://github.com/siddharthkul.png) Siddharth Kulkarni Software Engineer @ Coinbase [](https://github.com/siddharthkul "GitHub") ![Thibault Malbranche](https://github.com/titozzz.png) Thibault Malbranche Lead Mobile Engineer @ Brigad [](https://x.com/titozzz "X")[](https://github.com/titozzz "GitHub") ![Blake Friedman](https://github.com/blakef.png) Blake Friedman Software Engineer @ Meta [](https://github.com/blakef "GitHub") ![Riccardo Cipolleschi](https://github.com/cipolleschi.png) Riccardo Cipolleschi Software Engineer @ Meta [](https://x.com/CipolleschiR "X")[](https://github.com/cipolleschi "GitHub") ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") Today we are excited to release React Native 0.75! This release ships several features, such as Yoga 3.1 with support for `%` values, several stabilization fixes for the New Architecture, and the introduction of the recommendation for users to use a React Native Framework. ### Highlights[​](#highlights "Direct link to Highlights") * [Yoga 3.1 and Layout Improvements](/blog/2024/08/12/release-0.75.md#yoga-31-and-layout-improvements) * [New Architecture Stabilization](/blog/2024/08/12/release-0.75.md#new-architecture-stabilization) * [Using Frameworks](/blog/2024/08/12/release-0.75.md#using-frameworks) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Touchables in TypeScript can’t be used as types in Generic expressions anymore](/blog/2024/08/12/release-0.75.md#touchables-in-typescript-cant-be-used-as-types-in-generic-expressions-anymore) * [Last version supporting minSdk 23 and minIOSVersion 13.4](/blog/2024/08/12/release-0.75.md#last-version-supporting-minsdk-23-and-miniosversion-134) * [Android: JSIModule has been deleted](/blog/2024/08/12/release-0.75.md#android-jsimodule-has-been-deleted) * [Android: PopUp Menu removed from core](/blog/2024/08/12/release-0.75.md#android-popup-menu-moved-to-separate-package) * [iOS: Finalized Push Notifications deprecation work](/blog/2024/08/12/release-0.75.md#ios-finalized-pushnotificationios-deprecation-work) * [Community CLI: Removal of ram-bundle and profile-hermes commands](/blog/2024/08/12/release-0.75.md#community-cli-removal-of-ram-bundle-and-profile-hermes-commands) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### Yoga 3.1 and Layout Improvements[​](#yoga-31-and-layout-improvements "Direct link to Yoga 3.1 and Layout Improvements") Since we last shipped Yoga [version 3.0](https://reactnative.dev/blog/2024/04/22/release-0.74#yoga-30) 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 [release blog post](https://www.yogalayout.dev/blog/announcing-yoga-3.1). One notable and highly requested feature is the support for `%` values in various places, such as `gaps` and `translation` info These features are available only for the New Architecture. If you are keen to use them, please consider migrating to it. #### Percentage Values in Gaps[​](#percentage-values-in-gaps "Direct link to Percentage Values in Gaps") With 0.75, the `gap`, `columnGap` and `rowGap` props described [here](https://reactnative.dev/docs/flexbox#row-gap-column-gap-and-gap) now support a string with a `%` value. For example: ``` function App(): React.JSX.Element { return ( ); } ``` Will be rendered as follows: | Android | iOS | | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | ![Android Gaps](/assets/images/0.75-android-gaps-666a10baba3b26cae0c48bb2a696a43a.png) | ![iOS Gaps](/assets/images/0.75-ios-gaps-e2e421fdbebed0fa1c724113892ff1ed.png) | #### Percentage values in Translation[​](#percentage-values-in-translation "Direct link to Percentage values in Translation") The [`transform` prop](https://reactnative.dev/docs/transforms) can also now accept `%` as values for the `translate` transformations. 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: ``` function Translated() { return ( ); } ``` Will be rendered as follows: | Android | iOS | | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | ![Android Translation](/assets/images/0.75-android-translations-88fc4632bc683645cf686b9855356ed1.png) | ![iOS Translation](/assets/images/0.75-ios-translation-a38ecabf731f3b27ea02ba45f16f8d93.png) | ### New Architecture Stabilization[​](#new-architecture-stabilization "Direct link to New Architecture Stabilization") Since our announcement of the [New Architecture being in Beta](https://github.com/reactwg/react-native-new-architecture/discussions/189) at React Conf, we shipped several bug fixes and improvements to its stability. 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: * Fix `adjustsFontSizeToFit` on Android ([#44075](https://github.com/facebook/react-native/pull/44075)) * Fix `textAlign` not working with inline views on Android ([#44146](https://github.com/facebook/react-native/pull/44146)) * Fix text baseline being moved up on iOS ([#44932](https://github.com/facebook/react-native/pull/44932)) Together with the folks at Expo, we also worked on adding information about New Architecture support in the [React Native Directory](https://reactnative.directory/), so it will be immediately clear for you if a library already supports the New Architecture or not: ![React Native Directory](/assets/images/0.75-rn-directory-a5b9d610243d3824942bfff41c0a5656.png) We also invite you to take part in the [New Architecture survey](https://t.co/ucAA58hnFu). This survey is key for us to collect precious feedback on the next steps for the New Architecture rollout. We also want to share a post we published in the New Architecture Working Group about [Supporting UIManager in the New Architecture](https://github.com/reactwg/react-native-new-architecture/discussions/201). This post offers an API overview of the `UIManager` API on Android and how it can help the migration of more advanced apps & libraries. This release contains also a new API which is now the blessed way to access the `jsi::Runtime`. #### Accessing `jsi::Runtime` in TurboModules[​](#accessing-jsiruntime-in-turbomodules "Direct link to accessing-jsiruntime-in-turbomodules") In the past, there has never been a recommended way from native modules to access the `jsi::Runtime`, 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 `jsi::Runtime`, and we’re happy to announce their stability for 0.75. Examples on how to access the jsi::Runtime On iOS, you can make your Turbo Native Module conform to the protocol `RCTTurboModuleWithJSIBindings`. You can now implement `installJSIBindingsWithRuntime`, which will give you thread-safe access to the runtime. ``` @interface RCTSampleTurbo Module () @end #pragma mark - RCTTurboModuleWithJSIBindings - (void)installJSIBindingsWithRuntime:(jsi::Runtime &)runtime { runtime.global().setProperty( runtime, "myGlobalFunction", jsi:: Function::createFromHost Function(...)); } ``` On Android, you can make your Turbo Native Module conform to the interface `TurboModuleWithBindings`. You can now implement the JNI method `getBindingsInstaller`, which will give you thread-safe access to the runtime in C++. ``` public class SampleTurboModule extends NativeSampleTurboModuleSpec implements TurboModuleWithJSIBindings @Override public native BindingsInstallerHolder getBindingsInstaller(); ``` ``` // C++ jni::local_ref SampleTurboModuleJSIBindings::getBindingsInstaller(jni::alias_ref jobj) { return BindingsInstallerHolder::newObjectCxxArgs( [](jsi::Runtime& runtime) { runtime.global().setProperty( runtime, “myGlobalFunction”, jsi::Function::createFromHostFunction(...)); } ); } ``` If you’re on the UI thread and you need to access the runtime, we introduced a new API: `CallInvoker`. It consists of a single method, `invokeAsync`, that will jump onto the JS thread to safely execute some work using the JS runtime. These APIs are forward compatible. On iOS, we’ve provided the protocol `RCTCallInvokerModule`. After conforming to this protocol, our infrastructure will decorate the module with access to the `CallInvoker`. ``` @interface RCTSampleTurboModule() [self.callInvoker callInvoker].invokeAsync([&](jsi::Runtime& runtime) { // do stuff on JS thread } ``` On Android, the `CallInvoker` is accessible through the `ReactContext` in a JNI wrapper called `CallInvokerHolder`, where you can then call `invokeAsync` after crossing the JNI boundary. ``` // Java public abstract CallInvokerHolder getJSCallInvokerHolder(); ``` ``` // C++ jsCallInvokerHolder->cthis()->getCallInvoker()->invokeAsync([&](jsi::Runtime& rt) { // do stuff on JS thread }); ``` ### Using Frameworks[​](#using-frameworks "Direct link to Using Frameworks") 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. You can read more about this guidance on our previous blog-post: "[Use a framework to build React Native apps](https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps)". 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. To reflect those recommendations, this version includes the following changes: * We moved the `/template` folder from the `react-native` package to a separate repository: [`react-native-community/template`](https://github.com/react-native-community/template). * We’re sunsetting the `react-native init` command as of December 31st 2024. 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 [this dedicated Expo post](https://expo.dev/changelog/2024/08-14-react-native-0.75)). If you’re not using a framework or you’re building your own framework, let’s see how those changes will impact you. #### Moving the template to react-native-community/template[​](#moving-the-template-to-react-native-communitytemplate "Direct link to Moving the template to react-native-community/template") Historically, `react-native` used to ship a `/template` 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. With our latest recommendation to use a framework, we feel that shipping an opinionated template inside our core NPM package was not aligned with [our vision](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md). Therefore, we decided to move the template to the [`@react-native-community/template`](https://www.npmjs.com/package/@react-native-community/template) package. 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. 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 [template issue tracker](https://github.com/react-native-community/template/issues?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen). 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. #### Sunsetting react-native init[​](#sunsetting-react-native-init "Direct link to Sunsetting react-native init") Similarly to the template, the `react-native init` command was also adapted to align with the new recommendation. Historically, `react-native init` 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. You can still use `react-native init` to create new projects using the Community CLI & template today, but you will see the following warning: ![Init Deprecation](/assets/images/0.75-deprecation-55d183c728154671a92452650a08275e.png) Starting from December 31st 2024, the `init` command won’t create a project anymore. You will have to either: * Use a framework such as Expo, with its own dedicate command to create a new project, such as `npx create-expo-app` * Invoke the Community CLI directly with `npx @react-native-community/cli init` Please note that `react-native config` and all the other commands than `init` will continue working as usual. info In order to offer a smoother migration experience, the `react-native@0.75.0` package is still depending on `@react-native-community/cli` but we’re planning on removing this dependency in the near future. #### Auto-linking performance improvements[​](#auto-linking-performance-improvements "Direct link to Auto-linking performance improvements") During this work in updating the `init` 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. 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 [here](https://github.com/react-native-community/discussions-and-proposals/discussions/814). ### Breaking changes[​](#breaking-changes-1 "Direct link to Breaking changes") 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. We want to present them here for the sake of completeness and for reference. #### Touchables in TypeScript can’t be used as types in Generic expressions anymore[​](#touchables-in-typescript-cant-be-used-as-types-in-generic-expressions-anymore "Direct link to Touchables in TypeScript can’t be used as types in Generic expressions anymore") `TouchablesOpacity` and `TouchableHighlights` components have been converted to functional components. This means that they cannot be used as `value & type` anymore. So, for example, the following is not valid anymore: ``` import {TouchableHighlight} from 'react-native'; const ref = useRef(); // ^^^ TS2749: TouchableHighlight refers to a value, but is being used as a type here. // Did you mean typeof TouchableHighlight? ``` Instead, you should use the built-in React type `React.ElementRef` or, alternatively, the `View` type: ``` import {TouchableHighlight} from 'react-native'; const ref1 = useRef>(); // or const ref2 = useRef(); ``` #### Last version supporting minSdk 23 and minIOSVersion 13.4[​](#last-version-supporting-minsdk-23-and-miniosversion-134 "Direct link to Last version supporting minSdk 23 and minIOSVersion 13.4") These are not breaking changes in 0.75 *per se*, 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. Starting from React Native 0.76, the minSdk version will be 24 (Android 7.0) and the minIOSVersion will be 15.1. You can read more about it in our official announcement [for Android](https://github.com/react-native-community/discussions-and-proposals/discussions/802) and [for iOS](https://github.com/react-native-community/discussions-and-proposals/discussions/812). #### Android: JSIModule has been deleted[​](#android-jsimodule-has-been-deleted "Direct link to Android: JSIModule has been deleted") The `com.facebook.react.bridge.JSIModule` ([source](https://github.com/facebook/react-native/blob/0.73-stable/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModule.java)) was an API that we temporarily introduced to allow a Native Module to access JSI directly on Android. The accessors for this API [were deprecated in 0.74](https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes), 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 [Turbo Native Modules](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/turbo-modules.md) instead as an alternative. #### Android: PopUp Menu moved to separate package[​](#android-popup-menu-moved-to-separate-package "Direct link to Android: PopUp Menu moved to separate package") In 0.74, [we moved the Android’s `PopUpMenu` to a separate package](https://reactnative.dev/blog/2024/04/22/release-0.74#other-breaking-changes) under the `@react-native` scope. In 0.75, we are removing the remaining methods that were still in core: * `UIManagerModule.showPopupMenu()` * `UIManagerModule.dismissPopupMenu()` As an alternative, please use the please use the `` component, which lives in the [`@react-native/popup-menu-android`](https://www.npmjs.com/search?q=%40react-native%2Fpopup-menu-android) package. #### iOS: Finalized PushNotificationIOS deprecation work[​](#ios-finalized-pushnotificationios-deprecation-work "Direct link to iOS: Finalized PushNotificationIOS deprecation work") In 0.74, we [deprecated](https://reactnative.dev/blog/2024/04/22/release-0.74#api-changes-to-pushnotificationios-deprecated) some APIs from the `PushNotificationIOS` module. In 0.75, we’ve deleted these APIs to migrate off legacy representations of notifications metadata. The APIs that have been deleted are: ``` + (void)didReceiveLocalNotification:(UILocalNotification *)notification; + (void)didReceiveRemoteNotification:(NSDictionary *)notification; ``` Instead, use `didReceiveNotification:(UNNotification *)notification`. #### Community CLI: Removal of ram-bundle and profile-hermes commands[​](#community-cli-removal-of-ram-bundle-and-profile-hermes-commands "Direct link to Community CLI: Removal of ram-bundle and profile-hermes commands") We would like to announce two significant removals coming from the Community CLI: the commands `ram-bundle` and `profile-hermes`. The `ram-bundle` 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 `ram-bundle` command. The `profile-hermes` command was a tool to help you profile the CPU performance of your JavaScript code. This used the old `.cpuprofile` 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 [Experimental New Debugger](https://reactnative.dev/docs/0.74/debugging?js-debugger=new-debugger#opening-the-debugger) (Note: this is not accessible if connecting to Hermes from Chrome). ## Other Breaking changes[​](#other-breaking-changes "Direct link to Other Breaking changes") ### General[​](#general "Direct link to General") * **Codegen** * Changed slightly the name of pure C++ TurboModules generated classes and structs. We dropped the `Cxx` token from their names * Float enums are not supported anymore due to possible precision errors * Throw an error when passing `null` in JS to a non nullable argument in Native * **Linting** * ESLint config no longer run prettier when linting * **C++** * `ScrollViewShadowNode` now requires a new `bool includeTransform` parameter in the constructor * Removed `executeAsynchronously` and `executeSynchronously_CAN_DEADLOCK` from RuntimeExecutor * Renamed `JsErrorHandlingFunc` to `OnJsError` in `JsErrorHandler.h` * Renamed `handleJsError` to `OnJsError` in `handleFatalError.h` * Removed unused `import` from `ReactPrimitives.h` * `LongLivedObjectCollection` and `LongLivedObject` get methods now accepts a Runtime parameter * Renamed the `utils/jsi.h` file to `jsi-utils.h` * **TextInput** * Removed deprecated `onTextInput` callback * **Pressability** * Removed `onLongPressShouldCancelPress_DEPRECATED`, `onResponderTerminationRequest_DEPRECATED`, and `onStartShouldSetResponder_DEPRECATED` method #### Android[​](#android "Direct link to Android") * **ReactViewBackgroundDrawable** * Deprecated in favor of `CSSBackgroundDrawable`. This also remove some APIs from `ReactViewBackgroundDrawable` and from `ColorUtil` * **ReactContext** * `ReactContext` and `ReactApplicationContext` are now abstract. Use `BridgeReactContext` and `BridgelessReactContext` instead * Delete `ReactContext.initializeWithInstance()`. Please use `BridgeReactInstance` instead * Remove `BridgelessReactContext.getJavaScriptContextHolder()` from. Please use `BridgelessCatalystInstance` instead * Remove `ReactContext.getRuntimeExecutor()`. Please use `BridgelessCatalystInstance` * **Layout** * Support percentage flex gap values. This changes the parameters of some methods like `setGap`, `setRowGap` and `setColumnGap` from float to dynamic * Requires `supportsRTL` in Android Manifest * **Runtime** * Removed `ReactJsExceptionHandler` from ReactHostImpl * Make the app responsible to return the core turbomodules when not using the default template * **DevSupport** * Changed the `DevSupportManagerFactory.create()` to accept a new `PausedInDebuggerOverlayManager` parameter * **Measurement** * Deleted `UIManagerModule.measureLayoutRelativeToParent()` #### iOS[​](#ios "Direct link to iOS") * **Runtime** * Remove `[RCTHost getSurfacePresenter]` and `[RCTHost getModuleRegistry]` * Remove `EventPriority` class and always use the default `EventPriority::AsynchronousBatched`. If build fails, please remove any use of `EventPriority` * **Image** * Remove unused `RCTImageLoadingPerfInstrumentationEnabled` * **Error Handling** * Remove `RCTRedBox` access through `RCTBridge` * **CocoaPods** * Renamed `BUILD_FROM_SOURCE` to `RCT_BUILD_HERMES_FROM_SOURCE` * Renamed `React-Codegen` to `ReactCodegen` for better compatibility with `use_frameworks` and Swift * **TextInput** * Remove deprecated `onTextInput` callback ### Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.75 contains over **1491 commits** from **165 contributors**. Thanks for all your hard work! Thanks to all the additional authors that worked on documenting features in this release post: * [Nick Gerleman](https://github.com/NickGerleman) and [Joe Vilches](https://github.com/joevilches) for *Yoga 3.1 and Layout Improvements* * [Arushi Kesarwani](https://github.com/arushikesarwani94) for Supporting UIManager in the New Architecture * [Phillip Pan](https://github.com/philIip) for Accessing jsi::Runtime in TurboModules * [Alan Lee](https://github.com/alanleedev) and [Soe Lynn](https://github.com/realsoelynn) for Last version supporting minSdk 23 and minIOSVersion 13.4 * [Kudo Chien](https://github.com/kudo) for Auto-linking performance improvements * [Alex Hunt](https://github.com/huntie) for Removal of `ram-bundle` and `profile-hermes` commands ### Upgrade to 0.75[​](#upgrade-to-075 "Direct link to Upgrade to 0.75") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` 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 [in this dedicated post](https://expo.dev/changelog/2024/08-14-react-native-0.75)). info 0.75 is now the latest stable version of React Native and 0.72.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). We aim to publish a final end-of-life update of 0.72 in the near future. **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.76 - New Architecture by default, React Native DevTools, and more October 23, 2024 · 12 min read ![Blake Friedman](https://github.com/blakef.png) Blake Friedman Software Engineer @ Meta [](https://github.com/blakef "GitHub") ![Riccardo Cipolleschi](https://github.com/cipolleschi.png) Riccardo Cipolleschi Software Engineer @ Meta [](https://x.com/CipolleschiR "X")[](https://github.com/cipolleschi "GitHub") ![Frank Calise](https://github.com/frankcalise.png) Frank Calise Software Engineer @ Infinite Red [](https://x.com/frankcalise "X")[](https://github.com/frankcalise "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") Today we are excited to release React Native 0.76! 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. ### Highlights[​](#highlights "Direct link to Highlights") * [React Native New Architecture by default](/blog/2024/10/23/release-0.76-new-architecture.md#react-native-new-architecture-by-default) * [React Native DevTools](/blog/2024/10/23/release-0.76-new-architecture.md#react-native-devtools) * [Faster Metro resolution](#faster-metro-resolution) * [Box Shadow and Filter style props](/blog/2024/10/23/release-0.76-new-architecture.md#box-shadow-and-filter-style-props) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Removed the dependency on the react-native-community/cli](/blog/2024/10/23/release-0.76-new-architecture.md#removed-the-dependency-on-the-react-native-communitycli) * [Android Apps are \~3.8Mb smaller thanks to Native Library merging](/blog/2024/10/23/release-0.76-new-architecture.md#android-apps-are-38mb-smaller-thanks-to-native-library-merging) * [Updates to Minimum iOS and Android SDK requirements](/blog/2024/10/23/release-0.76-new-architecture.md#updates-to-minimum-ios-and-android-sdk-requirements) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### React Native New Architecture by default[​](#react-native-new-architecture-by-default "Direct link to React Native New Architecture by default") 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. Today, we’re excited to declare the New Architecture ready for production use. 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: [The New Architecture is Here](/blog/2024/10/23/the-new-architecture-is-here.md). ### React Native DevTools[​](#react-native-devtools "Direct link to React Native DevTools") ![React Native DevTools front-end](/assets/images/0.76-react-native-devtools-0b22a36dd405d34834004e51a3fcce23.jpg) We're releasing the first stable version of React Native DevTools, our new default debugging experience. 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 — browser-aligned developer tools that are deeply integrated with React Native. Key features include: * **Familiar, web-aligned tooling** — 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. * **Improved and integrated React DevTools** — The built-in React Components Inspector and Profiler work seamlessly, with faster and more reliable component highlighting. * **Improved UX** — See a new *Paused in Debugger* 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. * **Fixed reconnection behaviour** — 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. * **Instant launch** — React Native DevTools is ready by default with zero config. Open it from the in-app Dev Menu or via `j` to debug in the CLI server, which now supports multiple emulators and devices. 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 [has changed](https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=announcement%20talk%20%F0%9F%8E%AC.-,Compatibility,-React%20Native%20DevTools), 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. #### Phasing out logs in Metro[​](#phasing-out-logs-in-metro "Direct link to Phasing out logs in Metro") 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 [FAQs](https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=point%20is%20deprecated.-,FAQs,-React%20Native%20DevTools). **Links** * [Updated debugging docs](/docs/debugging.md) * [Announcement talk at React Universe Conf](https://www.youtube.com/watch?v=OwivVpg6Luc) * [Feedback thread and FAQs](https://github.com/react-native-community/discussions-and-proposals/discussions/819) ### Faster Metro resolution[​](#faster-metro-resolution "Direct link to Faster Metro resolution") We've shipped several performance improvements to Metro's resolver, the component responsible for finding a module from an import path, making it around [15x faster](https://x.com/MetroBundler/status/1831709057670861260). This improves the overall performance of Metro, particularly for warm builds, which we've seen at around 4x faster. ### Box Shadow and Filter style props[​](#box-shadow-and-filter-style-props "Direct link to Box Shadow and Filter style props") We’ve added two New Architecture only style props in 0.76 - `boxShadow` and `filter`. 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. #### `boxShadow`[​](#boxshadow "Direct link to boxshadow") `boxShadow` adds a shadow to an element, with the ability to control the position, color, size, and blurriness of the shadow. Check out the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow) 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. ![New boxShadow style prop](/assets/images/0.76-boxshadow-example-bcdd9211ba98197988fe526954b8b102.png) `boxShadow` can take either a string, which mimics the CSS syntax, or JS objects which can embed variables. For example the string `‘5 5 5 0 rgba(255, 0, 0, 0.5)’` and the object `{offsetX: 5, offsetY: 5, blurRadius: 5, spreadDistance: 0, color: ‘rgba(255, 0, 0, 0.5)’}` would yield the same box shadow. The [previous shadow functionality](https://reactnative.dev/docs/shadow-props) had some shortcomings addressed now addressed by `boxShadow`: * Does not work on Android * Cannot be [inset](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#inset) * Does not have [spread](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow#length) * Does not work on `View`s if there is no background color * Is a separate prop, so it cannot share the same web syntax #### Limitations & Spec Deviations[​](#limitations--spec-deviations "Direct link to Limitations & Spec Deviations") * The default shadow color is black, not the parent’s color * Android normal shadows are supported on **Android 9+** * Android inset shadows are supported on **Android 10+** #### `filter`[​](#filter "Direct link to filter") `filter` 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 [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/filter) 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. ![Filters demonstration](/blog/assets/0.76-filter-example.png) From left to right: no filter, `saturate` filter, `blur` filter, `invert` filter Like `boxShadow`, `filter` can take either a string, which mimics the CSS syntax, or an array of JS objects which can embed variables. For example the string `‘saturate(0.5) grayscale(0.25)’` and the array `[{saturate: 0.5}, {grayscale: 0.25}]` would yield the same filter. `filter` has a `dropShadow` value which varies slightly from `boxShadow`. The biggest difference is that `dropShadow` is an alpha mask - so the shadow will only be cast by a pixel if it has a nonzero alpha component. `boxShadow`, 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). #### Limitations and Spec Deviations[​](#limitations-and-spec-deviations "Direct link to Limitations and Spec Deviations") * iOS `filter` only supports brightness and opacity * iOS `filter` will not apply to shadows, outlines, or any other graphical elements outside the bounds of the element * Android `blur` and `drop-shadow` are only supported on **Android 12+** * `filter` implies `overflow: hidden`, so children of an element with a `filter` will be clipped if they are positioned outside of the parents bounds. ## Breaking Changes[​](#breaking-changes-1 "Direct link to Breaking Changes") ### Removed the dependency on the @react-native-community/cli[​](#removed-the-dependency-on-the-react-native-communitycli "Direct link to Removed the dependency on the @react-native-community/cli") As previously shared in 0.75, our vision is for React Native to be [framework agnostic](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0759-react-native-frameworks.md). Therefore, we completed the work to remove @react-native-community/cli as a direct dependency of React Native. 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. If you are relying on the CLI in your daily workflow, make sure to explicitly [add the dependency](https://react-native-community.github.io/upgrade-helper/?from=0.75.4\&to=0.76.0#RnDiffApp-package.json) on the CLI in your `package.json`: ``` //… “devDependencies”: { // … + “@react-native-community/cli”: “15.0.0”, + "@react-native-community/cli-platform-android": “15.0.0”, + "@react-native-community/cli-platform-ios": “15.0.0”, }, ``` ### Android Apps are \~3.8Mb smaller thanks to Native Library merging[​](#android-apps-are-38mb-smaller-thanks-to-native-library-merging "Direct link to Android Apps are ~3.8Mb smaller thanks to Native Library merging") 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 `libreactnative.so`. 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%) ([source](https://github.com/react-native-community/discussions-and-proposals/discussions/816)). On the other hand, this is a breaking change for both app and library developers. App developers will have to update their Application’s `onCreate` as follows: ``` +import com.facebook.react.soloader.OpenSourceMergedSoMapping import com.facebook.soloader.SoLoader class MainApplication : Application(), ReactApplication { override fun onCreate() { super.onCreate() + SoLoader.init(this, OpenSourceMergedSoMapping) - SoLoader.init(this, false) } } ``` This change is necessary in order to properly load libreactnative.so and is [included in the upgrade-helper](https://react-native-community.github.io/upgrade-helper/). Library authors won’t be affected by this change, unless you have custom C++ code. For a technical deep dive into this change, and suggestions for library authors, you can read more about it [in the dedicated post](https://github.com/react-native-community/discussions-and-proposals/discussions/816). ### Updates to Minimum iOS and Android SDK requirements[​](#updates-to-minimum-ios-and-android-sdk-requirements "Direct link to Updates to Minimum iOS and Android SDK requirements") We have updated our minimum platform and SDK versions: * iOS - from 13.4 to [15.1](https://support.apple.com/en-gb/108051#151) * Android - from SDK 23 to [SDK 24](https://developer.android.com/tools/releases/platforms#7.0) (Android 7) This change was announced earlier in the year when 0.75 [was released](/blog/2024/08/12/release-0.75.md#last-version-supporting-minsdk-23-and-miniosversion-134). For more background, please see the dedicated posts for [Android](https://github.com/react-native-community/discussions-and-proposals/discussions/802) and [iOS](https://github.com/react-native-community/discussions-and-proposals/discussions/812). ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") * **Animation** * Stop sending state updates to React in looping animation. This was causing unnecessary re-rendering with looping animations. * **devtools:** * Remove Inspector Panel perf + network tabs under New Arch. ([RFC](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0777-remove-legacy-element-inspector-features.md)) * **text engine** * Always use AttributedStringBox instead of AttributedString in TextLayoutManager #### Android[​](#android "Direct link to Android") * **rendering:** * View backgrounds are no longer directly `ReactViewBackgroundDrawable` or `CSSBackgroundDrawable` #### iOS[​](#ios "Direct link to iOS") * **turbomodule** * Removed the `RCT_EXPORT_CXX_MODULE_EXPERIMENTAL` Macro for autolinking pure Cxx module. ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.76 contains over [1070 commits](https://github.com/facebook/react-native/compare/v0.75.4...v0.76.0) from 156 contributors. Thanks for all of your hard work! Thanks to all the additional authors that worked on documenting features in this release post: * [Joe Vilches](https://github.com/joevilches) and [Nick Gerleman](https://github.com/NickGerleman) box-shadow and filter style props. * [Alex Hunt](https://github.com/huntie) React Native DevTools. * [Nicola Corti](https://github.com/cortinico) Android shipping as a single library. ## Upgrade to 0.76[​](#upgrade-to-076 "Direct link to Upgrade to 0.76") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. If you use Expo, React Native 0.76 will be supported in Expo SDK 52. If you need to create a new project using the CLI, you can run this command: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` info 0.76 is now the latest stable version of React Native and 0.73.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). We aim to publish a final end-of-life update of 0.73 in the near future. **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) --- # New Architecture is here October 23, 2024 · 24 min read ![The React Team](https://github.com/react-native-bot.png) The React Team @reactjs / @reactnative [](https://x.com/reactnative "X") React Native 0.76 with the New Architecture by default is now available on npm! In the [0.76 release blog post](/blog/2024/10/23/release-0.76-new-architecture.md), 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. The New Architecture adds full support for modern React features, including [Suspense](https://react.dev/blog/2022/03/29/react-v18#new-suspense-features), [Transitions](https://react.dev/blog/2022/03/29/react-v18#new-feature-transitions), [automatic batching](https://react.dev/blog/2022/03/29/react-v18#new-feature-automatic-batching), and [`useLayoutEffect`](https://react.dev/reference/react/useLayoutEffect). The New Architecture also includes new [Native Module](/docs/next/turbo-native-modules-introduction) and [Native Component](/docs/next/fabric-native-components-introduction) systems that let you write type-safe code with direct access to native interfaces without a bridge. 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 [the New Architecture Working Group](https://github.com/reactwg/react-native-new-architecture/) to collaborate with the community on ensuring a smooth upgrade experience for the entire React ecosystem. 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. 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: * [React Native EU 2019 - The New React Native](https://www.youtube.com/watch?v=52El0EUI6D0) * [React Conf 2021 - React 18 Keynote](https://www.youtube.com/watch?v=FZ0cG47msEk) * [App.js 2022 - Bringing the New React Native Architecture to the OSS Community](https://www.youtube.com/watch?v=Q6TkkzRJfUo) * [React Conf 2024 - Day 2 Keynote](https://www.youtube.com/watch?v=Q5SMmKb7qVI) ## What is the New Architecture[​](#what-is-the-new-architecture "Direct link to What is the New Architecture") 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. 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. 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. 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. 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. 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: * The New Native Module System * The New Renderer * The Event Loop * Removing the Bridge 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. 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. 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, `MutationObserver`, and `IntersectionObserver`. 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. 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 [Quest devices](https://engineering.fb.com/2024/10/02/android/react-at-meta-connect-2024/). Our partners have already been using the New Architecture in production for months now: have a look at these success stories by [Expensify](https://blog.swmansion.com/sunrising-new-architecture-in-the-new-expensify-app-729d237a02f5) and [Kraken](https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture), and give [Bluesky](https://github.com/bluesky-social/social-app/releases/tag/1.92.0-na-rc.2) a shot with their new release. ### New Native Modules[​](#new-native-modules "Direct link to New Native Modules") 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: * Synchronous access to and from the native runtime * Type safety between JavaScript and native code * Code sharing across platforms * Lazy module loading by default 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. 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: ``` // ❌ Sync callback from Native Module nativeModule.getValue(value => { // ❌ value cannot reference a native object nativeModule.doSomething(value); }); ``` In the New Architecture, you can make synchronous calls to native functions: ``` // ✅ Sync response from Native Module const value = nativeModule.getValue(); // ✅ value can be a reference to a native object nativeModule.doSomething(value); ``` 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 [modules written in C++](/docs/next/the-new-architecture/pure-cxx-modules) 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. Additionally, with [Codegen](/docs/next/the-new-architecture/what-is-codegen), 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. 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. Popular libraries such as [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv) have already seen benefits from migrating to the new Native Modules: > “The new Native Modules greatly simplified setup, autolinking, and initialization for `react-native-mmkv`. Thanks to the New Architecture, `react-native-mmkv` 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 `NullPointerReference` 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.” > > [Marc Rousavy](https://twitter.com/mrousavy), creator of `react-native-mmkv` ### New Renderer[​](#new-renderer "Direct link to New Renderer") We've also completely rewritten the Native Renderer, adding several benefits: * Updates can be rendered on different threads at different priorities. * Layout can be read synchronously and across different threads. * The renderer is written in C++ and shared across all platforms. 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). 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. 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. This is a significant step towards our [Many Platform Vision](/blog/2021/08/26/many-platform-vision). For example, View Flattening was an Android-only optimisation to avoid deep layout trees. The new renderer, with shared C++ core, [brings this feature to iOS](https://github.com/reactwg/react-native-new-architecture/discussions/110). This optimisation is automatic and does not require setup, it comes for free with the shared renderer. 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. Popular libraries like [Reanimated](https://docs.swmansion.com/react-native-reanimated/) are already taking advantage of the New Renderer: > “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.” > > [Krzysztof Magiera](https://x.com/kzzzf), creator of [Reanimated](https://docs.swmansion.com/react-native-reanimated/) ### The Event Loop[​](#the-event-loop "Direct link to The Event Loop") The New Architecture allowed us to implement a well-defined event loop processing model, as described in this [RFC](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0744-well-defined-event-loop.md). This RFC follows the specifications described in the [HTML Standard](https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model), and it describes how React Native should perform tasks on the JavaScript thread. 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. The event loop brings many benefits to React Native: * The ability to interrupt rendering to process events and tasks * Closer alignment with web specifications * Foundation for more browser features 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. 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. It also allows for the implementation of more compliant browser features like microtasks, `MutationObserver`, and `IntersectionObserver`. These features are not ready to use in React Native yet, but we are working on bringing them to you in the future. Finally, the Event Loop and the New Renderer changes to support reading layout synchronously allow React Native to add proper support for `useLayoutEffect` 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. See [`useLayoutEffect`](/blog/2024/10/23/the-new-architecture-is-here.md#uselayouteffect) for more details. ### Removing the Bridge[​](#removing-the-bridge "Direct link to Removing the Bridge") 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: ![](/assets/images/0.76-bridge-diagram-4e31abb22d5626336e548fa646c8cfc4.png) 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: ``` // ❌ Slow initialization import {NativeTimingModule} from 'NativeTimingModule'; global.setTimeout = timer => { NativeTimingModule.setTimeout(timer); }; // App.js setTimeout(() => {}, 100); ``` In the New Architecture, we can directly bind methods from C++: ``` // ✅ Initialize directly in C++ runtime.global().setProperty(runtime, "setTimeout", createTimer); ``` ``` // App.js setTimeout(() => {}, 100); ``` The rewrite also improves error reporting, particularly for JavaScript crashes at startup, and reduces crashes from undefined behavior. If crashes occur, the new [React Native DevTools](/docs/next/react-native-devtools) simplify debugging and support the New Architecture. The bridge remains for backward compatibility to support gradual migration to the New Architecture. In the future, we will remove the bridge code completely. ### Gradual Migration[​](#gradual-migration "Direct link to Gradual Migration") We expect most apps can upgrade to 0.76 with the same effort as any other release. 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. 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 [known limitations](https://github.com/reactwg/react-native-new-architecture/discussions/237) with the interop layer, as it does not support accessing custom Shadow Nodes or concurrent features. To use concurrent features, apps will also need to be updated to support [Concurrent React](https://react.dev/blog/2022/03/29/react-v18#what-is-concurrent-react) by following the [Rules of React](https://react.dev/reference/rules). To migrate your JavaScript code to React 18 and its semantics, follow the [React 18 Upgrade guide](https://react.dev/blog/2022/03/08/react-18-upgrade-guide). 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. 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 [reactnative.directory](https://reactnative.directory) website: ![](/assets/images/0.76-directory-301eb7410932204b4c5149cdd20f604c.png) For more details on upgrading, see [How to Upgrade](/blog/2024/10/23/the-new-architecture-is-here.md#how-to-upgrade) below. ## New Features[​](#new-features "Direct link to New Features") The New Architecture includes full support for React 18, concurrent features, and `useLayoutEffect` in React Native. For a full list of React 18 features, please see the [React 18 blog post](https://react.dev/blog/2021/12/17/react-conf-2021-recap#react-18-and-concurrent-features). ### Transitions[​](#transitions "Direct link to Transitions") Transitions are a new concept in React 18 to distinguish between urgent and non-urgent updates. * **Urgent updates** reflect direct interaction, like typing and pressing. * **Transition updates** transition the UI from one view to another. 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. 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 `press` or `change` are handled as urgent and rendered immediately. You can use the `startTransition` API inside an input event to inform React which updates are “transitions” and can be deferred to the background: ``` import {startTransition} from 'react'; // Urgent: Show the slider value setCount(input); // Mark any state updates inside as transitions startTransition(() => { // Transition: Show the results setNumberOfTiles(input); }); ``` Separating urgent events from transitions allows for a more responsive user interface, and a more intuitive user experience. 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. **After** using `useTransition` you avoid thrashing your app with updates and falling behind. ![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.](/img/new-architecture/without-transitions.gif) **Before:** rendering tiles without marking it as a transition. ![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.](/img/new-architecture/with-transitions.gif) **After:** rendering tiles *with transitions* to interrupt in-progress renders of stale state. For more information, see [Support for Concurrent Renderer and Features](/architecture/landing-page.md#support-for-concurrent-renderer-and-features). ### Automatic Batching[​](#automatic-batching "Direct link to Automatic Batching") When upgrading to the New Architecture, you will benefit from automatic batching from React 18. 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. ![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.](/img/new-architecture/legacy-renderer.gif) **Before:** rendering frequent state updates with legacy renderer. ![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.](/img/new-architecture/react18-renderer.gif) **After:** rendering frequent state updates with *automatic batching*. 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. For more information, see [Support for Concurrent Renderer and Features](/architecture/landing-page.md#support-for-concurrent-renderer-and-features). ### useLayoutEffect[​](#uselayouteffect "Direct link to useLayoutEffect") Building on the Event Loop and the ability to read layout synchronously, in the New Architecture we added proper support for `useLayoutEffect` in React Native. In the old architecture, you needed to use the asynchronous `onLayout` 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: ``` // ❌ async onLayout after commit const onLayout = React.useCallback(event => { // ❌ async callback to read layout ref.current?.measureInWindow((x, y, width, height) => { setPosition({x, y, width, height}); }); }, []); // ... ; ``` The New Architecture fixes this by allowing synchronous access to layout information in `useLayoutEffect`: ``` // ✅ sync layout effect during commit useLayoutEffect(() => { // ✅ sync call to read layout const rect = ref.current?.getBoundingClientRect(); setPosition(rect); }, []); // ... ; ``` 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: ![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](/img/new-architecture/async-on-layout.gif) In the old architecture, layout was read asynchronously in `onLayout`, causing the position of the tooltip to be delayed. ![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.](/img/new-architecture/sync-use-layout-effect.gif) In the New Architecture, layout can be read in `useLayoutEffect` synchronously, updating the tooltip position before displaying. For more information, see the docs for [Synchronous Layout and Effects](/architecture/landing-page.md#synchronous-layout-and-effects). ### Full Support for Suspense[​](#full-support-for-suspense "Direct link to Full Support for Suspense") Suspense lets you declaratively specify the loading state for a part of the component tree if it’s not yet ready to be displayed: ``` }> ``` 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. 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. For more, see the [RFC for Suspense in React 18](https://github.com/reactjs/rfcs/blob/main/text/0213-suspense-in-react-18.md). ## How to Upgrade[​](#how-to-upgrade "Direct link to How to Upgrade") To upgrade to 0.76, follow the steps in the [release post](/blog/2024/10/23/release-0.76-new-architecture.md#upgrade-to-076). Since this release also upgrades to React 18, you will also need to follow the [React 18 Upgrade guide](https://react.dev/blog/2022/03/08/react-18-upgrade-guide). 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. 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. note In a future release, we will remove the interop layer and modules will need to support the New Architecture. ### Apps[​](#apps "Direct link to Apps") 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. 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 [reactnative.directory](https://reactnative.directory) website. If any of the libraries your app depends on are not compatible yet, you can: * Open an issue with the library and ask the author to migrate to the New Architecture. * If the library is not maintained, consider alternative libraries with the same features. * [Opt-out from the New Architecture](/blog/2024/10/23/the-new-architecture-is-here.md#opt-out) while those libraries are migrated. If your app has custom Native Modules or custom Native Components, we expect them to work fine, thanks to our [interop layer](https://github.com/reactwg/react-native-new-architecture/discussions/135). However, we recommend upgrading them to the new Native Module and Native Component APIs to fully support the New Architecture and adopt concurrent features. Please follow these guides to migrate your modules and components to the New Architecture: * [Native Modules](/docs/next/turbo-native-modules-introduction) * [Native Components](/docs/next/fabric-native-components-introduction) ### Libraries[​](#libraries "Direct link to Libraries") 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 [New Architecture Working Group](https://github.com/reactwg/react-native-new-architecture/). 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. You can follow these guides to migrate your modules and components to the New Architecture: * [Native Modules](/docs/next/turbo-native-modules-introduction) * [Native Components](/docs/next/fabric-native-components-introduction) ### Opt-out[​](#opt-out "Direct link to Opt-out") 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. To opt-out from the New Architecture: * On Android, modify the `android/gradle.properties` file and turn off the `newArchEnabled` flag: ``` -newArchEnabled=true +newArchEnabled=false ``` * On iOS, you can reinstall the dependencies by running the command: ``` RCT_NEW_ARCH_ENABLED=0 bundle exec pod install ``` ## Thanks[​](#thanks "Direct link to Thanks") 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. We are also extremely grateful to all the partners who collaborated with us to make this happen. Specifically, we would like to call out: * [Expo](https://expo.dev/), for adopting the New Architecture early on, and for supporting the work on migrating the most popular libraries. * [Software Mansion](https://swmansion.com/), 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. * [Callstack](https://www.callstack.com/), 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. * [Microsoft](https://opensource.microsoft.com/), for adding the New Architecture implementation for `react-native-windows` and `react-native-macos` as well as in several other developer tools. * [Expensify](https://www.expensify.com/), [Kraken](https://www.kraken.com/), [Bluesky](https://bsky.app/) and [Brigad](https://www.brigad.co/) for pioneering the adoption of the New Architecture and reporting various issues so that we could fix them for everyone else. * 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. **Tags:** * [announcement](/blog/tags/announcement) --- # React Native 0.77 - New Styling Features, Android’s 16KB page support, Swift Template January 21, 2025 · 16 min read ![Vojtech Novak](https://avatars.githubusercontent.com/u/1566403?v=4) Vojtech Novak Software Engineer @ Expo [](https://x.com/vonovak "X")[](https://github.com/vonovak "GitHub") ![Mazen Chami](https://avatars.githubusercontent.com/u/9324607?v=4) Mazen Chami Software Engineer @ InfiniteRed [](https://x.com/mazenchami "X")[](https://github.com/mazenchami "GitHub") ![Blake Friedman](https://github.com/blakef.png) Blake Friedman Software Engineer @ Meta [](https://github.com/blakef "GitHub") ![Rob Hogan](https://avatars.githubusercontent.com/u/2590098?v=4) Rob Hogan Software Engineer @ Meta [](https://x.com/robjhogan "X")[](https://github.com/robhogan "GitHub") Today we are excited to release React Native 0.77! This release ships several features: new styling capabilities such as support for `display: contents`, `boxSizing`, `mixBlendMode`, and `outline`-related properties to provide a more powerful layout options; Android 16KB page support to be compatible with the newer Android devices. We are also modernizing the community template by migrating it to Swift, while continuing to support and maintain compatibility with Objective-C for developers who prefer it. ### Highlights[​](#highlights "Direct link to Highlights") * [New CSS Features for better layouts, sizing and blending](#new-css-features-for-better-layouts-sizing-and-blending) * [Android version 15 support & 16KB page support](#android-version-15-support--16kb-page-support) * [Community CLI and Template Updates](#community-cli-and-template-updates) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Removal of `console.log()` streaming in Metro](#removal-of-consolelog-streaming-in-metro) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### New CSS Features for better layouts, sizing and blending[​](#new-css-features-for-better-layouts-sizing-and-blending "Direct link to New CSS Features for better layouts, sizing and blending") React Native 0.77 furthers our goal of aligning React Native with the web. We've added support for new CSS properties to give you more control over your app's layout, sizing, and blending. These changes can help simplify complex layouts, add texture, and make your app more accessible. info All these new features are available only for the [New Architecture](/blog/2024/10/23/the-new-architecture-is-here.md#how-to-upgrade). #### Simpler layouts with `display: contents`[​](#simpler-layouts-with-display-contents "Direct link to simpler-layouts-with-display-contents") The [`display: contents`](https://developer.mozilla.org/en-US/docs/Web/CSS/display#display_contents) prop allows an element to disappear from the layout structure while its children are still rendered as if they were direct children of the parent element. It can be useful for styling purposes where you want to apply styles to child elements without affecting the layout, when building wrapper components which must handle events, or if you need to interact with the ShadowTree. Technically speaking, `display: contents` renders an element without generating a layout box, but it preserves the layout boxes of the element’s children. The element with `display: contents` is effectively flattened out of the view hierarchy. Let’s have a look at this example where we want to display an alert when a widget is pressed. We have a red `Widget` inside of a container view: Container.jsx ``` function Container() { return ( ); } ``` ![display contents - setup](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAi4AAAIsCAIAAABa4LWDAAAAA3NCSVQICAjb4U/gAAAAknpUWHRSYXcgcHJvZmlsZSB0eXBlIEFQUDEAAHjaVYw7CsMwEER7nWKPMPvRrPY4wcjBEJLg+xcp5BR+zcBjeO053/M8Nvmen/14zSYiIlLRoqLsAWBgYYArFAYgL8W1rJEIAHr5iRsdLDo1nfpvAbU6sT4ONzfHYBkSUFs+tnsrtHt4VNTVdnoaOztnOgf3jPYDroos+BNFvGwAABIUSURBVHja7NoxDsFgGMfhxkZXLtGBI4hJnEDiIhKzYBCHwgE02kR90UN0sRq7G/oNfZ787/Ab3jdpmq+ZmVnEDRIAiEqKAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCK/lJVrzx/mJlZrNX1p9cpKoricNjvdlszM4u1y+Ucwru/KSrL5+12NTOziLvfryEEt6JkOp2t1xszM+tyWZa5FbWWy9XxeDIzsy43ny+kqJWm6Xg8MTOzLjccjqQIAM/cACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEgBTxY6/ObQAAYSAIZqZxkAOemmnAISKa0bVwWgCkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACkCQIoAQIoAkCIAkCIApAgApAgAKQIAKQJAigBAigCQIgCQIgCkCACkCAApAgApAkCKAECKAJAiAJAiAKQIAKQIACkCACninchhVu9MB0GK+KFlNysXezkIUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEwGWv7lWkPMAwDF9nkSrHNqVn4Dl8gSTEIglJmZQiIoo2I2IjWNqJNrrMqqD77e7Miu7O7FgOwsi6yPoD99U/zQsvd0pRkqQUJUlKUZIkpShJUoqSJClFSZJSlCRJKUqSlKIkSUpRkqQUJUlSipIkpShJklKUJClFSZKUouTzLNllxitWNla8YsYuq85kY80RM2bMWZ9nuGDGjAXrTplSlO/Kkn1GFpw6w4qRkTkrX+o1l5hwmX0be1xmwiXeuCjv2WfkiLVPmjNyyKnt1rxlZOTYxVpynwkTbnJ8nuFtJky4y4mNE0ZGFpz2DylF+Sae8zsD1zlwhj0GBv7jwJc65h5THrC0ccIDptzjxEV5wj8MXGVpuyV/MvA3r213xA0G/uKpi7XmJVOmPOf0PMMdpkx58fHwGb8ycJPD/iGlKN/EDlcYuMWhM+wzMPA/cz+2A64y8BvvbDfjFwau8Mh2B/zLwDX2/Hh2+IOBOyz6h5Si5Gv6mZ/AY3Zt95C3YP6BfTtmbTIAAjD8JEZdHMSKJlCoOigubg6FxiGD6KCDCB0ytaODipMu7kKxUPsD4pZZx6pTq6aUaqmKVOtmQNoSNKaQkljnfGQItLSE3vMbDl7u4Hivi23W+ADOkNN/UmRAmlSMRYgUhbCXTjPEEZos6e4VLdCgQl3SP1apgUFO6T9pMiAVKQqRohD22FEucQJUdLHOO1pkaFPlh6Q2n8AAFzim/6Q5FFtRiBSFsF8uMgBmdLFMDYyCdT5LarMABjlPKg50IVIUwr7b4huT3GKYa9znJQ22d/shqcQ4Ba5Q5BkrbNG7cxwHy/yUVKEOimT5xTwtHTaZA1mGJDX5yhRF8hQYp0SVli6WeMJTXvOXGe6Q5wabetLiO9OMMsx1HjFLM7aiECkKB8QG0xR4wAs+8oYpbnKbRdrs3B+eM8IYJd4yT5m75JlgQ6+ynOUwWNShwSx1TnKZqzRZparDF2qkyZHTYY0JCtyjzAJzlBhjhBK/Ja3wkMeUmeQ/+3YXWmUdB3D8c/ac1WqtNnJBbRlooWZqNMyEpWLaalnRLnpjtaC7wCAi0FovQlE3xVKXa/TmhEYhUYuIXkFaoBNFdL5OfAE9vgx1vuLO2dm88uLAw/Hgbob8P/zun7vny4////8iq+jmD4Zc2TnW0sBifqSHf/iEepZwSLwEUfitBCFFwbVhgI95k34m8xSv8iyzuIk/eYOdRussrbzGAaqZTyNNPMpETvIOzfQrSMRDlIH1cvSRYpgGyqlF3HHRZlDBNEoBcIplNHOCu3mMJhqZRxX7eYsvOC1Gmr9ZBaZSQw0R+aX5i/fZRjkPUM/zzGc8nXSErSgIKQqubVm+o4XreYTlrGElq+ngZYbZRDvnRveVX2ghzWQ+opOv+JJOPmU2RXxDO4MKMp1S8C9DANhKP6gjYgYVHGQ7WQB0g3HcB4Ah2mnlOmr5jO9p42t+4EMmMUAbXWSQK0OKOy7najVtlMhnhAN8zh7G8Qrf8hMd/EorjzOYZysKN+iCkKJgjOilhWV5Z4V4u1nOMBN4mwWUgoh7aGYKF1jH9tE9xuzgBCU000glQDlP8x63kWEN2xRkEjeDHRwFuMgm+qlkJgmqmMlJdnIG4Dz/gXImAmAXK0E1S1jELQCVNPEuZRxmLQfFGM9SXmcOU5lBJJ8s6+gmYiGLmU4xuJGHWco88RJhKwpCioKxlqIP8s4K8bo4TJJFzCIhx+28BI6w0dX7n11kWcgzFCHXXBoYIUWXgtzKNCIy9AKk6GOQuVSCMh5khH2kAPo4RpI7qQLAzxwnyRPMISFHgidZQJYt9CBXMTXUUaJQGX4jSzX13CVHEROYLV6CopCiIKQoGCMquJf7884UMdL8ToZi6kiKUQtO0Uva1ciwgWPgOW4Qo5gXwHl6GHBlEbUkybIZYC+X2LmbF6vKOA7gn/syc69zZxrnxVR0MWph45hOWEKYUZZGBUWL/oaIiILWRi1aRZuKghYRtIikclMLoUXaixK+wFA6muOo5VsyDs7YvN57T6u7OHDOcOeOwow8H367A4dzHn6cL+ecH88/4AnyoIV+igxyAeA4KLGNIsAUB5ilmRcpSFDiBXCZASbE5Ommlfrd4mewLuUVKk9RsmwYWwhCFAWLx2N8xv456xMJRrhKRIVjfJFUR1DbBXxCI25ylRnwkFRbyVNllOvqso0cZQ5RpcIAw5R4hBzIs55N/M0ppsCvoBS/nutcIyJLnyS1QznK/MsY4jLm5xqjoItVUoR/RUGIomDxK7GWnjlrjQRjlME0b/NqUu0FmGFKIyaZAlghVRurwQzj6rKZIlWGucwIg9xiB2vIAKyknzKnGa1NrKGFXtSMUwZZOiXL0E4XmGDKQt0kAkVKUoQPdMHtlg9LECweZSKQoUmqJlDQoApVgGakWwYiKurSytPsY4IzdDAEtTnvmk4eIFMbrrvBDbKsY23SaqBJqiyF2H0tyCxAjqwUYWwhCG9FwV2sQBaU+J3BOetjVmhEkWaAm1KVuQLylNRrF5jgJEOcosAWWlBTpI8eBjjPH1TIs4ssakrkQMS4VFOMgGUULFQbwAzT5qeJLlbSFp4sQYiiYOlaThFERKyZs7rIaUQr7eTAWakuMA5a6FCv7WCSEwxyjX7uJy+mh14mOcUAVXI8LKaTVjJUOS9ZlYtMkKGdkoXqpgjGGDU/q3iDj3ieYujmIERRsER10EuOMj8RuSNa6aMdHCCS7EdQ4D5WqNdGVjHNMU6Cfu5F3Go2kOVPjlKhhT4xHdTmIBwkkqDML+AeNtBmobrZAi4xJEFEJFkHe3iZrTSHbg5CFAVLVI6XaGKWfZxDyg7WA1Q1bidrwdecluASn4PlPEdevVp4iirD/EaRPjoQ184mOjnCcapsZSXiaqvhWy5KcJZvwEa2k7NQTTwLznGIMcSNciZ0ahCiKLi77eFRqhzlfYbFVPiBN3mHwxq3mWdo5QJ7GRJzhQ84QY6dPGl+HgfjXGQ9vRRShrB7OMcIEbvJJp1qD1WO8yGXxZznXf6ind08iNsURRsY5zsOMImaG3zJ95LNcpaDXKIaWjkIURQsXd28Rw//8RWv82ltK5r9vMZbHOYKJY0r8Qo7yPqffft5saoO4DD8OBaUqUQZSj+gRrKwEBENFwm18H+IUBNSCyEXRiVFNNQiiCCpVYiarSRcFAMlkUhgCBK0qkRDchNuQpnUKcymZZR30ehMOPQ+fJb38oVzz+WFezlG2cy7fMFhdvMse7nEEl7kdpOzCkwwwYPca7DF3MVlJsBqA8zndZZynr1sYw+HOcR7rOcTbmQN65lnCsxiKU9zM8d5hZf5iM/YzWZ2csZgJ3ierbzNT93KKUWZ0R5hH8sZ43NeZR1PspV9nGI1b/GQa3IfO1nLb3zJCBvZwA4+5RzL2M0KkzbMEjDEYu402EKWcguYw3KDPcweVnKWUV5iA0/xGl/xO2t5k/tNmbmsYxM3cJJdbGMTOxjlNjYyxz9NcJqDfMcRfu4+Ts8VZUabzaOM8iH7OAGARWzhGRYx5JoM8QAH2M/7fM1ZgCVsYDMLruqUm1jDCe5hBXMMNpuVLOQUj3GrwYZYxcd8cMXVWMEWnmA+s0yZWdzNCMt4h+NcAHPZwnN8y0EuXvGuxTzOIVazqPs4kzI2Nn79bNeuPQsW3IGRkTfGxsbbTNkE07SL/MBRjvA9v07PKZc4zTGOcpJxJq7LXeQkRznGj1ye/hMvcJwjfMO5f/H685z5+8f0x7z5fUFm0LZvfwHDw8P79x/4L88tRW1qUtTaXytFpWiS6we6JEn/FSVJSlGSJKUoSVKKkiQpRUmSUpQkSSlKkpSiJElKUZKkFCVJUoqSJKUoSZJSlCQpRUmSlKIkSSlKkqQUJUlKUZIkpShJUoqSJClFSZJSlCRJKUqSlKIkSUpRkqQUJUlSipIkpShJklKUJClFSZKUoiRJKUqSpBQlSUpR/vd+GRvvIiS5akNdgiRJKUqSP9mrAwEAAAAAIP/XRpjQiqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKpWVNWKqmpFVa2oqlZU1YqqakVVraiqVlTViqpqRVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVV1YqqWlFVraiqFVXViqpaUVWtqKoVVdWKqlpRVa2oqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6qqFVW1oqpaUVUrqqoVVbWiqlpRVSuqqhVVtaKqWlFVK6pK+3VswiAUhWHUIjsHOyEjCGktUgQnECtxBC10D0FsRRttbZ6K5+fMcD+uSZGZmUmRmZmZFJmZmRSZmZndJEVt2+T5H4CQ+r6Tom1lWcTxG4CQ6rqKztgruuTGdZ5WM7NHbBimS0nTb5J8ADhLlv0CX/4lRQCwJ0UASBEASBEAUgQAUgSAFAGAFAEgRQAgRQBIEQBIEQBSBABSBIAUAYAUASBFACBFAEgRAEgRAFIEAFIEgBQBgBQBIEUAIEUASBEASBEAUgQAUgSAFAGAFAEgRQBw0AxE4nKw8dxXowAAAABJRU5ErkJggg==) Now, let's build a new `Alerting` wrapper component, with the goal of alerting the user when a component beneath it is pressed, using [experimental pointer events](/blog/2022/12/13/pointer-events-in-react-native). For clarity, the background of this component is made blue. That might look something like the component below: Container.jsx ``` function Alerting({children}) { return ( alert('Hello World!')}> {children} } function Container() { return ( ); } ``` This doesn’t do quite what we want it to. `Alerting` adds a new layout box, with its own bounds, separate from the child `Widget`. Depending on the styling of the element it is wrapping, this may result in significant visual and functional changes. In this example, the blue background responds to taps with an alert when we want for only the red "Hello World" box to alert when tapped. ![before display contents](/assets/images/0.77-display-contents-2-593d0e47100de84ddad130e44df8e29b.gif) If we try this again, while setting `display: contents` on the `View` wrapper of `Alerting`, we only see alerts when the user presses within the original bounds of the `Widget`. This is because `Alerting` no longer adds its own box, but can still observe the pointer events bubbled from `Widget`. Container.jsx ``` function Alerting({children}) { return ( alert('Hello World!')}> {children} ); } // ... function Container ... ``` ![after display contents](/assets/images/0.77-display-contents-3-84116bf7857e21e84bca5890a2d9e00c.gif) #### Box sizing[​](#box-sizing "Direct link to Box sizing") The `boxSizing` prop defines how the element's various sizing props (`width`, `height`, `minWidth`, `minHeight`, etc.) are computed. If `boxSizing` is `border-box`, these sizes apply to the border box of the element. If it is `content-box` they apply to the content box of the element. The default value is `border-box`, this is different from the default value on the web. The [web documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing) is a good source of information if you wish to learn more about how this prop works. warning `border-box` has been the default forever at this point, and has been the only `boxSizing` value up until we added `content-box`. Changing the default would have been a breaking change that would suddenly break several layouts. We decided to keep `border-box` as default value to ensure backward compatibility. To understand the difference between `border-box` and `content-box`, have a look at these example, where both `View`s have `padding: 20` and `borderWidth: 10`. When using `border-box`, we consider border and padding for the sizing; when using `content-box`, we consider only the content for the sizing. ![after display contents](/assets/images/0.77-border-box-cfc6104410ab403e0f7b4809fb2087fe.png) #### CSS mixBlendMode[​](#css-mixblendmode "Direct link to CSS mixBlendMode") The `mixBlendMode` prop lets you control how an element blends its colors with the other elements in its **stacking context**. Check out the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode) for a full overview of each blending function. To help have more granular control about what is blending together, we also added the `isolation` property. Setting `isolation: isolate` on a `View` will force it to form a **stacking context**. So, you can set this on some ancestor `View` to ensure that some descendent `View` with `mixBlendMode` does not blend beyond the **isolated** `View`. ##### mixBlendMode Values[​](#mixblendmode-values "Direct link to mixBlendMode Values") * `normal`: The element is drawn on top of its background without blending. * `multiply`: The source color is multiplied by the destination color and replaces the destination. * `screen`: Multiplies the complements of the backdrop and source color values, then complements the result. * `overlay`: Multiplies or screens the colors, depending on the backdrop color value. * `darken`: Selects the darker of the backdrop and source colors. * `lighten`: Selects the lighter of the backdrop and source colors. * `color-dodge`: Brightens the backdrop color to reflect the source color. Painting with black produces no changes. * `color-burn`: Darkens the backdrop color to reflect the source color. Painting with white produces no change. * `hard-light`: Multiplies or screens the colors, depending on the source color value. The effect is similar to shining a harsh spotlight on the backdrop. * `soft-light`: Darkens or lightens the colors, depending on the source color value. The effect is similar to shining a diffused spotlight on the backdrop. * `difference`: Subtracts the darker of the two constituent colors from the lighter color. * `exclusion`: Produces an effect similar to that of the Difference mode but lower in contrast. * `hue`: Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color. * `saturation`: Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color. * `color`: Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color. This preserves the gray levels of the backdrop and is useful for coloring monochrome images or tinting color images. * `luminosity`: Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color. This produces an inverse effect to that of the Color mode. ![blend mode](/assets/images/0.77-blend-mode-434273fec000ab313596eb9c0b4c856b.png) #### Outline props[​](#outline-props "Direct link to Outline props") We’ve also introduced `outlineWidth`, `outlineStyle`, `outlineSpread` and `outlineColor`. These outline props work very similar to the respective `border` props, but it is rendered around the **border box** as opposed to around the **padding box**. These props allow to highlight elements by drawing their outline without affecting their layout. Check out the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/outline) for more details. ![outline props](/assets/images/0.77-outline-props-4f2aec2904024a80275f98a9f2bb7b92.png) ### Android version 15 support & 16KB page support[​](#android-version-15-support--16kb-page-support "Direct link to Android version 15 support & 16KB page support") #### Forced edge-to-edge on Android 15[​](#forced-edge-to-edge-on-android-15 "Direct link to Forced edge-to-edge on Android 15") We’ve already done some work to support Android 15 on the prior release. One of the noticeable changes in Android 15 is forced edge-to-edge display when you build apps with `targetSdk` 35. If you have not looked into this yet, please refer to our prior [recommendation](https://github.com/react-native-community/discussions-and-proposals/discussions/827) on how this should be handled as ignoring this can potentially break your UI in the app. note If you are using the [`react-native-safe-area-context`](https://www.npmjs.com/package/react-native-safe-area-context) in your app, the library is already handling the forced edge-to-edge for you. #### 16 KB page size support for Android[​](#16-kb-page-size-support-for-android "Direct link to 16 KB page size support for Android") Android 15 introduces support for 16KB memory page size enabling [performance improvements](https://developer.android.com/guide/practices/page-sizes#benefits) for apps and more, but making previous 4KB-based apps potentially incompatible on future devices; it's currently an opt-in feature for developers to test on select devices to prepare for 16 KB page size being the OS default. With the 0.77 release, React Native is ready to fully support 16 KB page size and developers will be able to test and ship apps for 16 KB devices using it. Please refer to [the official Android Developers site](https://developer.android.com/guide/practices/page-sizes) for further information on 16 KB support. ### Community CLI and Template Updates[​](#community-cli-and-template-updates "Direct link to Community CLI and Template Updates") #### Community CLI: react-native init deprecation[​](#community-cli-react-native-init-deprecation "Direct link to Community CLI: react-native init deprecation") This version fully completes the deprecation of the `react-native init` command that was [introduced in React Native 0.75](/blog/2024/08/12/release-0.75.md#sunsetting-react-native-init). As a reminder, you won’t be able to use the `react-native init` command anymore, but you’ll have to either: * [Use a framework](/blog/2024/06/25/use-a-framework-to-build-react-native-apps.md) such as Expo, with its own dedicated command to create a new project: `npx create-expo-app` * Invoke the Community CLI directly with `npx @react-native-community/cli init` #### Community CLI: Removal of "run on iOS/Android" key handlers from Metro[​](#community-cli-removal-of-run-on-iosandroid-key-handlers-from-metro "Direct link to Community CLI: Removal of \"run on iOS/Android\" key handlers from Metro") In this version, we removed the ‘a’ and ‘i’ keyboard shortcuts from Metro. Those shortcuts were used to invoke the `run-android` & `run-ios` community CLI commands. Those keyboard shortcuts provided worse developer experience and were rarely used. Moreover, we believe that frameworks are better suited to orchestrate the terminal outputs. You can read more about this change [in this dedicated post](https://github.com/react-native-community/discussions-and-proposals/discussions/821). #### Community Template: Swift as programming language for iOS apps[​](#community-template-swift-as-programming-language-for-ios-apps "Direct link to Community Template: Swift as programming language for iOS apps") info Projects using Expo should not be affected by this change. This change let us slim down the community template by replacing three files (`main.m`, `AppDelegate.h` and `AppDelegate.mm`) with a single, new [`AppDelegate.swift`](https://github.com/react-native-community/template/blob/main/template/ios/HelloWorld/AppDelegate.swift). This is technically a breaking change: you’ll see the change from Objective-C to Swift in the upgrade helper like this: ![Swift Upgrade Helper](/assets/images/0.77-swift-upgrade-helper-abe4ca2c5be24c5d4f7612250042b077.png) You don’t have to migrate to Swift: the Objective-C++ variant of the iOS community template is still supported (note that you still need to integrate the [`RCTAppDependencyProvider`](#rctappdependencyprovider)). New projects will be generated by using Swift as the iOS app language, although you can always migrate back to Objective-C if you need to. ##### Limitations[​](#limitations "Direct link to Limitations") If your app has some local modules that are written in C++, you would not be able to register them in Swift as shown in [this guide](/docs/next/the-new-architecture/pure-cxx-modules#3-registering-the-cxx-turbo-native-module-in-your-app). If your app falls in this category, please skip the migration of the AppDelegate to Swift, and keep using Objective-C++ for your app. React Native core is mostly developed using C++ to encourage code sharing between iOS and Android and other platforms. The interoperability between Swift and C++ is not mature nor stable, yet. We are looking into ways to fill this gap and let you migrate to Swift too. ##### RCTAppDependencyProvider[​](#rctappdependencyprovider "Direct link to RCTAppDependencyProvider") React Native 0.77 slightly changes how the app loads third party dependencies. This is a new line in the community template that, if missed, can cause some runtime issues. Make sure to add it to your app. The equivalent Objective-C lines are the following: AppDelegate.mm ``` #import "AppDelegate.h" #import #import @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.moduleName = @""; self.dependencyProvider = [RCTAppDependencyProvider new]; // You can add your custom initial props in the dictionary below. // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } // remaining of the AppDelegate ``` ## Breaking Changes[​](#breaking-changes-1 "Direct link to Breaking Changes") ### Removal of `console.log()` streaming in Metro[​](#removal-of-consolelog-streaming-in-metro "Direct link to removal-of-consolelog-streaming-in-metro") We want every aspect of React Native debugging to behave reliably and to match the functionality of modern browser tooling. To meet this quality bar, log forwarding via Metro, originally deprecated in 0.76, is removed in 0.77. This integration relied on a custom approach to communicate with the debugging target on device. With this change, we are moving exclusively to the Chrome DevTools Protocol (CDP). * To view JS logs, please use [React Native DevTools](/docs/react-native-devtools.md) and its fully featured Console panel — supporting log filtering, rich object inspection, Live Expressions, and more. * You can also connect VS Code as a CDP debugger, via third party extensions such as [Expo Tools](https://github.com/expo/vscode-expo) and [Radon IDE](https://ide.swmansion.com/). * Please note that these integrations are not directly supported by the React team. However, we are working on first party VS Code support in 2025. * Expo continues to offer log streaming in Expo CLI. For more info, see [*Why are JavaScript logs leaving Metro?*](https://github.com/react-native-community/discussions-and-proposals/discussions/819#:~:text=Why%20are%20JavaScript%20logs%20leaving%20Metro%3F) ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") #### General[​](#general "Direct link to General") * Animation * Native looping animation do not send a React state update every time the loop ends. * Layout * `position` of sticky headers on `ScrollView` will now be taken into account. * Absolute positioning is now behaving in a more compliant way * JS Modules: * Remove `ReactFabricInternals` module * This is not going to be accessible anymore * Native Modules * `NativeModules` object can now be used to load turbomodules in JS . * This improves compatibility between Native Modules and Turbo Native Modules * Packages * dev-middleware: Frameworks should specify `serverBaseUrl` relative to the middleware host * API Changes: * Removed type for `useConcurrentRoot` from `AppRegistry`, as it was already ignored * Removed `refs` property from `NativeMethods` TypeScript definition. * UX Changes: * Remove "run on iOS" and "run on Android" from the dev server key commands #### Android[​](#android "Direct link to Android") * Kotlin * This is the first version of React Native that builds against Kotlin 2.0.21. You can read more about the changes coming with Kotlin 2.0 on the [language release notes](https://kotlinlang.org/docs/whatsnew2020.html). * API Changes: * Nullability: * Non-primitive getters in `ReadableArray` are now correctly typed as optional * Make `ReactHost.createSurface()` method non nullable * Renamed: * `DevSupportManagerBase.getCurrentContext()` to `DevSupportManagerBase.getCurrentReactContext()` Additionally, several APIs have been removed or restricted in visibility, so they can’t be accessed anymore. Those APIs were internal and not needed to React Native developers directly. You can find the full list below: List of Removed Android APIs: The following packages are now internal and can’t be accessed anymore: * `com.facebook.react.views.progressbar` * `com.facebook.react.views.safeareaview` * `com.facebook.react.modules.accessibilityinfo` * `com.facebook.react.modules.appstate` * `com.facebook.react.modules.clipboard` * `com.facebook.react.modules.devmodule` * `com.facebook.react.modules.reactdevtoolssettings` * `com.facebook.react.views.unimplementedview` The following classes are now either internal or have been removed, so can’t be accessed anymore: * `BackHandler.removeEventListener` * `BaseViewManagerInterface` * `BindingImpl` * `CompositeReactPackage` * `DebugOverlayTags` * Method `create()` from `DefaultDevSupportManagerFactory` * `DevToolsReactPerfLogger` * `FabricComponents` * `ImageStoreManager` * `InteropModuleRegistry` * `NativeModulePerfLogger` * `NoopPrinter` * `NotThreadSafeViewHierarchyUpdateDebugListener` * `OkHttpCallUtil` * `PrinterHolder` * `Printer` * `ReactDebugOverlayTags` * `ReactNativeFlipper` * `ReactViewBackgroundManager` * `ReactViewGroup.getBackgroundColor()` * `ReactVirtualTextShadowNode` * `ReactVirtualTextViewManager` * `SimpleSettableFuture` * `SwipeRefreshLayoutManager` * `TaskCompletionSource` * Parameter `jsBundleLoader` from DefaultReactHost.getDefaultReactHost() #### iOS[​](#ios "Direct link to iOS") * API Changes * Removed * `RCTConstants.RCTGetMemoryPressureUnloadLevel` * `partialBatchDidFlush` * `RCTRuntimeExecutor` * `UseNativeViewConfigsInBridgelessMode` * Replaced by a proper feature flag * `UseTurboModuleInteropForAllTurboModules` * Interop layer is always on for TMs * Changed * Replace uses of `CGColorRef` with `UIColor` * `RCTAppDelegate` now requires to use the `RCTDependencyProvider` to load third party dependencies * CocoaPods sets C++ version for all the 3rd party dependencies to avoid compilation issues. **React 19?** React 19 was released the 6th of December 2024. At the time, we already cut the branch for React Native 0.77 and we already released three RCs for React Native 0.77. It was too late in the release of React Native 0.77 to introduce React 19 in this release. React 19 will be shipped in React Native 0.78, and we already cut the branch for this version. You can try it by creating a new app with the command: ``` npx @react-native-community/cli init YourReact19App --version 0.78.0-rc.0 ``` ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.77 contains over **1061** commits from **161** contributors. Thanks for all your hard work! Thanks to all the additional authors that worked on documenting features in this release post: * [Jakub Piasecki](https://github.com/j-piasecki) for contributing to the `display: contents` feature * [Nick Gerleman](https://github.com/NickGerleman), [Joe Vilches](https://github.com/joevilches) and [Jorge Cabiedes Acosta](https://github.com/jorge-cab) for releasing the new styling features * [Alan Lee](https://github.com/alanleedev) for the Android 16Kb page support content * [Riccardo Cipolleschi](https://github.com/cipolleschi) and [Oskar Kwaśniewski](https://github.com/okwasniewski) for supporting the migration of the template to Swift * [Nicola Corti](https://github.com/cortinico) for the `react-native init` deprecation cycle content * [Alex Hunt](https://github.com/huntie) for the content on the removal of `console.log` from metro ### Upgrade to 0.77[​](#upgrade-to-077 "Direct link to Upgrade to 0.77") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, React Native 0.77 will be supported in Expo SDK 52 (instructions on how to update React Native inside your Expo project to 0.77.0 will be available in a separate Expo blog post in the near future). info 0.77 is now the latest stable version of React Native and 0.74.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md#releases-support-policy). We aim to publish a final end-of-life update of 0.74 in the near future. **Tags:** * [engineering](/blog/tags/engineering) --- # React Native Core Contributor Summit 2024 Recap February 3, 2025 · 10 min read ![Michał Pierzchała](https://github.com/thymikee.png) Michał Pierzchała Head of Technology @ Callstack [](https://x.com/thymikee "X")[](https://github.com/thymikee "GitHub") ![Szymon Rybczak](https://github.com/szymonrybczak.png) Szymon Rybczak Software Engineer @ Callstack [](https://x.com/szymonrybczak "X")[](https://github.com/szymonrybczak "GitHub") ![Mo Javad](https://github.com/mojavad.png) Mo Javad Head of Mobile (UK) @ Theodo [](https://x.com/mo__javad "X")[](https://github.com/mojavad "GitHub") ![Steven Moyes](https://github.com/stmoy.png) Steven Moyes Senior Product Manager @ Microsoft [](https://x.com/moyessa "X")[](https://github.com/stmoy "GitHub") Every year, the core contributors in the React Native Community get together with the React Native team to collaboratively shape the direction of this project. Last year was no different—with small exception. We usually meet a day before [React Universe Conf](https://www.reactuniverseconf.com) (formerly React Native EU) at [Callstack](https://www.callstack.com/open-source) HQ in Wrocław. In 2024, learning from past experiences, we hosted the Summit for two consecutive days, so that we can have more unstructured time together. ![all-participants](/assets/images/react-native-core-contributor-summit-2024-1-fd96c5042217025035a569cf7ceea4e5.jpeg) This annual tradition has become a valuable opportunity for contributors to share insights and voice their concerns, and for the core team to share their plans and gather feedback from key contributors to the React Native ecosystem—including partner companies, individual library authors and friends. We divided the Summit into two tracks covering following topics: * [Releases](#releases) * [What's next after the New Architecture?](#whats-next-after-the-new-architecture) * [Web APIs spec for Native Modules](#web-apis-for-native-modules) * [LeanCore 2.0](#leancore-20) * [Nitro Modules - Unblocking View Components by exposing props as jsi::Values](#nitro-modules---unblocking-view-components-by-exposing-props-as-jsivalues) * [Out Of Tree Platforms & CocoaPods](#out-of-tree-platforms--cocoapods) * [React Native on Desktop](#react-native-on-desktop) In this blog post, we’d like to give you a sneak peek of the results of this gathering. ## Releases[​](#releases "Direct link to Releases") We had an extensive discussion about the release process for React Native. Core Team appreciates the value of having contributors from outside Meta involved in releases and emphasizes the importance of having nightly releases, which are particularly beneficial for Out-of-Tree platforms like React Native visionOS, library maintainers (Reanimated) and frameworks (Expo). We discussed the frequency of releases, with some folks asking for more frequent releases to ship fixes faster, while others expressed concerns about the impact on 3rd party libraries and upgrading efforts. We also brainstormed ways to reduce unintentional breaking changes and improve communication about compatibility between React Native and 3rd party dependencies. This session showed how complex it is to manage releases for React Native, and how delicate this topic is, given all the different parts of the ecosystem that need to be considered. ## What's next after the New Architecture?[​](#whats-next-after-the-new-architecture "Direct link to What's next after the New Architecture?") Now that the New Architecture has shipped as stable, we discussed what we should focus on next. What could be the next big thing? The topics revolved around: * **Web compatibility** – concluded in the discussion around direction of the React Strict DOM project, which should be treated as a temporary polyfill, while the Xplat team implements proper cross-platform functionality into the core of React Native. * **Stabilizing the core API** – turned out we need more consensus on what this means for app developers, library authors, Out-of-Tree platforms. E.g. it may be necessary to extract platform-native logic for iOS and Android from the shared C++ codebase. Part of which was covered by the LeanCore 2.0 discussion. * **Old architecture support** – as expected, the team confirmed that new React 19 features based on concurrent rendering, won’t work in old architecture. New features are primarily targeted for the new architecture. Due to blockers in React 19 release schedule it’s still not clear where to draw the line between functionality supported by both new and old architecture. * **3rd party libraries for React Native** – today we library authors can use TurboModules, ExpoModules, recently NitroModules to achieve the same goal of bridging native platform functionality. We need better documentation on how to make it well. * **Brownfield docs** – at the time of the summit, the official documentation for integrating React Native into native apps was quite dated. Since then the team has followed through with up-to-date and simpler docs for Android and iOS. * **Tree-shaking for Metro web** – core Metro team is open to merge the work from the Expo team in this area. ## Web APIs for Native Modules[​](#web-apis-for-native-modules "Direct link to Web APIs for Native Modules") This session was dedicated to Microsoft's RFC revolving around the idea of bringing a subset of Web APIs to React Native. It aims to enhance React Native’s scalability and attract more web developers by leveraging familiar APIs. Opening access to a wealth of existing open-source web libraries that don't have explicit React Native support. ![web-apis](/assets/images/react-native-core-contributor-summit-2024-2-139b7ce3d6c35e06c8dc1c9dd1ecaada.jpeg) Standardizing on Web API specifications is not only beneficial but also essential for React Native growth, and aligns well with our Many Platforms vision and react-strict-dom project. The web offers a unified interface through its specifications, which React Native community modules currently lack. Microsoft has identified around 200 essential Web APIs that could be implemented first for platforms they support: iOS, Android, Windows and macOS. We encourage library developers to align their APIs with web specifications whenever possible, as this standardization will improve code portability and developer experience across platforms. While the proposal seems beneficial for the future of React Native, we're still brainstorming the next steps forward. One concern we noticed is governance of the APIs, and whether they’d need to live in a separate repository from the platform implementations. Another around diverging from the official specification in case a specific platform allows for behaviors not specified by the W3C. We would need to figure out how to avoid bundling unnecessary modules, e.g. with a Babel plugin. Not to mention the scope of such initiative is quite large. The session conclusion reinforced two key points: First, there is strong alignment across the React Native community on adopting web-compatible specifications where possible. Second, we need to establish a clear technical strategy for how these Web API implementations can be maintained separately for different platforms. Microsoft together with Callstack could work on refining the original RFC and produce a proof of concept implementation for a smaller number of APIs as a community initiative. This incremental approach will help us validate the design and developer experience before expanding the scope. ## LeanCore 2.0[​](#leancore-20 "Direct link to LeanCore 2.0") In 2019, the React Native team started the Lean Core initiative. The goal was to tackle the surface area of React Native’s core and reduce APIs and components that were outdated and legacy. Since then, the React Native components and API surfaces have been long overdue another round of clean up. Today, there are many components that are not actively being maintained with better community alternatives. Additionally, there are components that have duplicates that should eventually be consolidated for maintainability. On the API side, a lot of the JS layer APIs are tied to native iOS & Android implementations, rather than being truly platform agnostic. For example, with Pressable, we have props like `android_disableSound` and `android_ripple`. Ideally, React Native components should have the smallest possible API surface that is not tied to any specific platform. As Out-of-Tree platforms are growing and being adopted more by the ecosystem, there needs to be a path to reduce the component and API surface of React Native core, reducing the load on the React Native core team, and also making it significantly easier for Out-of-Tree platform & library maintainers to stay up-to-date. As an added bonus, this would make it easier for beginner app developers to pick up React Native, as there are less duplicated components and "gotchas" for them to learn. Where there is a better community alternative, developers can be signposted and encouraged to use the community alternatives available. During the session, we discussed: * The high level motivations of Lean Core and the benefits to the parties involved (developers, library maintainers, Meta) * An aggregated view of what components are being used in some real-world production React Native apps * The criteria of what is a candidate to be removed from core * A clear action plan for executing Lean Core 2.0 with: * The high-level process for deprecation * Handling cases where Meta is using components internally that have better community alternatives, As a next step, a group of the core contributors will look at collecting more telemetry and data, assessing community alternatives, and putting together an RFC detailing the proposed changes. ## Nitro Modules - Unblocking View Components by exposing props as jsi::Values[​](#nitro-modules---unblocking-view-components-by-exposing-props-as-jsivalues "Direct link to Nitro Modules - Unblocking View Components by exposing props as jsi::Values") Recently, Marc Rousavy introduced Nitro Modules as an alternative approach to creating Native Modules. Nitro Modules utilize experimental C++ Swift Interop and incorporate a bunch of enhancements that can lead to improved performance in certain scenarios. However, during this session, we discussed the various trade-offs involved between Nitro Modules and existing TurboModules. While Nitro Modules offer some performance benefits, they also have limitations and considerations that need to be addressed. For example, the use of experimental interop features might introduce complexity or compatibility issues that are not present in TurboModules. Our discussion focused on these trade-offs and the potential for upstreaming some of Nitro Modules' improvements into React Native Core, which could allow developers to benefit from more performant modules for everyone. ## Out-of-Tree Platforms & CocoaPods[​](#out-of-tree-platforms--cocoapods "Direct link to Out-of-Tree Platforms & CocoaPods") Out-of-Tree Platforms presents the full power of React Native, where we can share one JS codebase between different platforms running on our mobile devices, desktops or even on VR/XR devices. Creating such a platform currently isn’t the easiest process, actually there are no guidelines on how things should be created, developed and maintained. Also React Native Core in a way is tied to Android and iOS platforms. In the future we could aim for a scenario where all the platforms are treated equally and integrate with a C++/JS core through the same APIs. ![oot-platforms](/assets/images/react-native-core-contributor-summit-2024-3-bc9dcff91273a72b85b10b8ec6e9d5a3.jpeg) During this session maintainers of different platforms discussed what are the problems, what they struggle with and what should be the solution to unify the process of creating and maintaining new Out-of-Tree platforms. Another aspect of this session was to discuss CocoaPods and future plans related to managing native dependencies. Recently the CocoaPods team announced that they’ve moved to maintenance mode and new major improvements or features won’t be shipped. There are various alternatives that could be used and during this session we discussed their pros and cons, and what migration would look like. ## React Native on Desktop[​](#react-native-on-desktop "Direct link to React Native on Desktop") Steven and Saad from Microsoft, maintainers of react-native-windows and react-native-macos, hosted a session to listen and gather feedback from contributors related to Desktop platforms. Topics discussed included exploring how to increase adoption of React Native for Desktop (such as having a dedicated workflow in Visual Studio, or exposing desktop as part of Nx), as well as how to support Expo, which is a continual pain point for more adoption. There’s a big discrepancy in availability of community modules between macOS and Windows, largely due to the fact that iOS code is mostly compatible with macOS, while RNW needs bespoke implementations. While working on the New Architecture for React Native for Windows, the team sees potential in C++ modules allowing for even more code sharing across platforms which will hopefully ease the burden of targeting desktop platforms. It’s worth noting that on the community side Software Mansion is working on adding desktop support for their most popular modules, such as React Native Screens, Gesture Handler and Reanimated. *** 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. If you’re interested in joining the development of React Native, make sure you join our open initiatives and read the [contribution guide](https://reactnative.dev/contributing/overview) we have on our website. We hope to meet you in person as well in the future! **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.78 - React 19 and more February 19, 2025 · 11 min read ![Vojtech Novak](https://avatars.githubusercontent.com/u/1566403?v=4) Vojtech Novak Software Engineer @ Expo [](https://x.com/vonovak "X")[](https://github.com/vonovak "GitHub") ![Shubham Gupta](https://github.com/shubhamguptadream11.png) Shubham Gupta Software Engineer @ Dream11 [](https://x.com/sg43245 "X")[](https://github.com/shubhamguptadream11 "GitHub") ![Fabrizio Cucci](https://avatars.githubusercontent.com/u/8156463?v=4) Fabrizio Cucci Software Engineer @ Meta [](https://x.com/fabriziocucci "X")[](https://github.com/fabriziocucci "GitHub") ![Riccardo Cipolleschi](https://github.com/cipolleschi.png) Riccardo Cipolleschi Software Engineer @ Meta [](https://x.com/CipolleschiR "X")[](https://github.com/cipolleschi "GitHub") Today we are excited to release React Native 0.78! This release ships React 19 in React Native and some other relevant features like native support for Android Vector drawables and better brownfield integration for iOS. ### Highlights[​](#highlights "Direct link to Highlights") * [React 19](/blog/2025/02/19/react-native-0.78.md#react-19) * [Towards smaller and faster releases](/blog/2025/02/19/react-native-0.78.md#towards-smaller-and-faster-releases) * [Opt-in for JavaScript logs in Metro](/blog/2025/02/19/react-native-0.78.md#opt-in-for-javascript-logs-in-metro) * [Added support for Android XML drawables](/blog/2025/02/19/react-native-0.78.md#added-support-for-android-xml-drawables) * [ReactNativeFactory on iOS](/blog/2025/02/19/react-native-0.78.md#reactnativefactory-on-ios) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### React 19[​](#react-19 "Direct link to React 19") React 19 is now available on React Native! React 19 requires updating your app, as we introduced some changes from React 18. For example, we removed some APIs such as `propTypes`, and you need to adjust your app to make it compatible with the new version of React. Follow our step-by-step [instructions to upgrade](https://react.dev/blog/2024/04/25/react-19-upgrade-guide) your app to React 19. After the migration, you’ll be able to leverage all the new features of React, including (non exhaustively): * **[Actions](https://react.dev/blog/2024/12/05/react-19#actions):** these are functions that use async transitions. Async transitions automatically manage submitting data for you: they handle pending states, optimistic updates, error handling and more. * **[useActionState](https://react.dev/reference/react/useActionState):** a utility hook built on top of Actions. It takes a function and returns a wrapped Action to call. When the action is called, it will return the last result of the Action and its `pending` state. * **[useOptimistic](https://react.dev/reference/react/useOptimistic):** a new hook that simplifies showing the final state of an update optimistically while the async request is underway. If the request errors, React will switch back to the previous value automatically. * **[`use`](https://react.dev/reference/react/use):** this is a new API that allows access to resources during render. You can now read a promise or a context with `use` and React will Suspend until they resolve. * **[`ref` as `props`](https://react.dev/blog/2024/12/05/react-19#ref-as-a-prop):** you can now pass `ref` as a `prop` like you do with any other prop. Function components will no longer need `forwardRef` and you can migrate your components now. * And many others For a complete list of the new available features, have a look at the [React 19 release blog post](https://react.dev/blog/2024/12/05/react-19). #### React Compiler[​](#react-compiler "Direct link to React Compiler") React Compiler is a build-time tool designed to optimize React applications by automatically applying memoization. While developers can manually use APIs like `useMemo`, `useCallback`, and `React.memo` to prevent unnecessary recomputation of unchanged parts of an app, they could also forget or misuse these optimizations. React Compiler addresses this by leveraging its understanding of JavaScript and of the [Rules of React](https://react.dev/reference/rules) to automatically memoize values or groups of values within components and hooks. With this release, we simplified the process to enable the React Compiler in your React Native apps. [In previous versions](https://react.dev/learn/react-compiler#using-react-compiler-with-react-17-or-18), you had to install two packages: the compiler and its runtime. After those packages were installed, you had to configure a Babel plugin to enable React Compiler through Metro. Now, you only need to install the compiler itself and to configure the Babel plugin. To learn how to enable it, you can follow our step-by-step [guide](https://react.dev/learn/react-compiler#usage-with-babel). To verify that the compiler is running, you can open the React Native DevTools: you should see that the components that are memoized have the `Memo ✨` tag attached to them in the Component Inspector. If you want to learn more about React Compiler, these are useful resources: * [React Compiler](https://react.dev/learn/react-compiler) docs * [React Compiler Deep Dive](https://www.youtube.com/watch?v=uA_PVyZP7AI) ### Towards smaller and faster releases[​](#towards-smaller-and-faster-releases "Direct link to Towards smaller and faster releases") We’re updating our release process to ship stable React Native releases more frequently in 2025. It will be easier for you to update the React Native version because we’ll be reducing the number of breaking changes we ship. Faster releases also means that all the bugfixes we ship internally are reaching you earlier, and you can benefit from the latest features we develop inside React Native. We believe this new model will benefit every developer in the React Native ecosystem, as fewer breaking changes means a more stable framework that everyone can rely on. ### Opt-in for JavaScript logs in Metro[​](#opt-in-for-javascript-logs-in-metro "Direct link to Opt-in for JavaScript logs in Metro") We've added an opt-in to restore JavaScript log streaming via the Metro dev server, [previously removed in 0.77](/blog/2025/01/21/version-0.77.md#removal-of-consolelog-streaming-in-metro) for Community CLI users. This is in response to user feedback, as well as reviewing where we are with our replacement offerings today. To opt in, use the new `--client-logs` flag. This can also be aliased via an npm script for convenience. ``` npx @react-native-community/cli start --client-logs ``` Log streaming in Metro will still be going away in future and remains off by default. However, we intend to give developers a longer migration period to adapt to this change. This update will also be made available in the incoming 0.77.1 minor release. ### Added support for Android XML drawables[​](#added-support-for-android-xml-drawables "Direct link to Added support for Android XML drawables") In React Native 0.78, we’re shipping a new way to load icons, illustrations, and other graphic elements on Android as [XML resources](https://developer.android.com/guide/topics/resources/drawable-resource). This means you can use [vector drawables](https://developer.android.com/develop/ui/views/graphics/vector-drawable-resources) for displaying vector images at any scale without losing quality, or [shape drawables](https://developer.android.com/guide/topics/resources/drawable-resource#Shape) for drawing more basic embellishments. This is all supported by the same `Image` component that you know and love. To use this feature today, you can import XML resources like any other [static resource](/docs/next/images#static-image-resources) by referencing them in the `source` prop. Furthermore, using XML resources rather than bitmaps will also help you reduce your application size and will result in better rendering across screens with different DPI. ``` // via require ; // or via import import MyIcon from './img/my_icon.xml'; ; ``` #### Performance & Quality[​](#performance--quality "Direct link to Performance & Quality") [Like all other image types](/docs/next/images#off-thread-decoding), Android’s XML resources are loaded and inflated off the main thread so you don’t drop any frames. This means the resource is not guaranteed to display instantly but also does not prevent user input while the resource is loading. Off-thread decoding is especially important when you need to render many icons at the same time. Internal apps realized some significant performance improvements when using Android’s vector drawables. Utilizing resource types like vector drawables are the perfect way to display images without loss of quality, and can result in smaller APK files since you don't need to include an image type for every screen density. Furthermore, vector drawables are copied from memory once they’re loaded so if you render the same icon more than once they will all display at the same time. #### Trade-offs[​](#trade-offs "Direct link to Trade-offs") It’s important to note that drawable XML resources are not perfect, and there are constraints to using them: * They must be referenced at build time of your Android application. These resources are passed into a build step with the [Android Asset Packaging Tool](https://developer.android.com/tools/aapt2) (AAPT) to convert raw XML into binary XML. Android does not support loading raw XML files, [this is a known limitation](https://issuetracker.google.com/issues/62435069). * They cannot be loaded over the network by Metro. If you change the directory or name of an XML resource, you will need to rebuild your Android application each time. * They have no dimensions. By default, they will display with a 0x0 size and you need to provide a width and height for them to show up. * They are not fully customizable at runtime; you can only control dimensions or the overall tint color but you can’t customize individual element attributes *inside* the resource like stroke widths, border radius, or colors. These types of customizations require different variants of your XML resource. info Android’s vector drawables are not a 1:1 replacement for libraries like `react-native-svg`. They are designed specifically for Android and do not work for iOS. If you want to have the same SVGs across all platforms, you'll have to continue using `react-native-svg`. Vector drawables merely offer performance benefits at the expense of customization. ### ReactNativeFactory on iOS[​](#reactnativefactory-on-ios "Direct link to ReactNativeFactory on iOS") With React Native 0.78 we improved the integration of React Native on iOS. This version introduces a new class called `RCTReactNativeFactory` that allows you to create instances of React Native without the need of an AppDelegate. This should allow you to create a new version of React Native in a ViewController, for example. This simplifies dramatically the integration with Brownfield apps. Imagine that you want to show a React Native view in a View Controller of your app. Starting from React Native 0.78, what you need to do, after installing all the dependencies as shown in [this guide](/docs/next/integration-with-existing-apps?language=apple#1-set-up-directory-structure), is to add this code: ``` +import React +import React_RCTAppDelegate public class ViewController { + var reactNativeFactory: RCTReactNativeFactory? + var reactNativeDelegate: ReactNativeDelegate? public func viewdidLoad() { super.viewDidLoad() // … + reactNativeDelegate = ReactNativeDelegate() + reactNativeFactory = RCTReactNativeFactory(delegate: reactNativeDelegate!) + view = reactNativeFactory.rootViewFactory.view(withModuleName: "") } } +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { + #if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") + #else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") + #endif + } +} ``` React Native will be loaded in the View Controller as soon as you navigate to it. This code creates an `RCTReactNativeFactory`, assigns a delegate to it, and asks it to create a `rootView` for a React Native’s view. The delegate is defined below, and it overrides the `sourceURL` and the `bundleURL` properties to tell React Native where it can find the JS bundle to load in the view. ## Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") ### General[​](#general "Direct link to General") * React Native DevTools * Removed FuseboxClient CDP domain * Codegen * Separate component array types and command array types ### Android[​](#android "Direct link to Android") * Nullability changes: migrating `RootView` to Kotlin resulted in changes of parameter types from nullable to non nullable. * The following classes have been moved from public to internal, or removed, and can’t be accessed anymore: * `com.facebook.react.bridge.GuardedResultAsyncTask` * `com.facebook.react.uimanager.ComponentNameResolver` * `com.facebook.react.uimanager.FabricViewStateManager` * `com.facebook.react.views.text.frescosupport.FrescoBasedReactTextInlineImageViewManager` ### iOS[​](#ios "Direct link to iOS") * Change Image load event size info from logical size to pixel (This only affects the Old Architecture) ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.78 contains over 509 commits from 87 contributors. Thanks for all your hard work! Thanks to all the additional authors that worked on documenting features in this release post: * [Dream11](https://github.com/ds-horizon) team for the thorough testing of React 19 features in React Native * [Nicola Corti](https://github.com/cortinico) for the work on Faster Releases * [Alex Hunt](https://github.com/huntie) for the work on the Metro logs opt-in * [Peter Abbondanzo](https://github.com/Abbondanzo) for the work on Android XML Drawable Support * [Oskar Kwaśniewski](https://github.com/okwasniewski) for the work on the ReactNativeFactory ## Upgrade to 0.78[​](#upgrade-to-078 "Direct link to Upgrade to 0.78") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, [React Native 0.78 will be supported in a canary release of the Expo SDK](https://expo.dev/changelog/react-native-78). info 0.78 is now the latest stable version of React Native and 0.75.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). We aim to publish a final end-of-life update of 0.75 in the near future. **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.79 - Faster tooling and much more April 8, 2025 · 11 min read ![Alan Hughes](https://github.com/alanjhughes.png) Alan Hughes Software Engineer @ Expo [](https://github.com/alanjhughes "GitHub") ![Shubham Gupta](https://github.com/shubhamguptadream11.png) Shubham Gupta Software Engineer @ Dream11 [](https://x.com/sg43245 "X")[](https://github.com/shubhamguptadream11 "GitHub") ![Fabrizio Cucci](https://avatars.githubusercontent.com/u/8156463?v=4) Fabrizio Cucci Software Engineer @ Meta [](https://x.com/fabriziocucci "X")[](https://github.com/fabriziocucci "GitHub") ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") Today we are excited to release React Native 0.79! This release ships with performance improvements on various fronts, as well as several bugfixes. First, Metro is now faster to start thanks to deferred hashing, and has stable support for package exports. Startup time in Android will also be improved thanks to changes in the JS bundle compressions and much more. ### Highlights[​](#highlights "Direct link to Highlights") * [New Metro Features](/blog/2025/04/08/react-native-0.79.md#metro-faster-startup-and-package-exports-support) * [JSC moving to a Community Package](/blog/2025/04/08/react-native-0.79.md#jsc-moving-to-community-package) * [iOS: Swift-Compatible Native Modules registration](/blog/2025/04/08/react-native-0.79.md#ios-swift-compatible-native-modules-registration) * [Android: Faster App Startup](/blog/2025/04/08/react-native-0.79.md#android-faster-app-startup) * [Removal of Remote JS Debugging](/blog/2025/04/08/react-native-0.79.md#removal-of-remote-js-debugging) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### Metro: Faster startup and package exports support[​](#metro-faster-startup-and-package-exports-support "Direct link to Metro: Faster startup and package exports support") This release ships with [Metro 0.82](https://github.com/facebook/metro/releases/tag/v0.82.0).This version uses deferred hashing to improve the speed of first `yarn start` typically by over 3x (more in larger projects and monorepos) making your development experience and CI builds faster on a daily basis. ![metro startup comparison](/assets/images/0.79-metro-startup-comparison-6dd153aeb4b43cb5dec1390b67bc4673.gif) Also in Metro 0.82, we’re promoting `package.json` `"exports"` and `"imports"` field resolution to stable. `"exports"` resolution was [introduced in React Native 0.72](/blog/2023/06/21/package-exports-support.md), and `"imports"` support was added in a community contribution - both will now be enabled by default for all the projects on React Native 0.79. This improves compatibility with modern npm dependencies, and opens up new, standards-compliant ways to organise your projects. Breaking change While we've been testing `package.json` `"exports"` in the community for a while, this switchover can be a breaking change for certain packages and project setups. In particular, we're aware of user reported incompatibilities for some popular packages including Firebase and AWS Amplify, and are working to get these fixed at source. If you're encountering issues: * Please update to the Metro [0.81.5 hotfix](https://github.com/facebook/metro/releases/tag/v0.81.5), or set [`resolver.unstable_enablePackageExports = false`](https://metrobundler.dev/docs/configuration/#unstable_enablepackageexports-experimental) to opt out. * See [expo/expo#36551](https://github.com/expo/expo/discussions/36551) for affected packages and future updates. ### JSC moving to Community Package[​](#jsc-moving-to-community-package "Direct link to JSC moving to Community Package") As part of our effort to reduce the API surface of React Native, we're in the process of moving the JavaScriptCore (JSC) engine to a community-maintained package: `@react-native-community/javascriptcore` This change will not affect users that are using Hermes. Starting with React Native 0.79, you can use a community supported version of JSC by following the [installation instructions in the readme](https://github.com/react-native-community/javascriptcore#installation). The JSC version provided by React Native core will still be available in 0.79, but we’re planning to remove it [in the near future](https://github.com/react-native-community/discussions-and-proposals/blob/main/proposals/0836-lean-core-jsc.md). Moving JSC to a community maintained package will allow us to update the JSC version more frequently and offer you the latest features. The community maintained JSC will follow a separate release schedule from React Native. ### iOS: Swift-Compatible Native Modules registration[​](#ios-swift-compatible-native-modules-registration "Direct link to iOS: Swift-Compatible Native Modules registration") In this release, we are revamping the way in which you can register your Native Module into the React Native runtime. The new approach follows the same approach of components, described in the [official documentation](/docs/next/the-new-architecture/using-codegen#configuring-codegen). Starting from this version of React Native, you can register your modules by modifying the `package.json` file. We introduced a new `modulesProvider` field in the `ios` property: ``` "codegenConfig": { "ios": { + "modulesProvider": { + "JS Name for the module": "ObjC Module provider for the pure C++ TM or a class conforming to RCTTurboModule" + } } } ``` Codegen will take care to create all the relevant code starting from your `package.json` file. If you do use a pure C++ Native Module you will have to follow this recommended configuration: Configure pure C++Native Modules in your app For pure C++ Native Modules, you need to add a new ObjectiveC++ class to glue together the C++ Native Module with the rest of the App: CppNativeModuleProvider.h ``` #import #import NS_ASSUME_NONNULL_BEGIN @interface Provider : NSObject @end ``` CppNativeModuleProvider.mm ``` NS_ASSUME_NONNULL_END #import "Provider.h" #import #import #import ".h" @implementation NativeSampleModuleProvider - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared(params.jsInvoker); } ``` With this new approach, we unified the registration of Native Modules for both app developers and library maintainers. Libraries can specify the same properties in their `package.json` and Codegen will take care of the rest. This approach solves the limitation we introduced in 0.77 that prevented the registration of a pure C++ Native Module with a Swift `AppDelegate`. As you can see, none of these changes modifies the `AppDelegate` and the generated code will work for `AppDelegate` implemented with both Swift and Objective-C. ### Android: Faster App Startup[​](#android-faster-app-startup "Direct link to Android: Faster App Startup") We’re also shipping a change to improve your Android startup time by a significant amount. Starting with this version, we won’t be compressing the JavaScript bundle anymore inside the APK. Previously, the Android system needed to uncompress the JavaScript bundle before your app could start. This was causing a significant slowdown during the app startup. Starting from this release, we will be shipping the JavaScript Bundle uncompressed by default, so your Android apps will be generally faster to start. The [Margelo](https://margelo.com) team tested this feature on the Discord app and got a significant performance boost: Discord’s time-to-interactive (TTI) was reduced by 400ms, which was a 12% speedup with a one-line change (tested on a Samsung A14). On the other hand, storing the bundle uncompressed, will result in a higher space consumption for your application on the user device. If this is a concern to you, you can toggle this behavior using the `enableBundleCompression` property in your `app/build.gradle` file. app/build.gradle ``` react { // ... // If you want to compress the JS bundle (slower startup, less // space consumption) enableBundleCompression = true // If don't you want to compress the JS bundle (faster startup, // higher space consumption) enableBundleCompression = false // Default is `false` } ``` Please note that the APK size will increase in this release, but your users won’t be paying the extra cost in APK download size, as the APKs are compressed when downloaded from the network. ## Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") ### Removal of Remote JS Debugging[​](#removal-of-remote-js-debugging "Direct link to Removal of Remote JS Debugging") As part of our ongoing efforts to improve debugging, we're removing Remote JS Debugging via Chrome. This legacy debugging method was deprecated, [and moved to a runtime opt-in, in React Native 0.73](/blog/2023/12/06/0.73-debugging-improvements-stable-symlinks.md#remote-javascript-debugging). Please use [React Native DevTools](/docs/react-native-devtools.md) for modern and reliable debugging. This also means that React Native is no longer compatible with the [react-native-debugger](https://github.com/jhen0409/react-native-debugger) community project. For developers that want to use third party debugging extensions, such as Redux DevTools, we recommend [Expo DevTools Plugins](https://github.com/expo/dev-plugins), or integrating the standalone versions of these tools. Read more in [this dedicated post](https://github.com/react-native-community/discussions-and-proposals/discussions/872). ### Internal modules updated to `export` syntax[​](#internal-modules-updated-to-export-syntax "Direct link to internal-modules-updated-to-export-syntax") As part of modernizing our JavaScript codebase, we've updated a number of implementation modules within `react-native` to consistently use `export` syntax instead of `module.exports`. We've updated around **46 APIs** in total, which can be found in the [changelog](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0790). This change has a subtle impact on existing imports: **Case 1: Default export** ``` // CHANGED - require() syntax - const ImageBackground = require('react-native/Libraries/Image/ImageBackground'); + const ImageBackground = require('react-native/Libraries/Image/ImageBackground').default; // Unchanged - import syntax import ImageBackground from 'react-native/Libraries/Image/ImageBackground'; // RECOMMENDED - root import import {ImageBackground} from 'react-native'; ``` **Case 2: Secondary exports** There are very few cases of this pattern, again unaffected when using the root `'react-native'` import. ``` // Unchanged - require() syntax const BlobRegistry = require('react-native/Libraries/Blob/BlobRegistry'); // Unchanged - require() syntax with destructuring const {register, unregister} = require('react-native/Libraries/Blob/BlobRegistry'); // CHANGED - import syntax as single object - import BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry'; + import * as BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry'; // Unchanged - import syntax with destructuring import {register, unregister} from 'react-native/Libraries/Blob/BlobRegistry'; // RECOMMENDED - root import import {BlobRegistry} from 'react-native'; ``` We expect the impact of this change to be extremely limited, particularly for projects written in TypeScript and using `import` syntax. Please check for any type errors to update your code. tip **The root `react-native` import is strongly recommended** As a general takeaway, we strongly recommend importing from the root `'react-native'` path, to avoid extraneous breaking changes in the future. In our next release, we will be deprecating deep imports, as part of better defining React Native's public JavaScript API ([see the RFC](https://github.com/react-native-community/discussions-and-proposals/pull/894)). ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting. * **Invalid unitless lengths in box shadows and filters**: * In order to make React Native more compliant with the CSS/Web specs, we now don’t support anymore unitless lengths in `box-shadow` and `filter`. This means that if you were using a `box-shadow` of `1 1 black` we won’t be rendering. You should instead specify units such as `1px 1px black` * **Remove incorrect hwb() syntax support from normalize-color:** * In order to make React Native more compliant with the CSS/Web specs, we now restrict some invalid syntax for `hwb()`. Historically React Native used to support comma separated values (e.g. `hwb(0, 0%, 100%)`) which we now don’t support anymore (you should migrate to `hwb(0 0% 100%)`). You can read more about this change [here](https://github.com/facebook/react-native/commit/676359efd9e478d69ad430cff213acc87b273580). * **Libraries/Core/ExceptionsManager exports update** * As part of our effort to modernize the React Native JS API, we updated `ExceptionsManager` to now export a default `ExceptionsManager` object, and `SyntheticError` as a secondary export. ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.79 contains over 944 commits from 100 contributors. Thanks for all your hard work! We want to send a thank you to those community members that shipped significant contributions in this release: * [Marc Rousavy](https://github.com/mrousavy) for developing and documenting the “Android: Faster App Startup” feature * [Kudo Chien](https://github.com/Kudo) and [Oskar Kwaśniewski](https://github.com/okwasniewski)for working on the `@react-native-community/javascriptcore` package and writing the “JSC moving to Community Package” section * [James Lawson](https://github.com/facebook/metro/pull/1302) for adding support for import subpath resolution [in Metro](https://github.com/facebook/metro/pull/1302). Moreover, we also want to thank the additional authors that worked on documenting features in this release post: * [Rob Hogan](https://github.com/robhogan) for the “New Metro Features” section * [Alex Hunt](https://github.com/huntie) for the “Removal of Remote JS Debugging” and “Internal modules updated to export syntax” sections * [Riccardo Cipolleschi](https://github.com/cipolleschi) for the work on iOS Native Module registration ## Upgrade to 0.79[​](#upgrade-to-079 "Direct link to Upgrade to 0.79") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, React Native 0.79 will be supported in the upcoming Expo SDK 53 as the default version of React Native. info 0.79 is now the latest stable version of React Native and 0.76.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). We aim to publish a final end-of-life update of 0.76 in the near future. **Tags:** * [engineering](/blog/tags/engineering) --- # Moving Towards a Stable JavaScript API (New Changes in 0.80) June 12, 2025 · 10 min read ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") ![Iwo Plaza](https://github.com/iwoplaza.png) Iwo Plaza Software Engineer @ Software Mansion [](https://x.com/iwoplaza "X")[](https://github.com/iwoplaza "GitHub") ![Jakub Piasecki](https://github.com/j-piasecki.png) Jakub Piasecki Software Engineer @ Software Mansion [](https://x.com/breskin67 "X")[](https://github.com/j-piasecki "GitHub") ![Dawid Małecki](https://github.com/coado.png) Dawid Małecki Software Engineer @ Software Mansion [](https://github.com/coado "GitHub") In React Native 0.80, we're introducing two significant changes to React Native's JavaScript API — the deprecation of deep imports, and our new Strict TypeScript API. These are part of an ongoing effort to accurately define our API and offer dependable type safety to users and frameworks. **Quick takeaways:** * **Deep imports deprecation**: From 0.80, we're introducing deprecation warnings for deep imports from the `react-native` package. * **Opt-in Strict TypeScript API**: We are moving to from-source TypeScript types and a new public API baseline under TypeScript. These enable stronger and more futureproof type accuracy, and will be a one-time breaking change. [Opt in](/blog/2025/06/12/moving-towards-a-stable-javascript-api.md#future--strict-typescript-api-by-default) via `compilerOptions` in your project's `tsconfig.json`. * We'll work with the community over time to ensure that these changes work for everyone, before enabling the Strict TypeScript API by default in a future React Native release. ## What's changing and why[​](#whats-changing-and-why "Direct link to What's changing and why") We are moving to improve and stabilise React Native's public JavaScript API — i.e. what you get when you import `'react-native'`. Historically, we've approximated this. React Native is authored in [Flow](https://flow.org/), but the community has long since moved to TypeScript in open source, which is how the public API is consumed and validated for compatibility. Our types have been (lovingly) [community-contributed](https://www.npmjs.com/package/@types/react-native), and since merged and aligned in our codebase. However, these have relied on manual maintenance and no automated tooling, introducing correctness gaps. Additionally, our public JS API has been poorly defined in terms of module boundaries — e.g. internal `'react-native/Libraries/'` deep imports were reachable by app code, but could frequently change as we updated these internals. In 0.80, we're addressing these issues by deprecating deep imports, and introducing a user opt-in to a new, generated API baseline in TypeScript. We're calling this our **Strict TypeScript API**. Ultimately, this is the groundwork to offer a stable React Native API in the future. ## Deprecating deep imports from `react-native`[​](#deprecating-deep-imports-from-react-native "Direct link to deprecating-deep-imports-from-react-native") The main change we're making to our API today is deprecating the use of deep imports ([RFC](https://github.com/react-native-community/discussions-and-proposals/pull/894)), with warnings in ESLint and the JS console. Deep imports of values and types should be updated to `react-native`'s root import. ``` // Before - import from subpath import {Alert} from 'react-native/Libraries/Alert/Alert'; // After - import from `react-native` import {Alert} from 'react-native'; ``` This change reduces the total surface area of our JavaScript API into a fixed set of exports which we can control and make stable in a future release. We're targeting a removal of these import paths in 0.82. API feedback Some APIs are not exported at root, and will become unavailable without deep imports. We have an **[open feedback thread](https://github.com/react-native-community/discussions-and-proposals/discussions/893)** and will be working with the community to finalize the exports in our public API. Please share your feedback! **Opting out** Please bear in mind that we aim to remove deep imports from React Native's API in a future release, and these should instead be updated to the root import. **Opting out of warnings** #### ESLint[​](#eslint "Direct link to ESLint") Disable the `no-deep-imports` rule using `overrides`. .eslintrc.js ``` overrides: [ { files: ['*.js', '*.jsx', '*.ts', '*.tsx'], rules: { '@react-native/no-deep-imports': 0, }, }, ]; ``` #### Console warnings[​](#console-warnings "Direct link to Console warnings") Pass the `disableDeepImportWarnings` option to `@react-native/babel-preset`. babel.config.js ``` module.exports = { presets: [ [ 'module:@react-native/babel-preset', {disableDeepImportWarnings: true}, ], ], }; ``` Restart your app with `--reset-cache` to clear the Metro cache. ``` npx @react-native-community/cli start --reset-cache ``` **Opting out of warnings (Expo)** #### ESLint[​](#eslint-1 "Direct link to ESLint") Disable the `no-deep-imports` rule using `overrides`. .eslintrc.js ``` overrides: [ { files: ['*.js', '*.jsx', '*.ts', '*.tsx'], rules: { '@react-native/no-deep-imports': 0, }, }, ]; ``` #### Console warnings[​](#console-warnings-1 "Direct link to Console warnings") Pass the `disableDeepImportWarnings` option to `babel-preset-expo`. babel.config.js ``` module.exports = function (api) { api.cache(true); return { presets: [ ['babel-preset-expo', {disableDeepImportWarnings: true}], ], }; }; ``` Restart your app with `--clear` to clear the Metro cache. ``` npx expo start --clear ``` ## Strict TypeScript API (opt-in)[​](#strict-typescript-api-opt-in "Direct link to Strict TypeScript API (opt-in)") The Strict TypeScript API is a new set of TypeScript types in the `react-native` package, which can be opted into via your `tsconfig.json`. We're shipping these alongside our existing TS types, meaning you can choose to migrate when ready. The new types are: 1. **Generated directly from our source code** — improving coverage and correctness, so you can expect stronger compatibility guarantees. 2. **Restricted to `react-native`'s index file** — more tightly defining our public API, and meaning we won't break the API when making internal file changes. When the community is ready, the Strict TypeScript API will become our default API in future — synchronized with deep imports removal. This means it's a **good idea** to begin opting in, as you'll be ready for React Native's future stable JS API. tsconfig.json ``` { "extends": "@react-native/typescript-config", "compilerOptions": { ... "customConditions": ["react-native-strict-api"] } } ``` Under the hood This will instruct TypeScript to resolve `react-native` types from our new [`types_generated/`](https://www.npmjs.com/package/react-native?activeTab=code) dir, instead of the previous [`types/`](https://www.npmjs.com/package/react-native?activeTab=code) dir (manually maintained). No restart of TypeScript or your editor is required. ### Breaking: Deep imports are disallowed[​](#breaking-deep-imports-are-disallowed "Direct link to Breaking: Deep imports are disallowed") As above, types under the Strict TypeScript API are now only resolvable from the main `'react-native'` import path, enforcing [package encapsulation](/blog/2023/06/21/package-exports-support.md), per our above deprecation. ``` // Before - import from subpath import {Alert} from 'react-native/Libraries/Alert/Alert'; // After - MUST import from `react-native` import {Alert} from 'react-native'; ``` Key win We've scoped our public API to the exports of React Native's `index.js` file, which we carefully maintain. This means that file changes elsewhere in our codebase will no longer be breaking changes. ### Breaking: Some type names / shapes have changed[​](#breaking-some-type-names--shapes-have-changed "Direct link to Breaking: Some type names / shapes have changed") Types are now generated from source, rather than manually maintained. In doing this: * We've aligned differences that had built up from the community contributed types — and also increased the type coverage of our source code. * We've intentionally updated some type names and type shapes, where there was scope to simplify or reduce ambiguity. Key win Because types are now generated from React Native's source code, you can be confident that the typechecker is **always accurate** for a given version of `react-native`. #### Example: Stricter exported symbols[​](#example-stricter-exported-symbols "Direct link to Example: Stricter exported symbols") The `Linking` API is now a single `interface`, rather than two exports. This follows for a number of other APIs ([see docs](/docs/strict-typescript-api.md)). ``` // Before import {Linking, LinkingStatic} from 'react-native'; function foo(linking: LinkingStatic) {} foo(Linking); // After import {Linking} from 'react-native'; function foo(linking: Linking) {} foo(Linking); ``` #### Example: Fixed / more complete types[​](#example-fixed--more-complete-types "Direct link to Example: Fixed / more complete types") Previous manual type definitions left the opportunity for type gaps. Under generated Flow → TypeScript, these are no longer present (and at source, benefit from Flow's additional type validation for multi-platform code). ``` import {Dimensions} from 'react-native'; // Before - Type error // After - number | undefined const {densityDpi} = Dimensions.get(); ``` ### Other breaking changes[​](#other-breaking-changes "Direct link to Other breaking changes") Please refer to our [dedicated guide](/docs/strict-typescript-api.md) in the docs which details all breaking types changes and how to update your code. ## Rollout[​](#rollout "Direct link to Rollout") We appreciate that any breaking change to React Native will take time for developers to update to in their apps. #### Now — Opt-in launch (0.80)[​](#now--opt-in-launch-080 "Direct link to Now — Opt-in launch (0.80)") The `"react-native-strict-api"` opt-in is stable in the 0.80 release. * This is a one-time migration. We aim for apps and libraries to opt in at their own pace over the next couple of releases. * Under either mode, nothing will change for your app at runtime — this affects TypeScript analysis only. * **And**, we will take feedback on missing APIs, via our [dedicated feedback thread](https://github.com/react-native-community/discussions-and-proposals/discussions/893). Recommended The Strict TypeScript API will become our default API in the future. If you have time, it's worth testing the opt-in now in your `tsconfig.json`, to futureproof your app or library. This will immediately evaluate if there are any type errors introduced in your app under the Strict API. **There may be none(!)** — in which case, you're good to go. #### Future — Strict TypeScript API by default[​](#future--strict-typescript-api-by-default "Direct link to Future — Strict TypeScript API by default") In the future, we will require all codebases to use our Strict API, and will remove the legacy types. The timeline for this will be based on community feedback. For at least the next two React Native releases, the Strict API will remain an opt-in. ## FAQs[​](#faqs "Direct link to FAQs") **I'm using subpath imports today. What should I do?** Please migrate to the root `'react-native'` import path. * Subpath imports (e.g. `'react-native/Libraries/Alert/Alert'`) are becoming private APIs. Without preventing access to implementation files inside React Native, we can’t offer a stable JavaScript API. * We want our deprecation warnings to motivate community feedback, which can be raised via our [centralized discussion thread](https://github.com/react-native-community/discussions-and-proposals/discussions/893), if you believe we are not exposing code paths that are crucial for your app. Where justified, we may promote APIs to the index export. **I'm a library maintainer. How does this change impact me?** Both apps and libraries can opt in at their own pace, since `tsconfig.json` will only affect the immediate codebase. * Typically, `node_modules` is excluded from validation by the TypeScript server in a React Native project. Therefore, your package's exported type definitions are the source of truth. **💡 We want feedback!** As with changed subpath imports, if you encounter any integration issues with the Strict API, please let us know [on GitHub](https://github.com/react-native-community/discussions-and-proposals/discussions/893). **Does this guarantee a final API for React Native yet?** Sadly, not yet. In 0.80, we've made a tooling investment so that React Native's existing JS API baseline can be accurately consumed via TypeScript — enabling future stable changes. We're formalizing the existing API you know and love. In the future, we will take action to finalise the APIs we currently offer in core — across each language surface. API changes will be communicated via RFCs/announcements, and typically a deprecation cycle. **Why isn't React Native written in TypeScript?** React Native is core infrastructure at Meta. We test every merged change across our Family of Apps, before they hit general open source availability. At this scale and sensitivity, correctness matters. The bottom line is that Flow offers us greater performance and greater strictness than TypeScript, including specific [multi-platform support for React Native](https://flow.org/en/docs/react/multiplatform/). ## Thanks[​](#thanks "Direct link to Thanks") These changes were made possible by [Iwo Plaza](https://x.com/iwoplaza), [Jakub Piasecki](https://x.com/breskin67), [Dawid Małecki](https://github.com/coado), [Alex Hunt](https://x.com/huntie), and [Riccardo Cipolleschi](https://x.com/CipolleschiR). Thanks also to [Pieter Vanderwerff](https://github.com/pieterv), [Rubén Norte](https://github.com/rubennorte), and [Rob Hogan](https://x.com/robjhogan) for their additional help and input. Learn more **** **Watch the talk!** We shared a deep dive into our motivations and the work behind the Strict TypeScript API at **App.js 2025**. [**View on YouTube**](https://www.youtube.com/live/UTaJlqhTk2g?si=SDRmj80kss7hXuGG\&t=6520) ![App.js 2025 Talk](/blog/assets/0.80-js-stable-api-appjs.jpg) **Tags:** * [announcement](/blog/tags/announcement) --- # React Native 0.80 - React 19.1, JS API Changes, Freezing Legacy Arch and much more June 12, 2025 · 12 min read ![Jorge Cohen](https://github.com/hezi.png) Jorge Cohen Engineering Manager @ Meta [](https://x.com/jorgewritescode "X")[](https://github.com/hezi "GitHub") ![Fabrizio Cucci](https://avatars.githubusercontent.com/u/8156463?v=4) Fabrizio Cucci Software Engineer @ Meta [](https://x.com/fabriziocucci "X")[](https://github.com/fabriziocucci "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Christian Falch](https://github.com/chrfalch.png) Christian Falch Software Engineer @ Expo [](https://x.com/chrfalch "X")[](https://github.com/chrfalch "GitHub") Today we are excited to release React Native 0.80! This release brings the version of React we ship inside React Native to the latest stable available: 19.1.0. We’re also shipping a series of stability improvements to our JS API: deep imports will now fire a warning and we’re offering a new opt-in Strict TypeScript API which offers types that are more accurate and safer to use. Moreover, the Legacy Architecture of React Native is now officially frozen, and you’ll start seeing warnings for APIs that will stop working once we fully sunset the Legacy Architecture. ### Highlights[​](#highlights "Direct link to Highlights") * [JavaScript deep imports deprecation](/blog/2025/06/12/react-native-0.80.md#javascript-deep-imports-deprecation) * [Legacy Architecture Freezing & Warnings](/blog/2025/06/12/react-native-0.80.md#legacy-architecture-freezing--warnings) * [React 19.1.0](/blog/2025/06/12/react-native-0.80.md#react-1910) * [Experimental - React Native iOS dependencies are now prebuilt](/blog/2025/06/12/react-native-0.80.md#experimental---react-native-ios-dependencies-are-now-prebuilt) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### JavaScript deep imports deprecation[​](#javascript-deep-imports-deprecation "Direct link to JavaScript deep imports deprecation") In this release, we are making moves to improve and stabilize React Native's public JavaScript API. The first step towards this is better scoping of which of our APIs are importable by apps and frameworks. In line with this, we are formally deprecating deep imports from React Native ([see RFC](https://github.com/react-native-community/discussions-and-proposals/pull/894)), and are introducing warnings via ESLint and the JS console. These warnings are scoped to imports from within your project's source code, and can be [opted out from](/docs/strict-typescript-api.md). However, please bear in mind that we aim to remove deep imports from React Native's API in a future release, and these should instead be updated to the root import. ``` // Before - import from subpath import {Alert} from 'react-native/Libraries/Alert/Alert'; // After - import from `react-native` import {Alert} from 'react-native'; ``` Some APIs are not exported at root, and will become unavailable without deep imports. This is intentional, in order to reduce the overall surface area of React Native's API. We have an open [feedback thread](https://github.com/react-native-community/discussions-and-proposals/discussions/893) for user issues, and will be working with the community to finalize which APIs we export over (at least) the next two React Native releases. Please share your feedback! Learn more about this change in our dedicated post: [Moving Towards a Stable JavaScript API](/blog/2025/06/12/moving-towards-a-stable-javascript-api.md). #### Opt-in Strict TypeScript API[​](#opt-in-strict-typescript-api "Direct link to Opt-in Strict TypeScript API") With the above redefinition of the exports in our public API, we're also shipping a new set of TypeScript types for the `react-native` package in 0.80, which we're calling the Strict TypeScript API. Opting into the Strict TypeScript API is a preview of our future, stable JavaScript API for React Native. These new types are: 1. **Generated directly from our source code** — improving coverage and correctness, so you can expect stronger compatibility guarantees. 2. **Restricted to React Native's index file** — more tightly defining our public API, and meaning we won't break the API when making internal file changes. We're shipping these alongside our existing types, meaning you can choose to migrate when ready. Also, if you're using standard React Native APIs, a lot of apps should validate with **no changes**. We strongly encourage early adopters and newly created apps to opt in via your `tsconfig.json` file. When the community is ready, the Strict TypeScript API will become our default API in future — synchronized with deep imports removal. Learn more about this change in our dedicated post: [Moving Towards a Stable JavaScript API](/blog/2025/06/12/moving-towards-a-stable-javascript-api.md). ### Legacy Architecture Freezing & Warnings[​](#legacy-architecture-freezing--warnings "Direct link to Legacy Architecture Freezing & Warnings") The New Architecture of React Native is the default choice [since version 0.76](/blog/2024/10/23/the-new-architecture-is-here.md) and we’ve been reading [success stories](https://blog.kraken.com/product/engineering/how-kraken-fixed-performance-issues-via-incremental-adoption-of-the-react-native-new-architecture) of projects and tools that greatly benefit from it. [We recently shared](https://github.com/reactwg/react-native-new-architecture/discussions/290) that we now consider the Legacy Architecture as frozen. We won’t be developing new bugfixes or features in the Legacy Architecture anymore and we will stop testing the Legacy Architecture while working on a release. In order to smooth the migration, we are still allowing users to opt-out of the New Architecture if you’re experiencing bugs or regressions. However shipping two architectures with React Native is a huge challenge, which impacts runtime performance, app size and maintenance of our codebase. That’s why we’ll eventually have to sunset the Legacy Architecture at some point in the future. In 0.80, we’ve added a series of warnings that will pop-up in React Native DevTools to warn you if you’re using APIs that won’t work in the New Architecture. We recommend you to not ignore those warnings and to consider migrating your apps & libraries to the New Architecture to be ready for the future. ![legacy architecture warnings](/assets/images/0.80-legacy-arch-warnings-53105425d61d9e426f21af3e239df0f5.png) You can learn more about those changes in the talk "Life After Legacy: The New Architecture Future" [we recently presented at App.js](https://www.youtube.com/live/K2JTTKpptGs?si=tRkT535f0GzguVGt\&t=9011). ### React 19.1.0[​](#react-1910 "Direct link to React 19.1.0") This release of React Native ships with the latest React stable: 19.1.0 You can read about all the new features and bugfixes introduced in React 19.1.0 in the [release description](https://github.com/facebook/react/releases/tag/v19.1.0). warning One notable feature of React 19.1.0 is the implementation and improvements of owner stacks. This is a development only feature that should help you identify which component is responsible for a specific error. However, we are aware that owner stacks are not working as expected in React Native if you use the `@babel/plugin-transform-function-name` Babel plugin, which is enabled by default in the React Native Babel Preset. We will be shipping a fix for this in a future release of React Native. ### Experimental - React Native iOS dependencies are now prebuilt[​](#experimental---react-native-ios-dependencies-are-now-prebuilt "Direct link to Experimental - React Native iOS dependencies are now prebuilt") If you’re building a React Native iOS app, you probably noticed that the first native build will take some time: a couple of minutes or even longer on older machines. That’s because we need to compile the whole React Native iOS code plus all of its dependencies. Over the last weeks we’ve been experimenting with prebuilding some of the React Native core for iOS, similarly to what happens on Android, to reduce the build time when you’re first running a React Native app. React Native 0.80 is the first release that can ship part of React Native for iOS as a prebuild to help reduce build times. During the release process of React Native, we are producing an XCFramework called `ReactNativeDependencies.xcframework` that is a prebuilt version of only the 3rd party dependencies React Native depends on. We experimented and benchmarked how much time this initial prebuild for iOS is saving and, in our benchmarks, run on an M4 machine, iOS builds are roughly 12% faster with the prebuild rather than by building from source. From our experience, we also observed that several bug reports from users are caused by build issues related with React Native’s 3rd party dependencies (example [#39568](https://github.com/facebook/react-native/issues/39568)). Prebuilding the 3rd party dependencies allows us to build them for you, so that you won’t face these build issues anymore. Note that we are not pre-building the whole React Native: we are only pre-building the libraries Meta does not directly control, such as Folly and GLog. In a future release, we will also ship the rest of React Native core as a prebuild. #### How to use them[​](#how-to-use-them "Direct link to How to use them") This feature is still experimental, so it is not turned on by default. If you want to use them, you can install your pods by adding the `RCT_USE_RN_DEP` env variable: ``` RCT_USE_RN_DEP=1 bundle exec pod install ``` Alternatively, if you want to enable it for all the developers working on that, you can modify your Podfile like this: ``` if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green use_frameworks! :linkage => linkage.to_sym end +ENV['RCT_USE_RN_DEP'] = '1' target 'HelloWorld' do config = use_native_modules! ``` Please, report any issue that the prebuilds might cause to you and to your app in [this discussion](https://github.com/react-native-community/discussions-and-proposals/discussions/912). We are committed to looking into them and making sure that tier usage is transparent to your app. ## Other Changes[​](#other-changes "Direct link to Other Changes") ### Android - Smaller APK size thanks to IPO[​](#android---smaller-apk-size-thanks-to-ipo "Direct link to Android - Smaller APK size thanks to IPO") This release ships with significant size reduction for all the Android apps built with React Native. Starting in 0.80, we enabled [Interprocedural Optimization](https://en.wikipedia.org/wiki/Interprocedural_optimization) for both React Native and Hermes builds. This resulted in a saving of \~1Mb for all the Android apps. ![android apk size comparison](/assets/images/0.80-android-apk-size-81b179f0dbf9546c8b0c9d443ba535ea.png) You will get this size win by updating your React Native version to 0.80 and there are no further changes required to your project. ### New App Screen redesign[​](#new-app-screen-redesign "Direct link to New App Screen redesign") If you’re not using Expo but you’re using the Community CLI & Template, in this version we've moved the New App Screen into its [own package](https://www.npmjs.com/package/@react-native/new-app-screen) and given it a fresh coat of paint. This reduces initial code boilerplate when you create a new app with the Community Template, and also provides a better experience when viewed on larger screens. ![New App Screen redesign](/assets/images/0.80-new-community-template-landing-19d75fcc472b11d97b4715e7c7339ef5.jpg) ### Notice about JSC community support[​](#notice-about-jsc-community-support "Direct link to Notice about JSC community support") React Native 0.80 is the last version of React Native to offer first party JSC support. The support for JSC will be offered via the community maintained package `@react-native-community/javascriptcore`. In case you missed the announcement, you can [read more about it here](/blog/2025/04/08/react-native-0.79.md#jsc-moving-to-community-package) ## Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") ### Added `"exports"` field on main package[​](#added-exports-field-on-main-package "Direct link to added-exports-field-on-main-package") As part of our JS Stable API changes, we've introduced an [`"exports"` field](https://nodejs.org/api/packages.html#package-entry-points) on the `package.json` manifest of `react-native`. In 0.80, this mapping continues to expose **all JavaScript subpaths** by default, and therefore should not be a major breaking change. At the same time, this may subtly affect how modules within the `react-native` package are resolved: * Under Metro, [platform-specific extensions](https://metrobundler.dev/docs/package-exports#replacing-platform-specific-extensions) will not be automatically expanded against `"exports"` matches. We've provided a number of shim modules to accommodate this ([#50426](https://github.com/facebook/react-native/pull/50426)). * Under Jest, the ability to mock deep imports may be altered, which may require updating tests. ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting: ### JS[​](#js "Direct link to JS") * We bumped `eslint-plugin-react-hooks` from v4.6.0 to v5.2.0 (see full [changelog here](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)). The `react-hooks` lint rules may produce new error signals which you will have to fix or suppress ### Android[​](#android "Direct link to Android") * This release bumps the Kotlin version shipped with React Native to version 2.1.20. Kotlin 2.1 introduces new language features in preview that you can start using in your modules/components. You can read more about it in [the official release notes](https://kotlinlang.org/docs/whatsnew21.html). * We deleted the `StandardCharsets` class. It has been deprecated since 0.73. You should use the `java.nio.charset.StandardCharsets` class instead. * We made several classes internal. Those classes are not part of the public API and should not be accessed. We already notified or submitted patches to the affected libraries: * `com.facebook.react.fabric.StateWrapperImpl` * `com.facebook.react.modules.core.ChoreographerCompat` * `com.facebook.react.modules.common.ModuleDataCleaner` * We migrated several classes from Java to Kotlin. If you’re using those classes, the nullability and types of some parameter changed so you might need to adjust your code: * All the classes inside `com.facebook.react.devsupport` * `com.facebook.react.bridge.ColorPropConverter` * `com.facebook.react.views.textinput.ReactEditText` * `com.facebook.react.views.textinput.ReactTextInputManager` ### iOS[​](#ios "Direct link to iOS") * We deleted the `RCTFloorPixelValue` field from RCTUtils.h - The `RCTFloorPixelValue` method was not used in React Native and we removed it altogether. Further smaller breaking changes are listed [in the CHANGELOG for 0.80](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0800). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.80 contains over 1167 commits from 127 contributors. Thanks for all your hard work! We want to send a special thank you to those community members that shipped significant contributions in this release: * [Christian Falch](https://github.com/chrfalch) for the work on the iOS prebuilds for React Native Dependencies * [Iwo Plaza](https://x.com/iwoplaza), [Jakub Piasecki](https://x.com/breskin67), and [Dawid Małecki](https://github.com/coado) for their work on the Strict TypeScript API. Moreover, we also want to thank the additional authors that worked on documenting features in this release post: * [Riccardo Cipolleschi](https://github.com/cipolleschi) for authoring the part related to iOS prebuilds for React Native Dependencies. * [Alex Hunt](https://x.com/huntie) for Deep imports deprecation, Opt-in Strict TypeScript API, New App Screen redesign. * [Nicola Corti](https://x.com/cortinico) for the Legacy Architecture Freezing & Warnings. ## Upgrade to 0.80[​](#upgrade-to-080 "Direct link to Upgrade to 0.80") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: If you use Expo, React Native 0.80 will be supported in a canary release of the Expo SDK. Instructions on how to use React Native 0.80 in Expo are also available [in a dedicated blogpost](https://expo.dev/changelog/react-native-80). info 0.80 is now the latest stable version of React Native and 0.77.x moves to unsupported. For more information see React Native's support policy. We aim to publish a final end-of-life update of 0.77 in the near future. **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.81 - Android 16 support, faster iOS builds, and more August 12, 2025 · 10 min read ![Moti Zilberman](https://github.com/motiz88.png) Moti Zilberman Software Engineer @ Meta [](https://github.com/motiz88 "GitHub")[](https://www.threads.net/@motizilberman "Threads")[](https://bsky.app/profile/moti.zlbr.mn "Bluesky") ![Vitali Zaidman](https://github.com/vzaidman.png) Vitali Zaidman Software Engineer @ Meta [](https://x.com/vzaidman "X")[](https://github.com/vzaidman "GitHub")[](https://www.threads.net/@vzaidman "Threads") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Christian Falch](https://github.com/chrfalch.png) Christian Falch Software Engineer @ Expo [](https://x.com/chrfalch "X")[](https://github.com/chrfalch "GitHub") Today we are excited to release React Native 0.81! This ships with support for Android 16 (API level 36) and includes a variety of other stability improvements and bugfixes, as well as experimental support for faster iOS builds using precompilation. ### Highlights[​](#highlights "Direct link to Highlights") * [Android 16 support](/blog/2025/08/12/react-native-0.81.md#android-16-support) * [SafeAreaView deprecation](/blog/2025/08/12/react-native-0.81.md#safeareaview-deprecation) * [Community-maintained JavaScriptCore support](/blog/2025/08/12/react-native-0.81.md#community-maintained-javascriptcore-support) * [Experimental Precompiled iOS builds](/blog/2025/08/12/react-native-0.81.md#experimental-precompiled-ios-builds) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### Android 16 support[​](#android-16-support "Direct link to Android 16 support") Android apps built with React Native 0.81 will now default to targeting **Android 16** (API level 36). As previously announced by Google, Android 16 requires that [apps are displayed edge-to-edge](https://developer.android.com/develop/ui/views/layout/edge-to-edge) with no support for [opting out](https://developer.android.com/about/versions/16/behavior-changes-16). To support this, we are deprecating the `` component [as previously announced](https://github.com/react-native-community/discussions-and-proposals/discussions/827) in favor of alternatives. [See below](#safeareaview-deprecation) which will provide better edge-to-edge support. We are also adding a new gradle property `edgeToEdgeEnabled` to let you choose if you wish to enable edge-to-edge on all supported Android versions below 16. [Predictive back gesture](https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture) is now enabled by default for apps targeting Android 16. The [BackHandler](https://reactnative.dev/docs/backhandler) API should continue to work as before for most use cases. However, if your app relies on custom native code for back handling (such as overriding the `onBackPressed()` method), you may need to manually migrate your code or [temporarily opt-out](https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture#opt-out). Please test your app’s back navigation thoroughly after upgrading. Google now expects apps to support [adaptive layouts](https://developer.android.com/develop/ui/compose/layouts/adaptive) on large screen devices, regardless of orientation or size restrictions. While you can opt-out for now, it’s recommended to test and update your app for responsive UI on large screens before Android 17. Starting November 1, 2025, all Google Play app submissions must meet the 16 KB page size requirement for native binaries. This applies to new apps and updates targeting Android 15+ devices. **React Native is already 16KB page size compliant**. Ensure all your native code and third-party libraries are compliant as well. For more details on Android 16 changes and migration steps, refer to this [post in the discussions-and-proposals](https://github.com/react-native-community/discussions-and-proposals/discussions/921) repository. ### SafeAreaView deprecation[​](#safeareaview-deprecation "Direct link to SafeAreaView deprecation") The built-in `` component was originally designed to provide **limited, iOS-only support** for keeping content in the “safe areas” of the screen (away from camera notches, rounded corners, etc). It is not compatible with edge-to-edge rendering on Android, and does not permit customization beyond padding. As a result, many apps have opted for more portable and flexible solutions, such as `react-native-safe-area-context`. In React Native 0.81, the legacy `` component is deprecated, and you will see warnings in React Native DevTools if your app uses it. It will be removed in a future version of React Native. We recommend that you migrate to `react-native-safe-area-context` or a similar library to ensure your app looks its best across all platforms. ### Community-maintained JavaScriptCore support[​](#community-maintained-javascriptcore-support "Direct link to Community-maintained JavaScriptCore support") [As we announced last year](https://reactnative.dev/blog/2025/04/08/react-native-0.79#jsc-moving-to-community-package), support for the JavaScriptCore (JSC) engine has moved to a [community-maintained package](https://github.com/react-native-community/javascriptcore) that is released separately from React Native itself. In React Native 0.81, we're removing the built-in version of JavaScriptCore. All apps that require JavaScriptCore should now use the community package in order to upgrade to 0.81. [Read the installation instructions](https://github.com/react-native-community/javascriptcore#installation) for the details. This change does not affect apps that are using Hermes. ### Experimental Precompiled iOS builds[​](#experimental-precompiled-ios-builds "Direct link to Experimental Precompiled iOS builds") React Native 0.81 introduces precompiled iOS builds, cutting compile times by up to 10x in projects where React Native is the primary dependency. This is the result of a collaboration between Expo and Meta, and expands on [work we previously shipped in React Native 0.80](https://reactnative.dev/blog/2025/06/12/react-native-0.80#experimental---react-native-ios-dependencies-are-now-prebuilt). This feature is still experimental, but we are hoping to enable it for all apps in a future release. If you’d like to try precompiled builds in your own app, you can enable them by specifying the following environment variables when you run `pod install`: ``` RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 bundle exec pod install ``` Please provide feedback in [this GitHub discussion](https://github.com/react-native-community/discussions-and-proposals/discussions/923). There are two limitations we are already aware of, and are working to resolve: * In precompiled builds, you cannot debug and step into React Native's internals. You can still debug your *own* native code while using a precompiled version of React Native. * Prebuilds are not supported in Xcode 26 Beta, because the IDE builds all targets with [Swift explicit modules](https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes#Resolved-Issues-in-Xcode-26-Beta:~:text=Starting%20from%20Xcode%2026%2C%20Swift%20explicit%20modules%20will%20be%20the%20default%20mode%20for%20building%20all%20Swift%20targets) enabled. To use precompiled builds with Xcode 26, set the `SWIFT_ENABLE_EXPLICIT_MODULES` flag to `NO` in your Xcode project. We will address this in an upcoming patch release. You can read more about this feature in Expo’s full blog post, [Precompiled React Native for iOS: Faster builds are coming in 0.81](https://expo.dev/blog/precompiled-react-native-for-ios). ## Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") ### Minimum Node.js bumped to 20[​](#minimum-nodejs-bumped-to-20 "Direct link to Minimum Node.js bumped to 20") React Native now requires [Node.js](https://nodejs.org/) version 20.19.4 (the latest [Maintenance LTS](https://nodejs.org/en/about/previous-releases) version at the time of writing) or higher. You may need to upgrade Node.js in your development or CI environment when you upgrade to React Native 0.81. ### Minimum Xcode bumped to 16.1[​](#minimum-xcode-bumped-to-161 "Direct link to Minimum Xcode bumped to 16.1") React Native now requires [Xcode 16.1](https://developer.apple.com/documentation/xcode-release-notes/xcode-16_1-release-notes) or higher to build iOS projects. You may need to upgrade Xcode in your development or CI environment when you upgrade to React Native 0.81. ### Metro: Better support for advanced configuration in Community CLI projects[​](#metro-better-support-for-advanced-configuration-in-community-cli-projects "Direct link to Metro: Better support for advanced configuration in Community CLI projects") Metro now respects the `resolveRequest` and `getModulesRunBeforeMainModule` options if specified in the `metro.config.js` file of a React Native Community CLI project. Previously, setting them would have no effect. If you have custom values for these options in your `metro.config.js` file, you may need to delete them in order to restore the previous behavior. ### Improved reporting of uncaught JavaScript errors[​](#improved-reporting-of-uncaught-javascript-errors "Direct link to Improved reporting of uncaught JavaScript errors") React Native DevTools now shows the original message and stack trace of uncaught JavaScript errors, as well as the error’s [cause](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) if any, and an [Owner Stack](https://react.dev/reference/react/captureOwnerStack#owner-stack-vs-component-stack) for errors thrown by components. This makes errors easier to debug and fix. ![Example error including a cause and Owner Stack](/assets/images/0.81-improved-uncaught-error-fa95330ee5a41739cc7604a21e03be8b.png) If you are logging JavaScript errors to your backend or to a third-party error reporting service, this may affect the logs you see after upgrading to React Native 0.81 (for example: you might see more thrown errors that used to be reported via `console.error`), and you may need to update some backend logic accordingly. ### `RN_SERIALIZABLE_STATE` and C++ flags.[​](#rn_serializable_state-and-c-flags "Direct link to rn_serializable_state-and-c-flags") In this version of React Native, we introduced a new macro called `RN_SERIALIZABLE_STATE` to support serializable state for the Components on New Architecture. If you’re a library author and you have a **custom** `CMakeLists.txt` file, you will need to specify this macro in your CMakeLists.txt file or your C++ code could fail to compile. To support this, we introduce a new CMake function called `target_compile_reactnative_options` which will take care of setting up this macro and all the necessary C++ flags for you. You can invoke it as such in your CMakeLists file: ``` target_compile_reactnative_options(myLibraryName PRIVATE) ``` You can see an example of [how react-native-screens has set up this macro](https://github.com/software-mansion/react-native-screens/pull/3114/commits/b4d283c8fc65e36ec60726fd7513735ccc7e1fe9). This change will affect only more advanced and complex libraries. If your library is using codegen and you don’t have a custom CMake file, you won’t be affected by this change. ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") This list contains a series of other breaking changes we suspect could have a minor impact to your product code and are worth noting: #### Android[​](#android "Direct link to Android") * We made several classes internal. Those classes are not part of the public API and should not be accessed. We already notified or submitted patches to the affected libraries: * `com.facebook.react.fabric.mounting.MountingManager` * `com.facebook.react.views.text.TextLayoutManager` * We moved the `textAlignVertical` [native prop](https://github.com/facebook/react-native/blob/841866c35401ae05fa9c6a2a3e9b42714bbd291e/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h#L83) from `TextAttribute.h` to `ParagraphAttribute.h` * The prop `textAlignVertical` only affects the top most text view (paragraph view). Yet, it exists in text attribute props nonetheless. To better reflect this platform limitation it was moved to paragraph props. * This change is **not** affecting the JS API of the `` component. * You will be affected by this change only if you implement a Fabric component that interacts with the C++ Text API. * If you’re affected by this change, you can replace `TextAttributes.h` with `ParagraphAttribute.h` in your code Read the full list of breaking changes [in the CHANGELOG for 0.81](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0810). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.81 contains over 1110 commits from 110 contributors. Thanks for all your hard work! We want to send a special thank you to those community members that shipped significant contributions in this release: * [Christian Falch](https://github.com/chrfalch) for the amazing work on precompiled iOS builds. * [Mathieu Acthernoene](https://github.com/zoontek) for crucial contributions to Android edge-to-edge support * [Enrique López-Mañas](https://github.com/kikoso) and for helping test Android 16 integration and the SafeAreaView deprecation. ## Upgrade to 0.81[​](#upgrade-to-081 "Direct link to Upgrade to 0.81") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the Upgrading docs. To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, React Native 0.81 will be supported in the upcoming Expo SDK 54 as the default version of React Native. info 0.81 is now the latest stable version of React Native and 0.78.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.82 - A New Era October 8, 2025 · 13 min read ![Vitali Zaidman](https://github.com/vzaidman.png) Vitali Zaidman Software Engineer @ Meta [](https://x.com/vzaidman "X")[](https://github.com/vzaidman "GitHub")[](https://www.threads.net/@vzaidman "Threads") ![Nicola Corti](https://github.com/cortinico.png) Nicola Corti Software Engineer @ Meta [](https://x.com/cortinico "X")[](https://github.com/cortinico "GitHub")[](https://bsky.app/profile/cortini.co "Bluesky") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Alan Hughes](https://github.com/alanjhughes.png) Alan Hughes Software Engineer @ Expo [](https://github.com/alanjhughes "GitHub") Today we're excited to release React Native 0.82: the first React Native that runs entirely on the New Architecture. This is a milestone release for React Native and we believe it's the start of a new era. In future versions we will be removing the remaining code from the Legacy Architecture to reduce install size and streamline the codebase. In addition, 0.82 also ships with an experimental opt-in to a newer version of Hermes called Hermes V1. We’re also enabling several React features by updating the React version to 19.1.1, and shipping support for DOM Node APIs. ### Highlights[​](#highlights "Direct link to Highlights") * [New Architecture Only](/blog/2025/10/08/react-native-0.82.md#new-architecture-only) * [Experimental Hermes V1](/blog/2025/10/08/react-native-0.82.md#experimental-hermes-v1) * [React 19.1.1](/blog/2025/10/08/react-native-0.82.md#react-1911) * [DOM Node APIs](/blog/2025/10/08/react-native-0.82.md#dom-node-apis) ## New Architecture Only[​](#new-architecture-only "Direct link to New Architecture Only") In React Native 0.76 we announced that [The New Architecture](/blog/2024/10/23/the-new-architecture-is-here.md) became the default architecture of React Native. Since then, the New Architecture has been tested and refined and we're confident in making it the **only** architecture for this and future versions of React Native. This means that if you try to set `newArchEnabled=false` on Android, or if you try to install CocoaPods with `RCT_NEW_ARCH_ENABLED=0` on iOS, these will be ignored and your app will still run using the New Architecture. ### How to migrate[​](#how-to-migrate "Direct link to How to migrate") If you haven’t migrated your project to the New Architecture, we recommend first migrating your project to React Native 0.81 or Expo SDK 54. These are the last versions that allow you to use the Legacy Architecture. They contain warnings and performance improvements specifically to help migrating to the New Architecture.
Then enable the New Architecture in 0.81 and verify that your application is working fine.
Once you're using the New Architecture in 0.81, you can update safely to React Native 0.82 which prevents enabling the Legacy Architecture. If an incompatible 3rd party dependency is blocking you from migrating to the New Architecture, we recommend you reach out to the library maintainers directly. If a bug in React Native core is blocking you from migrating, we recommend you reach out to us [through our issue tracker](https://github.com/facebook/react-native/issues/new/choose). ### Interop Layers & 3P library compatibility[​](#interop-layers--3p-library-compatibility "Direct link to Interop Layers & 3P library compatibility") We will keep the interop layers in the codebase for the foreseeable future. All the classes and functions that are required by the interop layers won’t be removed anytime soon. We will share further updates in the future regarding the removal of Interop Layers. We’ve also verified that the 3P libraries that offer backward compatibility with both architectures will keep on working with 0.82 where New Architecture is the only architecture. ### Removal of Legacy Architecture classes[​](#removal-of-legacy-architecture-classes "Direct link to Removal of Legacy Architecture classes") To ensure backward compatibility and reduce breaking changes, we are not removing any APIs of the Legacy Architecture from the core of React Native in this version. Removing the Legacy Architecture will allow us to save significant size on the overall bundle size, therefore the removal is scheduled to start from the next version of React Native. You can find more information in [RFC0929: Removal of the Legacy Architecture of React Native](https://github.com/react-native-community/discussions-and-proposals/pull/929). ## Experimental Hermes V1[​](#experimental-hermes-v1 "Direct link to Experimental Hermes V1") React Native 0.82 adds support for opting into Hermes V1. Hermes V1 is the next evolution of Hermes. We've been experimenting with it internally in our apps, and it is now time for the community to try it as well. It comes with improvements in the compiler and in the VM that boost Hermes performance. From initial tests and benchmarks, Hermes V1 outperforms current Hermes in various scenarios. We have seen improvements in bundle loading and TTI. The improvements strongly depend on the details of your apps. On the [Expensify app](https://github.com/Expensify/App), a real world and complex application, we have seen the following improvements: | Metric | Android (low end device) | iOS | | ---------------- | ------------------------ | ----------- | | Bundle Load Time | 3.2% faster | 9% faster | | Total TTI | 7.6% faster | 2.5% faster | | Content TTI | 7.2% faster | 7.5% faster | For Total TTI, we measured the time it takes from bundle loading to when the first screen in the app is rendered and it is interactive. For Content TTI, we measured the time it takes for a component to be interactive, starting from the first rendering of the component itself. Hermes V1 does not yet contain JS-to-native compilation (previously known as “Static Hermes”) or the JIT compilation that was [presented during React Native EU 2023](https://www.youtube.com/watch?v=q-xKYA0EO-c). We are still testing these features, and will share more as we make progress. ### How to enable Hermes V1[​](#how-to-enable-hermes-v1 "Direct link to How to enable Hermes V1") info While Hermes V1 is in the experimental phase, you’ll need to build React Native from source to try it out. Once Hermes V1 ships as default in a future React Native version, this restriction will be lifted. To try Hermes V1 in your own project, use the following steps: 1. Force your package manager to resolve the experimental version of Hermes V1 compiler package by modifying the corresponding section of your `package.json` file (note that the current versioning convention is only for the experimental phase of Hermes V1): * yarn * npm ``` "resolutions": { "hermes-compiler": "250829098.0.1" } ``` ``` "overrides": { "hermes-compiler": "250829098.0.1" } ``` 2. Enable Hermes V1 for Android by adding `hermesV1Enabled=true` inside the `android/gradle.properties`: android/gradle.properties ``` hermesV1Enabled=true ``` Also, configure React Native [to build from source](https://reactnative.dev/contributing/how-to-build-from-source#android) by editing `android/settings.gradle`: android/settings.gradle ``` includeBuild('../node_modules/react-native') { dependencySubstitution { substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid")) substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid")) substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:250829098.0.1")) } } ``` 3. Enable Hermes V1 for iOS by installing pods with `RCT_HERMES_V1_ENABLED=1` environment variable. ``` RCT_HERMES_V1_ENABLED=1 bundle exec pod install ``` Keep in mind that Hermes V1 is not compatible with the precompiled React Native builds, so make sure you don’t use the `RCT_USE_PREBUILT_RNCORE` flag when installing pods. 4. To confirm if your app is running Hermes V1, execute the following code within your app or DevTools console. This code will return the Hermes version, which should match the version specified in step 1 (`250829098.0.1`): ``` // expecting "250829098.0.1" in Hermes V1 HermesInternal.getRuntimeProperties()['OSS Release Version']; ``` ## React 19.1.1[​](#react-1911 "Direct link to React 19.1.1") This release of React Native ships with the latest React stable: [React 19.1.1](https://github.com/facebook/react/releases/tag/v19.1.1). This release of React contains full support for owner stacks for React Native. Back in React Native 0.80, when we shipped support for 19.1.0, we [mentioned](/blog/2025/06/12/react-native-0.80.md#react-1910) that owner stacks were not fully supported if you were using the [`@babel/plugin-transform-function-name`](https://babeljs.io/docs/babel-plugin-transform-function-name) Babel plugin. This release lifts this restriction and enables owner stacks for all React Native users. | BEFORE | AFTER | | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | ![Example error thrown without Owner Stacks](/assets/images/0.82-owners-stack-before-bf24fa9bc9dd697b9200eb010ff02695.png) | ![Example error thrown with Owner Stacks](/assets/images/0.82-owners-stack-after-ed600840df30d9908efafb13dd595829.png) | React 19.1.1 also improves the reliability of [`useDeferredValue`](https://react.dev/reference/react/useDeferredValue) and [`startTransition`](https://react.dev/reference/react/startTransition) in a Suspense boundary for React Native. These are essential React features, designed to boost app responsiveness. Previously both were wrongly showing the fallback component when used together with a Suspense boundary on React Native. With React 19.1.1, they now consistently perform as expected on React Native, aligning their behavior with Web. ## DOM Node APIs[​](#dom-node-apis "Direct link to DOM Node APIs") Starting from React Native 0.82, native components will provide DOM-like nodes via refs. Before, native components provided React Native-specific objects with just a handful of methods like `measure` and `setNativeProps`. After this release, they will provide [nodes implementing a subset of the DOM API](https://reactnative.dev/docs/element-nodes) to traverse the UI tree, measure layout, and more as on Web. For example: ``` function MyComponent(props) { const ref = useRef(); useEffect(() => { const element = ref.current; // New methods element.parentNode; element.parentElement; element.childNodes; element.children; const bounds = element.getBoundingClientRect(); const doc = element.ownerDocument; const maybeElement = doc.getElementById('some-view'); // Legacy methods are still available element.measure((x, y, width, height, pageX, pageY) => { /* ... */ }); }, []); return ; } ``` Additionally, this will expose access to leaf [text nodes](https://reactnative.dev/docs/text-nodes) (created by the `Text` component) and [document nodes](https://reactnative.dev/docs/document-nodes) representing React Native root nodes. This is a backwards compatible change, as the new nodes will continue implementing the legacy methods (like `measure`). For more information, please check our [documentation](https://reactnative.dev/docs/nodes). ## Other changes[​](#other-changes "Direct link to Other changes") ### Web Performance APIs (Canary)[​](#web-performance-apis-canary "Direct link to Web Performance APIs (Canary)") React Native now implements a subset of the performance APIs available on Web: * [High Resolution Time](https://www.w3.org/TR/hr-time-3/): defines `performance.now()` and `performance.timeOrigin`. * [Performance Timeline](https://w3c.github.io/performance-timeline/): defines `PerformanceObserver` and methods to access performance entries in the performance object (`getEntries()`, `getEntriesByType()`, `getEntriesByName()`). * [User Timing](https://w3c.github.io/user-timing/): defines `performance.mark` and `performance.measure`. * [Event Timing API](https://w3c.github.io/event-timing/): defines `event` entry types reported to `PerformanceObserver`. * [Long Tasks API](https://w3c.github.io/longtasks/): defines `longtask` entry types reported to `PerformanceObserver`. They allow tracking different aspects of performance in your app at runtime (for telemetry) and they will be visible in the performance panel in React Native DevTools (available in a future version of React Native). They are currently **available only in the [canary release level](https://reactnative.dev/docs/releases/release-levels)**, and will be released as stable in a future version of React Native. ### Optimized Debug Build Type for Android[​](#optimized-debug-build-type-for-android "Direct link to Optimized Debug Build Type for Android") Starting with React Native 0.82, you will be able to use the `debugOptimized` build type to speed up your development experience. Historically, Android creates two default build variants: * `debug`, used by default when developing and that allows you to connect to the various debugger tools such as React Native DevTools, Metro, the Android JVM and C++ debugger * `release`, used when shipping your application to production. This is fully optimized, with obfuscation and optimization that will make debugging harder. As most React Native developers won’t need to use the C++ debugger when developing, we introduced the `debugOptimized` build type. With `debugOptimized` your animations and re-rendering will be faster, because you’re running a React Native build with several C++ optimizations enabled. At the same time you will still be able to use React Native Dev Tools to debug your JavaScript code. When using `debugOptimized`, you won’t be able to use the C++ native debuggers, but you will still be able to use it if you use the debug build type. To run the `debugOptimized` variant for your app you can invoke: * Community CLI * Expo `npx react-native run-android --mode debugOptimized` `npx expo run:android --variant debugOptimized` info The `debugOptimized` build type has also been backported to React Native 0.81 and Expo SDK 54. You can see the `debugOptimized` in action in these samples where we’re rendering several animations on screens. The build running `debug` is running at \~20FPS while the `debugOptimized` one is running at \~60FPS: | `debug` | `debugOptimized` | | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | ![Example build running with debug](/assets/images/0.82-debug-b85b9cfcbd8b7c2f86f8bea40be8edd1.gif) | ![Example build running with debugOptimized](/assets/images/0.82-debug-optimized-42824de1774ee3794888eb24203f56e2.gif) | ## Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") ### Uncaught promise rejections will now raise `console.error`[​](#uncaught-promise-rejections-will-now-raise-consoleerror "Direct link to uncaught-promise-rejections-will-now-raise-consoleerror") Following the [improvement of reporting uncaught JavaScript errors](/blog/2025/08/12/react-native-0.81.md#improved-reporting-of-uncaught-javascript-errors) in the previous version, we will now be reporting uncaught promises through that mechanism as well: ![Example of a promise rejection reported to console](/assets/images/0.82-uncaught-promise-rejection-report-9b6e4e11cc1db946a1ebd377a54a21cc.png) Due to a bug, these were completely swallowed and ignored previously, so please expect some pre-existing errors to surface after upgrading to React Native 0.81. For that reason, previously pre-existing errors might also surface in JavaScript errors reported to your backend, and create a surge in new reports. ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") #### General[​](#general "Direct link to General") * Move `ReactNativeFeatureFlags` to `src/private` * In general you should not depend on `ReactNativeFeatureFlags` at all as that is a private API. * Type of `Appearance.setColorScheme()` has been updated to no longer accept a nullable value * Use 'unspecified' instead of null/undefined in the edge case that the color scheme needs to be reset. #### iOS[​](#ios "Direct link to iOS") * Migrated `RCTDisplayLink` away from legacy api `RCTModuleData` as we plan to remove it in the future. #### Android[​](#android "Direct link to Android") * Class `com.facebook.react.bridge.JSONArguments` is removed as was accidentally `public` * Deprecate `MessageQueueThreadPerfStats` * We deprecated this API and replaced it with stub. You should not rely on stats from this API anymore as the provided stats were not reliable * Bump Gradle from 8.x to 9.0.0 * List of all the changes in the next major stable version of Gradle 9.0.0 is available [here](https://gradle.org/whats-new/gradle-9/) but we expect no impact at all to users #### C++[​](#c "Direct link to C++") * Delete backward compatibility headers for `CallbackWrapper.h` / `LongLivedObject.h` * The correct include for those headers is `#include ` and `#include `. * You should not use the old includes under `#import ` Read the full list of breaking changes in the [CHANGELOG for 0.82](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0820). ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.82 contains over 868 commits from 93 contributors. Thanks for all your hard work! We want to send a special thank you to those community members that shipped significant contributions in this release: * [Dawid Małecki](https://github.com/coado) and [Jakub Piasecki](https://github.com/j-piasecki) for the help in rolling out Hermes V1. * [Krystof Woldrich](https://github.com/krystofwoldrich) for the support with fixing the swallowing of uncaught promise rejections. * [Riccardo Cipolleschi](https://github.com/cipolleschi) for the support with writing the React 19.1.1 and Hermes V1 paragraph above. * [Rubén Norte](https://github.com/rubennorte) for the support with writing the DOM API and Performance API paragraphs. * [Tomasz Zawadzki](https://github.com/tomekzaw/) for the support with the `debugOptimized` benchmarking. ## Upgrade to 0.82[​](#upgrade-to-082 "Direct link to Upgrade to 0.82") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [upgrading to new versions docs](/docs/upgrading.md). To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, React Native 0.82 will be available as part of the expo\@canary releases. The next SDK, SDK 55, will be shipped with the next stable release of React Native: 0.83. info 0.82 is now the latest stable version of React Native and 0.79.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). **Tags:** * [engineering](/blog/tags/engineering) --- # React Native 0.83 - React 19.2, New DevTools features, no breaking changes December 10, 2025 · 12 min read ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") ![Riccardo Cipolleschi](https://github.com/cipolleschi.png) Riccardo Cipolleschi Software Engineer @ Meta [](https://x.com/CipolleschiR "X")[](https://github.com/cipolleschi "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Alan Hughes](https://github.com/alanjhughes.png) Alan Hughes Software Engineer @ Expo [](https://github.com/alanjhughes "GitHub") Today we are excited to release React Native 0.83! This release includes React 19.2, significant new features for React Native DevTools, and support for the Web Performance and Intersection Observer APIs (Canary). This is also the first React Native release with no user facing breaking changes. ### Highlights[​](#highlights "Direct link to Highlights") * [React 19.2](/blog/2025/12/10/react-native-0.83.md#react-192) * [New DevTools features](/blog/2025/12/10/react-native-0.83.md#new-devtools-features) * [Intersection Observers (Canary)](/blog/2025/12/10/react-native-0.83.md#intersection-observers-canary) * [Web Performance APIs as stable](/blog/2025/12/10/react-native-0.83.md#web-performance-apis-as-stable) ## React 19.2[​](#react-192 "Direct link to React 19.2") This release includes React 19.2, bringing the new `` and `useEffectEvent` APIs to React Native. Important: [CVE-2025-55182](https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components) At time of release, `react-native@0.83.0` depends on `react@19.2.0`, and you might also have seen the recent [Critical Security Vulnerability in React Server Components](https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components). We want to stress that **React Native is NOT directly affected by this vulnerability**, as it does not depend on the impacted packages: * `react-server-dom-webpack` * `react-server-dom-parcel` * `react-server-dom-turbopack` **However**, if you are using React Native as part of a **monorepo** where these packages may be present, please check and upgrade them immediately. We will update all React dependencies to `19.2.1` in our next patch release. ### ``[​](#activity "Direct link to activity") `` lets you break your app into "activities" that can be controlled and prioritized. You can use Activity as an alternative to conditionally rendering parts of your app, and it currently supports 2 modes: `'visible'` and `'hidden'`. * `hidden`: hides the children, unmounts effects, and defers all updates until React has nothing left to work on. * `visible`: shows the children, mounts effects, and allows updates to be processed normally. One interesting feature of trees hidden using `` is that they preserve their state. So, when they become visible again, they, for example, keep the search status and the selection from a previous user interaction. | React 19.1.1 | React 19.2.1 | | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | | ![](/assets/images/0.83-react-19.2-no-activity-61b910cc3d32753f1432f8d365963dab.gif) | ![](/assets/images/0.83-react-19.2-activity-c374acc50fc57945dd0ef92ab6d119fe.gif) | You can read more about `` in the [React docs](https://react.dev/reference/react/Activity). ### `useEffectEvent`[​](#useeffectevent "Direct link to useeffectevent") One common pattern with `useEffect` is to notify the app code about some kind of "event" from an external system. The problem with this approach is that a change to any value used inside such an event will cause the surrounding Effect to re-run. To solve this, most users disable the lint rule and exclude the dependency. But that can lead to bugs since the linter can no longer help you keep the dependencies up to date if you need to update the Effect later. With `useEffectEvent`, you can split the "event" part of this logic out of the Effect that emits it. You can read more about `useEffectEvent` in the [React docs](https://react.dev/reference/react/useEffectEvent). ## New DevTools features[​](#new-devtools-features "Direct link to New DevTools features") In 0.83 we're excited to deliver some long awaited features and quality of life improvements to React Native DevTools. ### Network and Performance panels[​](#network-and-performance-panels "Direct link to Network and Performance panels") Network inspection and performance tracing are two powerful new capabilities in React Native DevTools, available today. ![Network panel list in React Native DevTools](/assets/images/debugging-rndt-network-462cd5e39a5525592501627bb0087747.jpg) **Network inspection**, now available for all React Native apps, allows you to view and understand the network requests made by your app. Logged requests provide detailed metadata such as timings and headers sent/received, as well as response previews. And — for the first time — you can use the Initiator tab to see where in your code a network request originated. **💡 Network event coverage, Expo support** **Which network events are captured?** Today, we record all network calls through `fetch()`, `XMLHttpRequest`, and `` — with support for custom networking libraries, such as Expo Fetch, coming later. **Expo Network differences** Because of this, apps using Expo will continue to see the "Expo Network" panel — a separate implementation by the Expo framework which will log these additional request sources but has slightly reduced features. * Coverage for Expo-specific network events. * No request initiator support. * No Performance panel integration. We're working with Expo to integrate Expo Fetch and third party networking libraries with our new Network inspection pipeline in future releases. ![A performance trace in React Native DevTools](/assets/images/debugging-rndt-performance-084166527768b90dbb936b240707bdcb.jpg) **Performance tracing** allows you to record a performance session within your app to understand how your JavaScript code is running and what operations took the most time. In React Native, we show JavaScript execution, React Performance tracks, Network events, and custom [User Timings](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/User_timing), rendered in a single performance timeline. Together with support for the Web Performance APIs in 0.83, this is a powerful feature set providing fine-grained visibility into what might be making your React Native apps slow. We encourage everyone to try out the Performance panel and make it a part of your daily workflow. Learn more about our newest [React Native DevTools features](/docs/react-native-devtools.md) and [React Performance tracks](https://react.dev/reference/dev-tools/react-performance-tracks). ### New desktop app[​](#new-desktop-app "Direct link to New desktop app") Previously, React Native DevTools launched in a browser window and required Chrome or Edge to be installed. Today, we're introducing a vastly improved desktop experience with our new bundled desktop app. It features: * **The same zero-install setup as before**, now with **no web browser requirement**. * **Faster launch** via a lightweight and notarized desktop binary. In rare cases where this cannot be downloaded (such as a corporate firewall), we fall back to the previous browser launch flow. * **Better windowing**, with improved multitasking on macOS, auto-raise on breakpoint, auto-raise when reconnecting to the same app, and saved window arrangements on relaunch. * **Improved reliability** by running DevTools separately from your personal browser profile. In particular, this resolves bug reports we have received about certain preinstalled Chrome extensions causing React Native DevTools to break. ![React Native DevTools icon in the macOS Dock](/assets/images/0.83-rndt-desktop-app-99c6ef69aebde93fc5775942e660518c.jpg) ## Intersection Observers (Canary)[​](#intersection-observers-canary "Direct link to Intersection Observers (Canary)") As part of our effort to bring web APIs to React Native, we have added support for [`IntersectionObserver`](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) in the [canary release](https://reactnative.dev/docs/next/releases/release-levels#how-to-initialize-react-native-using-canary--experimental) for 0.83. `IntersectionObserver` allows you to asynchronously observe layout intersections between a target element and its ancestor. Please see our [API](https://reactnative.dev/docs/next/global-intersectionobserver) and [implementation docs](https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/webapis/intersectionobserver/__docs__/README.md) for more details. We've also included [examples](https://github.com/facebook/react-native/tree/main/packages/rn-tester/js/examples/IntersectionObserver) in RNTester. [](/blog/assets/0.83-intersection-observer.mp4) ## Other changes[​](#other-changes "Direct link to Other changes") ### Web Performance APIs as stable[​](#web-performance-apis-as-stable "Direct link to Web Performance APIs as stable") As introduced in 0.82, React Native now implements a subset of the [Performance APIs](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) available on Web — now rolled out as stable: * [High Resolution Time](https://www.w3.org/TR/hr-time-3/): defines `performance.now()` and `performance.timeOrigin`. * [Performance Timeline](https://w3c.github.io/performance-timeline/): defines `PerformanceObserver` and methods to access performance entries in the performance object (`getEntries()`, `getEntriesByType()`, `getEntriesByName()`). * [User Timing](https://w3c.github.io/user-timing/): defines `performance.mark` and `performance.measure`. * [Event Timing API](https://w3c.github.io/event-timing/): defines `event` entry types reported to `PerformanceObserver`. * [Long Tasks API](https://w3c.github.io/longtasks/): defines `longtask` entry types reported to `PerformanceObserver`. These APIs allow tracking different aspects of performance in your app, visible in the Performance panel in React Native DevTools, as well as at runtime via `PerformanceObserver`. `PerformanceObserver` also works in production builds, opening new opportunities for capturing real world performance metrics in your apps. ### Experimental - Hermes V1[​](#experimental---hermes-v1 "Direct link to Experimental - Hermes V1") ![Hermes logo](/assets/images/0.83-hermes-v1-15f50ba6bcc70a8b99e4c3e13bd17ac8.jpg) Hermes V1 is the next evolution of Hermes, with improvements in the compiler and the VM that significantly boost JavaScript performance. In React Native 0.82, we released Hermes V1 as an experimental opt-in. And in 0.83, Hermes V1 includes further performance improvements. **💡 Enabling Hermes V1** **Note**: While Hermes V1 is in the experimental phase, you’ll need to build React Native from source to try it out. To try Hermes V1 in your own project, use the following steps: 1. Force your package manager to resolve the experimental version of Hermes V1 compiler package by modifying the corresponding section of your package.json file (note that the current versioning convention is only for the experimental phase of Hermes V1): * yarn * npm package.json ``` "resolutions": { "hermes-compiler": "250829098.0.4" } ``` package.json ``` "overrides": { "hermes-compiler": "250829098.0.4" } ``` 2. Enable Hermes V1 for Android by adding hermesV1Enabled=true inside `android/gradle.properties`: android/gradle.properties ``` hermesV1Enabled=true ``` Also, configure React Native to build from source by editing android/settings.gradle: android/settings.gradle ``` includeBuild('../node_modules/react-native') { dependencySubstitution { substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid")) substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid")) substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:250829098.0.1")) } } ``` 3. Enable Hermes V1 for iOS by installing pods with `RCT_HERMES_V1_ENABLED=1` environment variable. ``` RCT_HERMES_V1_ENABLED=1 bundle exec pod install ``` Keep in mind that Hermes V1 is not compatible with the precompiled React Native builds, so make sure you don’t use the `RCT_USE_PREBUILT_RNCORE` flag when installing pods. 4. To confirm if your app is running Hermes V1, execute the following code within your app or the DevTools console. This code will return the Hermes version, which should match the version specified in step 1 (250829098.0.1): ``` // expecting "250829098.0.1" in Hermes V1 HermesInternal.getRuntimeProperties()['OSS Release Version']; ``` ### Experimental - Compile out the Legacy Architecture on iOS[​](#experimental---compile-out-the-legacy-architecture-on-ios "Direct link to Experimental - Compile out the Legacy Architecture on iOS") In this release, we are adding a new flag for iOS that allows you to compile out the Legacy Architecture from the codebase. If your app is already on the New Architecture, you can try to remove the legacy architecture code by installing your pods with: ``` RCT_REMOVE_LEGACY_ARCH=1 bundle exec pod install ``` This should reduce both the build time and the size of your app. The improvements depend on how many third party libraries you are using: in our tests, using a new app without dependencies, the build time was reduced from 73.0 seconds to 58.2 seconds, and the app size went from 51.2 Mb to 48.2 Mb. info `RCT_REMOVE_LEGACY_ARCH` is not compatible with React Native precompiled binaries. If you are using precompiled binaries, you'll need to reinstall the pods and build the app from source. ### Experimental - Debug your precompiled binaries on iOS[​](#experimental---debug-your-precompiled-binaries-on-ios "Direct link to Experimental - Debug your precompiled binaries on iOS") In this release, we've implemented the ability to debug the React Native code that is shipped with a precompiled binary. This is primarily helpful to library maintainers or if you are developing a native module or a native component. To debug the binary code shipped with the React Native precompiled binary, follow these steps: ``` # From the ios folder of your project bundle exec pod cache clean --all bundle exec pod deintegrate RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS=1 bundle exec pod install open .xcworkspace ``` The magic is done by the `RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS` flag, which instructs CocoaPods to download the React Native dSYM files and expand them in the proper folder. At this point, you can put a breakpoint in your app, for example in `AppDelegate.swift`, and build and run the app from Xcode. When the application pauses, open the Xcode console and run the LLDB command: ``` # If you are running the app in the simulator add-dsym /ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64_x86_64-simulator/React.framework/dSYMs/React.framework.dSYM # If you are running the app on a physical device add-dsym /ios/Pods/React-Core-prebuilt/React.xcframework/ios-arm64/React.framework/dSYMs/React.framework.dSYM ``` Now you can step into the React Native code. ## Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") We're working hard to make React Native releases more predictable and easier to upgrade. React Native 0.83 is the first release with **no user facing breaking changes**. If you are on React Native 0.82, you should be able to upgrade your app to React Native 0.83 without any changes to your app code. To learn more about what we consider a breaking change, have a look at [this article](/docs/releases/versioning-policy.md#what-is-a-breaking-change). ## Deprecations[​](#deprecations "Direct link to Deprecations") This release ships two deprecations that are Android specific: * **Networking**: The `sendRequestInternal` method is being phased out and it is now deprecated. * **Animation**: `startOperationBatch` and `finishOperationBatch` are now deprecated. ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.83 contains over 594 commits from 56 contributors. Thanks for all your hard work! We want to send a special thank you to those community members that shipped significant contributions in this release: * [Ruslan Lesiutin](https://github.com/hoxyq), [Moti Zilberman](https://github.com/motiz88), and [Alex Hunt](https://x.com/huntie) for the React Native DevTools Performance and Network features. * [Moti Zilberman](https://github.com/motiz88) for the React Native DevTools desktop app. * [Luna Wei](https://github.com/lunaleaps) for Intersection Observers. * [Rubén Norte](https://github.com/rubennorte) for the Web Performance APIs. * [Dawid Małecki](https://github.com/coado) and [Jakub Piasecki](https://github.com/j-piasecki) for the rollout of Hermes V1. * [Ramanpreet Nara](https://github.com/rsnara) for the `RCT_REMOVE_LEGACY_ARCH` flag. * [Christian Falch](https://github.com/chrfalch) for precompiled iOS binary debugging. ## Upgrade to 0.83[​](#upgrade-to-083 "Direct link to Upgrade to 0.83") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [Upgrading docs](/docs/upgrading.md). To create a new project: ``` npx @react-native-community/cli@latest init MyProject --version latest ``` If you use Expo, React Native 0.83 will be available in SDK 55, which will be released in January 2026. ### Supported versions[​](#supported-versions "Direct link to Supported versions") 0.83 is now the latest stable version of React Native and 0.80.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) --- # React Native 0.84 - Hermes V1 by Default February 11, 2026 · 7 min read ![Alex Hunt](https://github.com/huntie.png) Alex Hunt Software Engineer @ Meta [](https://x.com/huntie "X")[](https://github.com/huntie "GitHub") ![Alan Lee](https://github.com/alanleedev.png) Alan Lee Software Engineer @ Meta [](https://github.com/alanleedev "GitHub") ![Christian Falch](https://github.com/chrfalch.png) Christian Falch Software Engineer @ Expo [](https://x.com/chrfalch "X")[](https://github.com/chrfalch "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") Today we're excited to release React Native 0.84! This release makes Hermes V1 the default JavaScript engine, bringing significant performance improvements to all React Native apps. We've also continued removing the Legacy Architecture on both iOS and Android, and are shipping precompiled iOS binaries by default. ### Highlights[​](#highlights "Direct link to Highlights") * [Hermes V1 as Default](/blog/2026/02/11/react-native-0.84.md#hermes-v1-as-default) * [Precompiled Binaries on iOS by Default](/blog/2026/02/11/react-native-0.84.md#precompiled-binaries-on-ios-by-default) * [Legacy Architecture Components Removed](/blog/2026/02/11/react-native-0.84.md#legacy-architecture-components-removed) * [Node.js 22 Minimum](/blog/2026/02/11/react-native-0.84.md#nodejs-22-minimum) ## Hermes V1 as Default[​](#hermes-v1-as-default "Direct link to Hermes V1 as Default") **Hermes V1 is now the default JavaScript engine for React Native on both iOS and Android**, following the initial experimental opt-in in React Native 0.82. Hermes V1 represents the next evolution of the Hermes engine, with significant improvements to both the compiler and VM that deliver measurably better JavaScript performance. **What This Means for Your App** * **Automatic performance gains**: All apps will use Hermes V1 by default, bringing improved execution speed and reduced memory usage. * **No migration required**: If you're already using Hermes (the default since 0.70), you'll automatically get Hermes V1. No configuration changes needed. **Opting out from Hermes V1** **Package manager override** Force the installation of the legacy `hermes-compiler` package in your `package.json`: * npm * yarn * pnpm package.json ``` "overrides": { "hermes-compiler": "0.15.0" } ``` package.json ``` "resolutions": { "hermes-compiler": "0.15.0" } ``` package.json ``` "pnpm": { "overrides": { "hermes-compiler": "0.15.0" } } ``` **iOS** When installing CocoaPods dependencies, pass the `RCT_HERMES_V1_ENABLED=0` and `RCT_USE_PREBUILT_RNCORE=0` environment variables. **Android** Add `hermesV1Enabled=false` inside the `android/gradle.properties` file, and configure the application to [build React Native from source](/contributing/how-to-build-from-source.md#update-your-project-to-build-from-source). ## Precompiled Binaries on iOS by Default[​](#precompiled-binaries-on-ios-by-default "Direct link to Precompiled Binaries on iOS by Default") React Native 0.84 now ships precompiled binaries on iOS by default. Previously introduced as an opt-in, precompiled binaries are now enabled out of the box, significantly reducing build times for iOS apps. This means you no longer need to compile React Native core from source every time you do a clean build. The precompiled `.xcframework` binaries are automatically downloaded and used during `pod install`. info If you need to build React Native from source (for example, to opt out of Hermes V1), you can disable precompiled binaries by setting `RCT_USE_PREBUILT_RNCORE=0` when installing pods. ## Legacy Architecture Components Removed[​](#legacy-architecture-components-removed "Direct link to Legacy Architecture Components Removed") Building on the work started in 0.82 (which made the New Architecture the only runtime option), React Native 0.84 continues removing Legacy Architecture code from both iOS and Android. As described in the [RFC](https://github.com/react-native-community/discussions-and-proposals/pull/929), we're removing several Legacy Architecture classes in each release. #### iOS[​](#ios "Direct link to iOS") In 0.83, we introduced the experimental `RCT_REMOVE_LEGACY_ARCH` flag to compile out Legacy Architecture code. In 0.84, this is now the default behaviour — Legacy Architecture code is no longer included in your iOS builds, reducing both build time and app size. No breakages are expected for apps already on the New Architecture — the Interop Layer code required for compatibility remains in place. **Re-enabling Legacy Architecture code on iOS** If you need to re-enable Legacy Architecture code in your iOS builds, you'll need to build from source. Install CocoaPods dependencies with the following flags: ``` RCT_USE_PREBUILT_RNCORE=0 RCT_REMOVE_LEGACY_ARCH=0 bundle exec pod install ``` #### Android[​](#android "Direct link to Android") **Removed Legacy Architecture classes** The following classes have been removed in this release: ``` com.facebook.react.LazyReactPackage com.facebook.react.bridge.CxxModuleWrapper com.facebook.react.bridge.CxxModuleWrapperBase com.facebook.react.bridge.CallbackImpl com.facebook.react.bridge.NotThreadSafeBridgeIdleDebugListener com.facebook.react.bridge.OnBatchCompleteListener com.facebook.react.bridge.ReactCxxErrorHandler com.facebook.react.bridge.ReactInstanceManagerInspectorTarget com.facebook.react.modules.debug.DidJSUpdateUiDuringFrameDetector com.facebook.react.devsupport.BridgeDevSupportManager com.facebook.react.uimanager.NativeKind com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener com.facebook.react.uimanager.layoutanimation.LayoutAnimationController com.facebook.react.uimanager.layoutanimation.LayoutAnimationListener ``` ## Node.js 22 Minimum[​](#nodejs-22-minimum "Direct link to Node.js 22 Minimum") React Native 0.84 requires **Node.js v22.11 or later**. This bump improves the availability of modern JavaScript features across the ecosystem of React Native tooling. Make sure to update your Node.js version before upgrading. We recommend using a Node version manager like [nvm](https://github.com/nvm-sh/nvm) or [fnm](https://github.com/Schniz/fnm) to manage Node versions. ## Other Changes[​](#other-changes "Direct link to Other Changes") ### React 19.2.3[​](#react-1923 "Direct link to React 19.2.3") This release syncs React 19.2.3 into React Native, including the latest fixes and improvements from the React team. ### ESLint v9 Flat Config[​](#eslint-v9-flat-config "Direct link to ESLint v9 Flat Config") React Native's ESLint config now supports [ESLint v9 Flat Config](https://eslint.org/docs/latest/use/configure/configuration-files), making it easier to adopt the latest ESLint tooling in your project. ### Platform Support[​](#platform-support "Direct link to Platform Support") * **Image formats**: React Native 0.84 includes support for additional image formats (HEIC and HEIF), making it easier to work with modern camera outputs and image libraries. * **PlatformColor**: Enhanced testing and support for `PlatformColor` in animated interpolations and output ranges. * **Keyboard events on Android**: Added `onKeyDown`/`onKeyUp` support on Android, enabling keyboard event handling for hardware keyboards and TV remotes. ### Accessibility[​](#accessibility "Direct link to Accessibility") Text components with `onPress` or `onLongPress` handlers now automatically receive `accessibilityRole="link"` for improved accessibility support, ensuring screen readers properly announce interactive text elements. On Android, significant work has been done to fix accessibility state issues with recycled views — ensuring that `isClickable` and `OnClickListener` states are properly reset when views are recycled, preventing screen readers from announcing incorrect states. ### URL API Improvements[​](#url-api-improvements "Direct link to URL API Improvements") Added missing standard properties to `URL` (`hash`, `host`, `pathname`, etc.) and methods to `URLSearchParams` (`get`, `set`, `delete`, etc.), bringing React Native's URL implementation closer to the web standard. Also fixed a `URLSearchParams` duplicate entry issue. ### Other Breaking Changes[​](#other-breaking-changes "Direct link to Other Breaking Changes") #### iOS[​](#ios-1 "Direct link to iOS") * Fixed a rare `EXC_BAD_ACCESS` crash in `ImageResponseObserverCoordinator` by wrapping observers in reference-counted pointers. This changes the object declarations in the `RCTImage` observer API, which may affect dependent libraries such as `react-native-svg`. #### Android[​](#android-1 "Direct link to Android") * Removed `BridgeDevSupportManager`. #### C++[​](#c "Direct link to C++") * `JSBigString` now implements `jsi::Buffer` directly. The `BigStringBuffer` indirection has been removed (deprecated for now). Code directly subclassing or depending on `BigStringBuffer` may need updating. #### JS[​](#js "Direct link to JS") * The legacy Perf and Network tabs have been removed from the in-app Element Inspector, as these features are now available in [React Native DevTools](/docs/react-native-devtools.md). Read the full list of breaking changes in the [CHANGELOG for 0.84](https://github.com/facebook/react-native/blob/main/CHANGELOG.md#v0840). ## Deprecations[​](#deprecations "Direct link to Deprecations") This release ships two deprecations: * **Networking:** The `XHRInterceptor` and `WebSocketInterceptor` APIs are deprecated. Developer tools should use the Chrome DevTools Protocol (CDP) `Network` domain instead. * **TurboModules**: `TurboModuleProviderFunctionType` is deprecated. ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") React Native 0.84 contains over 650 commits from 95 contributors. Thank you for all your hard work! We want to send a special thank you to those who shipped significant contributions in this release: * [Riccardo Cipolleschi](https://github.com/cipolleschi) for precompiled iOS binaries by default and removing the Legacy Architecture on iOS. * [Rob Hogan](https://github.com/robhogan) for the Node.js 22 version bump. * [Fabrizio Cucci](https://github.com/fabriziocucci) for accessibility improvements on Android. * [@pipopotamasu](https://github.com/pipopotamasu) for ESLint v9 Flat Config support. ## Upgrade to 0.84[​](#upgrade-to-084 "Direct link to Upgrade to 0.84") info 0.84 is now the latest stable version of React Native and 0.81.x moves to unsupported. For more information see [React Native's support policy](https://github.com/reactwg/react-native-releases/blob/main/docs/support.md). #### Upgrading[​](#upgrading "Direct link to Upgrading") Please use the [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) to view code changes between React Native versions for existing projects, in addition to the [Upgrading docs](/docs/upgrading.md). > **💡 New**: Try the experimental [`upgrade-react-native` AI skill for Community CLI Projects](https://skills.sh/react-native-community/skills/upgrade-react-native). #### Create a new project[​](#create-a-new-project "Direct link to Create a new project") ``` npx @react-native-community/cli@latest init MyProject --version latest ``` #### Expo[​](#expo "Direct link to Expo") For Expo projects, React Native 0.84 will be available as part of the `expo@canary` releases. The next SDK, SDK 56, will be shipped with the next stable release of React Native: 0.85. **Tags:** * [announcement](/blog/tags/announcement) * [release](/blog/tags/release) --- # React Native Comes to Meta Quest February 24, 2026 · 9 min read ![Łukasz Chludziński](https://github.com/lukasz-app.png) Łukasz Chludziński Engineering Manager @ Callstack [](https://x.com/lukasz_app "X")[](https://github.com/lukasz-app "GitHub") ![Jan Jaworski](https://github.com/jaworek.png) Jan Jaworski Software Engineer @ Callstack [](https://x.com/jaworek3211 "X")[](https://github.com/jaworek "GitHub") ![Markus Leyendecker](https://github.com/mliond.png) Markus Leyendecker Product Manager @ Meta [](https://github.com/mliond "GitHub") React Native has always focused on helping developers reuse knowledge across platforms. What started with Android and iOS has steadily expanded to Apple TV, Windows, macOS, and even the web with react-strict-dom. In 2021, the [Many Platform Vision post](/blog/2021/08/26/many-platform-vision) outlined a future where React Native could adapt to new devices and form factors without fragmenting the ecosystem. At React Conf 2025, we took another step toward that vision by [announcing official React Native support for Meta Quest devices](https://youtu.be/NiYwlvXsBKw?si=IGl4MiF6QtywVFGL\&t=1075). This post focuses on how to get started with React Native on Meta Quest, what works today, and how developers can build and ship VR apps using familiar tools and patterns. ## Highlights[​](#highlights "Direct link to Highlights") * [React Native on Meta Quest](#react-native-on-meta-quest) * [Getting started on Meta Quest](#getting-started-on-meta-quest) * [Development builds and native features](#development-builds-and-native-features) * [Platform-specific setup and differences from mobile](#platform-specific-setup-and-differences-from-mobile) * [Design and UX considerations for VR](#design-and-ux-considerations-for-vr) ## React Native on Meta Quest[​](#react-native-on-meta-quest "Direct link to React Native on Meta Quest") ![React Native app running on Meta Quest headset](/blog/assets/meta-quest-react-native.jpg) React Native apps running on Meta Quest. Meta Quest devices run Meta Horizon OS, an Android-based operating system. From a React Native perspective, this means all of the existing Android tooling, build systems, and debugging workflows work with minimal changes. For developers already building React Native apps on Android, much of existing development model carries over. This aligns with how React Native has expanded to other Android-based environments over time. Rather than introducing a new runtime or development model, Meta Quest builds on the same Android foundation and integrates with React Native's existing abstractions. This allows platform-specific capabilities to be added without fragmenting the framework or requiring a separate approach to development. ## Getting started on Meta Quest[​](#getting-started-on-meta-quest "Direct link to Getting started on Meta Quest") This section walks through the basic development workflow on Meta Quest, starting with Expo Go and moving toward development builds and platform-specific configuration. ### Step-by-step: Run an Expo app on Meta Quest[​](#step-by-step-run-an-expo-app-on-meta-quest "Direct link to Step-by-step: Run an Expo app on Meta Quest") To run an Expo app on Meta Quest, start a standard Expo project, launch the dev server, and open the app through Expo Go on the headset. Beyond a few Meta Horizon OS-specific requirements, the workflow is the same as on Android. 1. **Install Expo Go on the headset** [Expo Go is available on the Meta Horizon Store](https://www.meta.com/en-gb/experiences/expo-go/25322546364000780/) and can be installed directly on Meta Quest devices. It is used for rapid iteration during development. 2. **Create (or use) an Expo project** If you're starting fresh, create a standard Expo app. No special template is required. ``` npx create-expo-app@latest my-quest-app cd my-quest-app ``` 3. **Start the dev server** ``` npx expo start ``` 4. **Connect with Quest using Expo Go** Open Expo Go on the headset and scan the QR code displayed by the Expo CLI with the headset camera. The application launches in a new window on the device, allowing live reloading and fast iteration. 5. **Iterate as usual** Code changes are reflected immediately on the device, following the same edit-refresh cycle used on Android and iOS. ## Development builds and native features[​](#development-builds-and-native-features "Direct link to Development builds and native features") Expo Go is sufficient for early development and UI work. When access to native modules or deeper platform integration is required, development builds are used instead. These builds follow the standard Expo development build workflow and run directly on the Quest device. ## Platform-specific setup and differences from mobile[​](#platform-specific-setup-and-differences-from-mobile "Direct link to Platform-specific setup and differences from mobile") While the overall workflow remains the same, Meta Quest requires a small set of platform-specific adjustments. ### Project configuration for Meta Horizon OS[​](#project-configuration-for-meta-horizon-os "Direct link to Project configuration for Meta Horizon OS") Meta Quest applications must meet specific requirements to run correctly and to be eligible for store submission. These include platform-specific Android configuration, product flavors, and application metadata. Expo provides a plugin for Meta Horizon OS that applies these requirements at build time. Using this plugin ensures the project configuration aligns with Meta Quest expectations without manual modification of native files. Install `expo-horizon-core` and add it to `app.json` or `app.config.js`: ``` { "expo": { "plugins": [ [ "expo-horizon-core", { "horizonAppId": "your-horizon-app-id", "defaultHeight": "640dp", "defaultWidth": "1024dp", "supportedDevices": "quest2|quest3|quest3s", "disableVrHeadtracking": false, "allowBackup": false } ] ] } } ``` Also, change the orientation value: ``` { ... "orientation": "default", ... } ``` Update `package.json` with Quest-specific scripts: ``` { "scripts": { "android": "expo run:android --variant mobileDebug", "quest": "expo run:android --variant questDebug", "android:release": "expo run:android --variant mobileRelease", "quest:release": "expo run:android --variant questRelease" } } ``` ### Using React Native without Expo[​](#using-react-native-without-expo "Direct link to Using React Native without Expo") Expo provides the easiest way to get started with React Native on Meta Quest. If you prefer to build without a framework, you can also apply the required Meta Horizon OS configuration directly in your Android project. At a minimum, this includes: * Creating a Meta Quest-specific build flavor in `android/app/build.gradle` * Setting the `horizonAppId` * Defining a default panel size in the Android manifest * Declaring supported devices (for example: `quest2|quest3|quest3s`) * Removing prohibited permissions * Adjusting the minimum supported Android SDK version * Adding runtime checks such as `isHorizonDevice()` and `isHorizonBuild()` To understand the full set of changes, you can inspect the `expo-horizon-core` plugin implementation and replicate the same configuration manually. ### Android without Google Play Services[​](#android-without-google-play-services "Direct link to Android without Google Play Services") Meta Horizon OS is built on Android Open Source Project (AOSP), which provides the core Android platform without Google's proprietary services. From a development perspective, this means applications run on standard Android APIs but do not have access to Google Mobile Services such as Play Services or Play Store–specific integrations. When targeting Meta Quest, applications should be designed to avoid direct dependencies on Google services or to provide platform-specific alternatives where needed. A list of unsupported dependencies is available in the [Meta Horizon OS documentation](https://developers.meta.com/horizon/documentation/android-apps/unsupported-dependencies). ### Permissions and device capabilities[​](#permissions-and-device-capabilities "Direct link to Permissions and device capabilities") Some Android permissions and hardware assumptions common on mobile devices do not apply to VR headsets. Cellular features (e.g. SMS), certain sensors (like GPS), and [restricted permissions](https://developers.meta.com/horizon/documentation/android-apps/unsupported-permissions/) are either unavailable or prohibited. Projects must explicitly account for these differences during setup. ### Evaluating library compatibility[​](#evaluating-library-compatibility "Direct link to Evaluating library compatibility") Most React Native libraries work on Meta Quest, but compatibility depends on the assumptions a library makes about the underlying platform. In particular, libraries may rely on mobile-only hardware, touch input, or [services that are not available on Horizon OS](https://developers.meta.com/horizon/documentation/android-apps/unsupported-dependencies). As a general guideline: * Libraries that are self-contained and rely only on standard React Native and Android APIs typically work without changes. * Libraries that assume touch-only input, mobile-only hardware, or Google Mobile Services require adaptation or conditional usage. * Libraries that depend on restricted permissions or unavailable device capabilities are not supported. For some common use cases, such as [location](https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-location/README.md) and [notifications](https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-notifications/README.md), Expo provides drop-in replacements for Meta Horizon OS. Other libraries may work as-is or require platform-specific handling depending on their dependencies. ### Platform-aware code paths[​](#platform-aware-code-paths "Direct link to Platform-aware code paths") Applications targeting both Meta Quest and other platforms should guard platform-specific behavior. Meta Horizon OS provides runtime utilities to detect whether the app is running on a Quest device, allowing unsupported features to be disabled or replaced when necessary. ``` import ExpoHorizon from 'expo-horizon-core'; // Check if running on a Horizon device if (ExpoHorizon.isHorizonDevice) { console.log('Running on Meta Horizon OS!'); } // Check if this is a Horizon build if (ExpoHorizon.isHorizonBuild) { console.log('This is a Horizon build variant'); } // Access the Horizon App ID const appId = ExpoHorizon.horizonAppId; console.log('Horizon App ID:', appId ?? 'Not configured'); ``` ## Design and UX considerations for VR[​](#design-and-ux-considerations-for-vr "Direct link to Design and UX considerations for VR") Designing for a head-mounted display introduces constraints that differ from touch-based mobile devices. Interfaces are viewed at a distance, rendered in space, and interacted with using a wider range of input methods. UI elements generally require larger hit targets, increased spacing, and typography that remains readable across varying distances. These challenges are similar to those encountered on desktop, tablets, and foldable devices, where applications run in resizable windows and layouts must adapt dynamically. One of the main differences between Meta Quest and Android mobile is input. Instead of relying primarily on touch, Meta Quest applications are commonly controlled through controllers, hand tracking, and optionally mouse and keyboard. Controllers behave more like a pointer device, which introduces interaction patterns that are closer to web and desktop UIs, including hover and focus-based navigation. React Native's event system and component model can support these interaction patterns, but applications should avoid touch-only assumptions and ensure that UI elements provide clear focus states and predictable navigation when controlled through pointing devices. Together, these considerations favor responsive layouts and input-agnostic interactions. React Native's layout system and component model provide a solid foundation for building comfortable and usable VR interfaces. note For more details, check out the [official design guidelines](https://developers.meta.com/horizon/documentation/android-apps/design-requirements). ## Examples and references[​](#examples-and-references "Direct link to Examples and references") ### Reference project[​](#reference-project "Direct link to Reference project") * [Reference project with all the setup used in this article](https://github.com/callstackincubator/expo-meta-horizon-os-demo) * [Callstack Meta Horizon OS showcase app from React Conf](https://github.com/callstack/react-native-horizonos-example) ## Learn more[​](#learn-more "Direct link to Learn more") * [Official Meta Quest documentation](https://oss.callstack.com/react-native-meta-horizon-os/) * [React Native Developer's Guide to Meta Horizon OS (ebook)](https://www.callstack.com/ebooks/react-native-developers-guide-to-meta-horizon-os) * [How to Add Meta Quest Support to Your Expo Development Builds (article)](https://blog.swmansion.com/how-to-add-meta-quest-support-to-your-expo-app-68c52778b1fe) * [Bringing React Native to VR on Meta Quest (podcast)](https://www.callstack.com/podcasts/bringing-react-native-to-vr-on-meta-quest) * [React Native on Meta Quest: What We Learned About Building for VR (live stream)](https://www.youtube.com/watch?v=r-QL2EuqbdA) * [Getting started with Meta Horizon Development using Expo](https://www.youtube.com/watch?v=24G2tui0Ts8) * [Feedback channel for platform evolution](https://developers.meta.com/horizon/documentation/android-apps/bugs-requests) ## Acknowledgements[​](#acknowledgements "Direct link to Acknowledgements") Bringing React Native to new platforms takes more than code. We're grateful to everyone who contributed their time, feedback, and support along the way. **Tags:** * [announcement](/blog/tags/announcement) --- # React Native 0.85 - New Animation Backend, New Jest Preset Package April 7, 2026 · 6 min read ![Alan Lee](https://github.com/alanleedev.png) Alan Lee Software Engineer @ Meta [](https://github.com/alanleedev "GitHub") ![Calix Tang](https://github.com/CalixTang.png) Calix Tang Software Engineer @ Meta [](https://github.com/CalixTang "GitHub") ![Mathieu Acthernoene](https://github.com/zoontek.png) Mathieu Acthernoene Software Engineer @ Expo [](https://github.com/zoontek "GitHub") ![Gabriel Donadel Dall'Agnol](https://github.com/gabrieldonadel.png) Gabriel Donadel Dall'Agnol Software Engineer @ Expo [](https://x.com/donadeldev "X")[](https://github.com/gabrieldonadel "GitHub") ![Bartłomiej Błoniarz](https://github.com/bartlomiejbloniarz.png) Bartłomiej Błoniarz Software Engineer @ Software Mansion [](https://github.com/bartlomiejbloniarz "GitHub") ![Dawid Małecki](https://github.com/coado.png) Dawid Małecki Software Engineer @ Software Mansion [](https://github.com/coado "GitHub") ![Zeya Peng](https://github.com/zeyap.png) Zeya Peng Software Engineer @ Meta [](https://github.com/zeyap "GitHub") ![Samuel Susla](https://github.com/sammy-SC.png) Samuel Susla Software Engineer @ Meta [](https://x.com/SamuelSusla "X")[](https://github.com/sammy-SC "GitHub") Today we are excited to release React Native 0.85! This release includes the New Animation Backend, moves the Jest preset to a dedicated package, and includes many other improvements and fixes. ### Highlights[​](#highlights "Direct link to Highlights") * [New Animation Backend](/blog/2026/04/07/react-native-0.85.md#new-animation-backend) * [React Native DevTools Improvements](/blog/2026/04/07/react-native-0.85.md#react-native-devtools-improvements) * [Metro TLS Support](/blog/2026/04/07/react-native-0.85.md#metro-tls-support) ### Breaking Changes[​](#breaking-changes "Direct link to Breaking Changes") * [Jest Preset Moved to New Package](/blog/2026/04/07/react-native-0.85.md#jest-preset-moved-to-new-package) * [Dropped Support for EOL Node.js Versions](/blog/2026/04/07/react-native-0.85.md#dropped-support-for-eol-nodejs-versions) * [`StyleSheet.absoluteFillObject` Removed](/blog/2026/04/07/react-native-0.85.md#stylesheetabsolutefillobject-removed) * [Other Breaking Changes](/blog/2026/04/07/react-native-0.85.md#other-breaking-changes) ## Highlights[​](#highlights-1 "Direct link to Highlights") ### New Animation Backend[​](#new-animation-backend "Direct link to New Animation Backend") React Native 0.85 introduces the new Shared Animation Backend, built in collaboration with [Software Mansion](https://swmansion.com/). This is a new internal engine that powers how animations are applied under the hood for both Animated and Reanimated. By moving the main animation update logic to React Native core, Reanimated is able to land performance improvements that weren't possible before, and can ensure that the update reconciliation process is properly tested and will remain stable with future RN updates. In Animated, you can now animate layout props with native driver (the [limitation once stated here](/docs/animations.md#caveats) no longer applies). | iOS | Android | | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | ![Animation Backend demo on iOS](/blog/assets/0.85-animation-backend-ios.gif) | ![Animation Backend demo on Android](/blog/assets/0.85-animation-backend-android.gif) | You can find more examples under [`react-native/packages/rn-tester/js/examples/AnimationBackend/`](https://github.com/facebook/react-native/tree/main/packages/rn-tester/js/examples/AnimationBackend). To opt in, you can enable the experimental channel of React Native [as described in this page](/docs/releases/release-levels.md). info This experimental feature will only be available starting from React Native **0.85.1**, which will be released in the immediate future. #### How to animate layout props[​](#how-to-animate-layout-props "Direct link to How to animate layout props") With the new animation backend, you'll be able to animate Flexbox and position props with native driver in Animated. ``` import { Animated, Button, View, useAnimatedValue, } from 'react-native'; function MyComponent() { const width = useAnimatedValue(100); const toggle = () => { Animated.timing(width, { toValue: 300, duration: 500, useNativeDriver: true, }).start(); }; return (