mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
99 lines
129 KiB
HTML
99 lines
129 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<meta name="generator" content="Docusaurus v2.0.0-alpha.70">
|
||
<link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="React Native Blog RSS Feed">
|
||
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="React Native Blog Atom Feed">
|
||
<link rel="preconnect" href="https://www.google-analytics.com">
|
||
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-41298772-2","auto"),ga("send","pageview")</script>
|
||
<script async src="https://www.google-analytics.com/analytics.js"></script>
|
||
<link rel="preconnect" href="https://www.google-analytics.com">
|
||
<link rel="preconnect" href="https://www.googletagmanager.com">
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-41298772-2"></script>
|
||
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","UA-41298772-2",{})</script>
|
||
<link rel="search" type="application/opensearchdescription+xml" title="React Native" href="/opensearch.xml">
|
||
<link rel="icon" href="/img/pwa/manifest-icon-512.png">
|
||
<link rel="manifest" href="/manifest.json">
|
||
<meta name="theme-color" content="#20232a">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="#20232a">
|
||
<link rel="apple-touch-icon" href="/img/pwa/manifest-icon-512.png">
|
||
<link rel="mask-icon" href="/img/pwa/manifest-icon-512.png" color="#06bcee">
|
||
<meta name="msapplication-TileImage" href="/img/pwa/manifest-icon-512.png">
|
||
<meta name="msapplication-TileColor" content="#20232a">
|
||
<script src="https://cdn.jsdelivr.net/npm/focus-visible@5.2.0/dist/focus-visible.min.js" defer="defer"></script>
|
||
<script src="https://snack.expo.io/embed.js" defer="defer"></script><title data-react-helmet="true">Blog · React Native</title><meta data-react-helmet="true" property="og:title" content="Blog · React Native"><meta data-react-helmet="true" name="description" content="Blog"><meta data-react-helmet="true" property="og:description" content="Blog"><meta data-react-helmet="true" name="twitter:image:alt" content="Image for Blog · React Native"><meta data-react-helmet="true" name="docsearch:language" content="en"><meta data-react-helmet="true" name="docsearch:docusaurus_tag" content="default"><meta data-react-helmet="true" property="og:image" content="https://reactnative.dev/img/logo-og.png"><meta data-react-helmet="true" name="twitter:card" content="summary"><meta data-react-helmet="true" name="twitter:image" content="https://reactnative.dev/img/logo-og.png"><link data-react-helmet="true" rel="shortcut icon" href="/img/favicon.ico"><link data-react-helmet="true" rel="preconnect" href="https://BH4D9OD16A-dsn.algolia.net" crossorigin="anonymous"><link rel="stylesheet" href="/styles.f56da522.css">
|
||
<link rel="stylesheet" href="/main.3de2b5ef.css">
|
||
<link rel="preload" href="/styles.9d29dd5a.js" as="script">
|
||
<link rel="preload" href="/runtime~main.b00a5634.js" as="script">
|
||
<link rel="preload" href="/main.4103a08e.js" as="script">
|
||
<link rel="preload" href="/1.7a6193e2.js" as="script">
|
||
<link rel="preload" href="/2.9b40dc51.js" as="script">
|
||
<link rel="preload" href="/3.5038d2af.js" as="script">
|
||
<link rel="preload" href="/01a85c17.ba6e50e3.js" as="script">
|
||
<link rel="preload" href="/18b93cb3.0f191383.js" as="script">
|
||
<link rel="preload" href="/1be78505.c251d713.js" as="script">
|
||
<link rel="preload" href="/1f391b9e.08b65592.js" as="script">
|
||
<link rel="preload" href="/5fc994c2.1a243557.js" as="script">
|
||
<link rel="preload" href="/6875c492.c3f7c047.js" as="script">
|
||
<link rel="preload" href="/a6aa9e1f.d957d979.js" as="script">
|
||
<link rel="preload" href="/c4f5d8e4.03c60be1.js" as="script">
|
||
<link rel="preload" href="/ccc49370.337c1f21.js" as="script">
|
||
<link rel="preload" href="/1093.b6be3a0d.js" as="script">
|
||
<link rel="preload" href="/e4eeaf16.f80aca8e.js" as="script">
|
||
<link rel="preload" href="/0305cd95.8ed2a7dd.js" as="script">
|
||
<link rel="preload" href="/26b4f16a.91e0cb2b.js" as="script">
|
||
<link rel="preload" href="/1b94994a.e767a380.js" as="script">
|
||
<link rel="preload" href="/f80d3992.0e9cb87c.js" as="script">
|
||
<link rel="preload" href="/8415f7e8.0de00eb5.js" as="script">
|
||
<link rel="preload" href="/5860a2aa.4db4074a.js" as="script">
|
||
<link rel="preload" href="/3e16fe84.371a673d.js" as="script">
|
||
<link rel="preload" href="/10a433e1.3d997d5a.js" as="script">
|
||
<link rel="preload" href="/000e4255.fb3f1146.js" as="script">
|
||
<link rel="preload" href="/474240c1.4181d117.js" as="script">
|
||
<link rel="preload" href="/b2b675dd.99615fa5.js" as="script">
|
||
</head>
|
||
<body>
|
||
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
|
||
<nav aria-label="Skip navigation links"><button type="button" tabindex="0" class="skipToContent_3aLp">Skip to main content</button></nav><nav class="navbar navbar--fixed-top navbar--dark"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg aria-label="Menu" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></div><a class="navbar__brand" href="/"><img src="/img/header_logo.svg" alt="React Native" class="themedImage_phiS themedImage--light_VJaY navbar__logo"><img src="/img/header_logo.svg" alt="React Native" class="themedImage_phiS themedImage--dark_1NF3 navbar__logo"><strong class="navbar__title">React Native</strong></a><div class="navbar__item dropdown dropdown--hoverable dropdown--left"><a class="navbar__item navbar__link" href="/docs/getting-started">0.64</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/getting-started">Next</a></li><li><a class="dropdown__link" href="/docs/getting-started">0.64</a></li><li><a class="dropdown__link" href="/docs/0.63/getting-started">0.63</a></li><li><a class="dropdown__link" href="/docs/0.62/getting-started">0.62</a></li><li><a class="dropdown__link" href="/docs/0.61/getting-started">0.61</a></li><li><a class="dropdown__link" href="/docs/0.60/getting-started">0.60</a></li><li><a class="dropdown__link" href="/versions">All versions</a></li></ul></div></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/docs/getting-started">Docs</a><a class="navbar__item navbar__link" href="/docs/components-and-apis">Components</a><a class="navbar__item navbar__link" href="/docs/accessibilityinfo">API</a><a class="navbar__item navbar__link" href="/help">Community</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a><a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link navbar-github-link" aria-label="GitHub repository"></a><div class="react-toggle react-toggle--disabled displayOnlyInLargeViewport_Bh6k"><div class="react-toggle-track"><div class="react-toggle-track-check"><span class="toggle_1UDy">🌜</span></div><div class="react-toggle-track-x"><span class="toggle_1UDy">🌞</span></div></div><div class="react-toggle-thumb"></div><input type="checkbox" disabled="" aria-label="Dark mode toggle" class="react-toggle-screenreader-only"></div><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span></button></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div><div class="navbar-sidebar"><div class="navbar-sidebar__brand"><a class="navbar__brand" href="/"><img src="/img/header_logo.svg" alt="React Native" class="themedImage_phiS themedImage--light_VJaY navbar__logo"><img src="/img/header_logo.svg" alt="React Native" class="themedImage_phiS themedImage--dark_1NF3 navbar__logo"><strong class="navbar__title">React Native</strong></a></div><div class="navbar-sidebar__items"><div class="menu"><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/getting-started">Docs</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/components-and-apis">Components</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/accessibilityinfo">API</a></li><li class="menu__list-item"><a class="menu__link" href="/help">Community</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link navbar__link--active" href="/blog">Blog</a></li><li class="menu__list-item menu__list-item--collapsed"><a role="button" class="menu__link menu__link--sublist">Versions</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/next/getting-started">Next</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/getting-started">0.64</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/0.63/getting-started">0.63</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/0.62/getting-started">0.62</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/0.61/getting-started">0.61</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/0.60/getting-started">0.60</a></li><li class="menu__list-item"><a class="menu__link" href="/versions">All versions</a></li></ul></li><li class="menu__list-item"><a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer" class="menu__link navbar-github-link" aria-label="GitHub repository"></a></li></ul></div></div></div></nav><div class="main-wrapper blog-wrapper"><div class="container margin-vert--lg"><div class="row"><div class="col col--2"><div class="sidebar_1wv2"><h3 class="sidebarItemTitle_3lOc">All Blog Posts</h3><ul class="sidebarItemList_2WIo"><h4 class="sidebarItemTitle_3lOc">2021</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2021/03/11/version-0.64">Announcing React Native 0.64 with Hermes on iOS</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2021/03/08/GAAD-React-Native-Accessibility">The GAAD Pledge - Improving React Native Accessibility</a></li><h4 class="sidebarItemTitle_3lOc">2020</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2020/07/23/docs-update">React Native Documentation Update</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2020/07/17/react-native-principles">React Native Team Principles</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2020/07/06/version-0.63">Announcing React Native 0.63 with LogBox</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2020/03/26/version-0.62">Announcing React Native 0.62 with Flipper</a></li><h4 class="sidebarItemTitle_3lOc">2019</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/11/18/react-native-doctor">Meet Doctor, a new React Native command</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/09/18/version-0.61">Announcing React Native 0.61 with Fast Refresh</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/07/17/hermes">Meet Hermes, a new JavaScript Engine optimized for React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/07/03/version-60">Announcing React Native 0.60</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/06/12/react-native-open-source-update">React Native Open Source Update June 2019</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/05/01/react-native-at-f8-and-podcast">React Native at F8 and Open Source Podcast</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/03/12/releasing-react-native-059">Releasing React Native 0.59</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/03/01/react-native-open-source-update">React Native Open Source Update March 2019</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2019/01/07/state-of-react-native-community">The State of the React Native Community in 2018</a></li><h4 class="sidebarItemTitle_3lOc">2018</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/11/01/oss-roadmap">Open Source Roadmap</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/08/27/wkwebview">Introducing new iOS WebViews</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/08/13/react-native-accessibility-updates">Accessibility API Updates</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/07/04/releasing-react-native-056">Releasing 0.56</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/06/14/state-of-react-native-2018">State of React Native 2018</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/05/07/using-typescript-with-react-native">Using TypeScript with React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/04/09/build-com-app">Built with React Native - The Build.com app</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/03/22/building-input-accessory-view-for-react-native">Building <InputAccessoryView> For React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/03/05/AWS-app-sync">Using AWS with React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/01/18/implementing-twitters-app-loading-animation-in-react-native">Implementing Twitter’s App Loading Animation in React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2018/01/09/react-native-monthly-6">React Native Monthly #6</a></li><h4 class="sidebarItemTitle_3lOc">2017</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/11/06/react-native-monthly-5">React Native Monthly #5</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/09/21/react-native-monthly-4">React Native Monthly #4</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/08/30/react-native-monthly-3">React Native Monthly #3</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/08/07/react-native-performance-in-marketplace">React Native Performance in Marketplace</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/07/28/react-native-monthly-2">React Native Monthly #2</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/06/21/react-native-monthly-1">React Native Monthly #1</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/03/13/idx-the-existential-function">idx: The Existential Function</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/03/13/better-list-views">Better List Views in React Native</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/03/13/introducing-create-react-native-app">Introducing Create React Native App</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/02/14/using-native-driver-for-animated">Using Native Driver for Animated</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2017/01/07/monthly-release-cadence">A Monthly Release Cadence: Releasing December and January RC</a></li><h4 class="sidebarItemTitle_3lOc">2016</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/12/05/easier-upgrades">Easier Upgrades Thanks to Git</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/11/08/introducing-button-yarn-and-a-public-roadmap">Introducing Button, Faster Installs with Yarn, and a Public Roadmap</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/10/25/0.36-headless-js-the-keyboard-api-and-more">0.36: Headless JS, the Keyboard API, & more</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/09/08/exponent-talks-unraveling-navigation">Expo Talks: Adam on Unraveling Navigation</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/08/19/right-to-left-support-for-react-native-apps">Right-to-Left Layout Support For React Native Apps</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/08/12/react-native-meetup-san-francisco">San Francisco Meetup Recap</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/07/06/toward-better-documentation">Toward Better Documentation</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/04/13/react-native-a-year-in-review">React Native: A year in review</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/03/28/dive-into-react-native-performance">Dive into React Native Performance</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2016/03/24/introducing-hot-reloading">Introducing Hot Reloading</a></li><h4 class="sidebarItemTitle_3lOc">2015</h4><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2015/11/23/making-react-native-apps-accessible">Making React Native apps accessible</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2015/09/14/react-native-for-android">React Native for Android: How we built the first cross-platform React Native app</a></li><li class="sidebarItem_iPNH"><a class="sidebarItemLink_2E17" href="/blog/2015/03/26/react-native-bringing-modern-web-techniques-to-mobile">React Native: Bringing modern web techniques to mobile</a></li></ul></div></div><main class="col col--8"><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2021/03/11/version-0.64">Announcing React Native 0.64 with Hermes on iOS</a></h2><div class="margin-vert--md"><time datetime="2021-03-11T00:00:00.000Z" class="blogPostDate_2q4-">March 11, 2021 · 4 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/grabbou" target="_blank" rel="noreferrer noopener"><img src="https://avatars0.githubusercontent.com/u/2464966?s=460&v=4" alt="Mike Grabowski"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/grabbou" target="_blank" rel="noreferrer noopener">Mike Grabowski</a></h4><small class="avatar__subtitle">CTO and Co-Founder at Callstack</small></div></div></header><section class="markdown"><p>Today we’re releasing React Native 0.64 that ships with support for Hermes on iOS.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="hermes-opt-in-on-ios"></a>Hermes opt-in on iOS<a class="hash-link" href="#hermes-opt-in-on-ios" title="Direct link to heading">#</a></h2><p><a href="https://hermesengine.dev" target="_blank" rel="noopener noreferrer">Hermes</a> is an open source JavaScript engine optimized for running React Native. It improves performance by decreasing memory utilization, reducing download size and decreasing the time it takes for the app to become usable or “time to interactive” (TTI).</p><p>With this release, we are happy to announce that you can now use Hermes to build on iOS as well. To enable Hermes on iOS, set <code>hermes_enabled</code> to <code>true</code> in your <code>Podfile</code> and run <code>pod install</code>.</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-ruby codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain">use_react_native!(</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> :path => config[:reactNativePath],</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> # to enable hermes on iOS, change `false` to `true` and then install pods</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> :hermes_enabled => true</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain">)</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p>Please keep in mind that Hermes support on iOS is still early stage. We are keeping it as an opt-in as we are running further benchmarking. We encourage you to try it on your own applications and let us know how it is working out for you!</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="inline-requires-enabled-by-default"></a>Inline Requires enabled by default<a class="hash-link" href="#inline-requires-enabled-by-default" title="Direct link to heading">#</a></h2><p>Inline Requires is a Metro configuration option that improves startup time by delaying execution of JavaScript modules until they are used, instead of at startup.</p><p>This feature has existed and been recommended for a few years as an opt-in configuration option, listed in the <a href="/docs/performance">Performance section of our documentation</a>. We are now enabling this option by default for new applications to help people have fast React Native applications without extra configuration.</p><p>Inline Requires is a Babel transform that takes module imports and converts them to be inline. As an example, Inline Requires transforms this module import call from being at the top of the file to where it is used.</p><p><strong>Before:</strong></p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> MyFunction </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'my-module'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#79b6f2">MyComponent</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=></span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> result </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">MyFunction</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">result</span><span class="token punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p><strong>After:</strong></p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#79b6f2">MyComponent</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=></span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> result </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">require</span><span class="token punctuation" style="color:#657b83">(</span><span class="token string" style="color:#8dc891">'my-module'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">.</span><span class="token function" style="color:#79b6f2">MyFunction</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">result</span><span class="token punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p>More information about Inline Requires is available in the <a href="/docs/ram-bundles-inline-requires#inline-requires">Performance documentation</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="view-hermes-traces-with-chrome"></a>View Hermes traces with Chrome<a class="hash-link" href="#view-hermes-traces-with-chrome" title="Direct link to heading">#</a></h2><p>Over the last year Facebook has sponsored the <a href="https://fellowship.mlh.io/" target="_blank" rel="noopener noreferrer">Major League Hacking fellowship</a>, supporting contributions to React Native. <a href="https://twitter.com/jessie_anh_ng" target="_blank" rel="noopener noreferrer">Jessie Nguyen</a> and <a href="https://twitter.com/saphalinsaan" target="_blank" rel="noopener noreferrer">Saphal Patro</a> added the ability to use the Performance tab on Chrome DevTools to visualize the execution of your application when it is using Hermes.</p><p>For more information, check out the <a href="/docs/profile-hermes#record-a-hermes-sampling-profile">new documentation page</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="hermes-with-proxy-support"></a>Hermes with Proxy Support<a class="hash-link" href="#hermes-with-proxy-support" title="Direct link to heading">#</a></h2><p>We have added Proxy support to Hermes, enabling compatibility with popular community projects like react-native-firebase and mobx. If you have been using these packages you can now migrate to Hermes for your project.</p><p>We plan to make Hermes the default JavaScript engine for Android in a coming release so we are working to resolve the remaining issues people have when using Hermes. Please open an issue on the <a href="https://github.com/facebook/hermes" target="_blank" rel="noopener noreferrer">Hermes GitHub repo</a> if there are remaining issues holding back your app from adopting Hermes.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="react-17"></a>React 17<a class="hash-link" href="#react-17" title="Direct link to heading">#</a></h2><p>React 17 does not include new developer-facing features or major breaking changes. For React Native applications, the main change is a <a href="https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html" target="_blank" rel="noopener noreferrer">new JSX transform</a> enabling files to no longer need to import React to be able to use JSX.</p><p>More information about React 17 is available <a href="https://reactjs.org/blog/2020/10/20/react-v17.html" target="_blank" rel="noopener noreferrer">on the React blog</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="major-dependency-version-changes"></a>Major Dependency Version Changes<a class="hash-link" href="#major-dependency-version-changes" title="Direct link to heading">#</a></h2><ul><li>Dropped Android API levels 16-20. The Facebook app consistently drops support for Android versions with sufficiently low usage. As the Facebook app no longer supports these versions and is React Native’s main testing surface, React Native is dropping support as well.</li><li>Xcode 12 and CocoaPods 1.10 are required</li><li>Minimum Node support bumped from 10 to Node 12</li><li>Flipper bumped to 0.75.1</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="thanks"></a>Thanks<a class="hash-link" href="#thanks" title="Direct link to heading">#</a></h2><p>Thank you to the hundreds of contributors that helped make 0.64 possible! The <a href="https://github.com/react-native-community/releases/blob/master/CHANGELOG.md#v0640" target="_blank" rel="noopener noreferrer">0.64 changelog</a> includes all of the changes included in this release.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a><a class="margin-horiz--sm" href="/blog/tags/release">release</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2021/03/08/GAAD-React-Native-Accessibility">The GAAD Pledge - Improving React Native Accessibility</a></h2><div class="margin-vert--md"><time datetime="2021-03-08T00:00:00.000Z" class="blogPostDate_2q4-">March 8, 2021 · 2 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/alexmarlette" target="_blank" rel="noreferrer noopener"><img src="https://avatars.githubusercontent.com/u/10052470?s=460&u=7f2304cb929d1de703856717af86324c66728f3a&v=4" alt="Alexandra Marlette"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/alexmarlette" target="_blank" rel="noreferrer noopener">Alexandra Marlette</a></h4><small class="avatar__subtitle">GAAD Pledge Open Source Accessibility Community Manager for React Native</small></div></div></header><section class="markdown"><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="hello-react-native-community"></a>Hello React Native Community,<a class="hash-link" href="#hello-react-native-community" title="Direct link to heading">#</a></h2><p>In May 2020 Facebook was the first company to take the <a href="https://diamond.la/GAADPledge/" target="_blank" rel="noopener noreferrer">GAAD pledge</a>, by doing so they committed to making accessibility a core part of the React Native open source project. Since May, Facebook has spent that time thoughtfully reviewing and documenting accessibility gaps within React Native. So far the gap analysis has surfaced 90 issues, all of which have been translated to <a href="https://github.com/facebook/react-native/projects/15" target="_blank" rel="noopener noreferrer">Github issues</a>.</p><p>Overall, we found that React Native APIs provide strong support for accessibility. However, we also found many core components do not yet fully utilize platform accessibility APIs and support is missing for some platform specific features.</p><p>The enthusiasm and diversity of contributors have always played a critical role in the development of React Native and these gaps in accessibility are great opportunities for current and new contributors. If you have been interested in contributing to React Native, we encourage you to join us in making React Native more accessible.</p><p>To recognize contributors for their effort, when an accessibility issue is closed and attached to a pull request, contributors will get a shout out on Twitter from our community manager. Contributors whose pull requests are accepted into the codebase will be highlighted in our monthly issues update on the React Native blog.</p><p>Please join us in making React Native more accessible for everyone.</p><h3><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="how-you-can-help"></a>How you can help:<a class="hash-link" href="#how-you-can-help" title="Direct link to heading">#</a></h3><ul><li><p>New contributors should read the <a href="https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contribution guide</a> and browse the list of 46 <a href="https://github.com/facebook/react-native/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+first+issue%22+label%3AAccessibility" target="_blank" rel="noopener noreferrer">good first issues</a> in the React Native Github.</p></li><li><p>Contributors interested in issues requiring a bit more effort should visit <a href="https://github.com/facebook/react-native/projects/15" target="_blank" rel="noopener noreferrer">the project page for Improved React Native Accessibility</a> to see the Github issues that need their knowledge of React Native.</p></li><li><p>Technical writers interested in updating React Native's documentation to reflect the accessibility gaps being closed should visit the <a href="https://github.com/facebook/react-native-website#-overview" target="_blank" rel="noopener noreferrer">React Native Docs</a>.</p></li><li><p>Share this initiative with anyone who may be able to help!</p></li><li><p>Follow the GAAD Pledge Open Source Accessibility Community Manager for React Native on <a href="https://twitter.com/alexmarlette" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://www.facebook.com/React-Native-Open-Source-Accessibility-Community-Manager-102732258549941" target="_blank" rel="noopener noreferrer">Facebook</a> to keep up to date on progress.</p></li></ul></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2020/07/23/docs-update">React Native Documentation Update</a></h2><div class="margin-vert--md"><time datetime="2020-07-23T00:00:00.000Z" class="blogPostDate_2q4-">July 23, 2020 · 3 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/rachelnabors" target="_blank" rel="noreferrer noopener"><img src="https://avatars0.githubusercontent.com/u/236306?s=460&v=4" alt="Rachel Nabors"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/rachelnabors" target="_blank" rel="noreferrer noopener">Rachel Nabors</a></h4><small class="avatar__subtitle">Documentation Engineer at Facebook</small></div></div></header><section class="markdown"><p>Last year we conducted user interviews and sent out <a href="https://www.surveymonkey.co.uk/r/DDZWQDJ" target="_blank" rel="noopener noreferrer">a survey</a> to learn more about how and when people use the React Native docs. With the data and guidance gleaned from 24 interviews and over 3000 survey responses, we've been able to work to improve React Native's documentation, and we're excited to share that progress today:</p><ul><li><strong><a href="https://reactnative.dev/docs/getting-started" target="_blank" rel="noopener noreferrer">New Getting Started guides</a></strong> We launched new Getting Started with docs to <a href="https://reactnative.dev/docs/intro-react-native-components" target="_blank" rel="noopener noreferrer">explain what Native Components</a> are to people with no mobile development background. We also included a <a href="https://reactnative.dev/docs/intro-react" target="_blank" rel="noopener noreferrer">refresher/introduction to React</a> to help folks getting started with React for the first time!</li><li><strong><a href="https://reactnative.dev/docs/testing-overview" target="_blank" rel="noopener noreferrer">New Testing guide</a></strong> We worked with Vojtech Novak to create a new illustrated testing guide that introduces app developers to different kinds of testing strategies and how they work in a React Native workflow.</li><li><strong><a href="https://reactnative.dev/docs/security" target="_blank" rel="noopener noreferrer">New Security guide</a></strong> We worked with Kadi Kraman to create a new illustrated security guide that explains the basics of security in a React Native world and puts forth best in class solutions.</li><li><strong>More illustrations</strong> We've added fancy new illustrations, including the new <a href="https://reactnative.dev/docs/pressable" target="_blank" rel="noopener noreferrer"><code>Pressable</code></a> and <a href="https://reactnative.dev/docs/intro-react-native-components" target="_blank" rel="noopener noreferrer">introduction to React Native components</a> docs</li><li><strong><a href="https://reactnative.dev" target="_blank" rel="noopener noreferrer">https://reactnative.dev</a></strong> After 5 years we finally moved to our own domain! <strong>reactnative.dev</strong> is easier to autocomplete from your browser bar and is easier to type out than our previous <strong>github.io</strong> address!</li><li><strong>Site design and architecture improvements</strong> We've updated the design and site architecture to surface and categorize more of our guides and make content in the API reference more readable. Kudos especially to <a href="https://github.com/Simek" target="_blank" rel="noopener noreferrer">Bartosz Kaszubowski</a> whose attention to detail and collaboration has made many of these changes possible quickly!</li><li><strong>Updated Core Component and API docs</strong> We held a <a href="https://github.com/facebook/react-native-website/issues/1579" target="_blank" rel="noopener noreferrer">documentation drive</a> to update reference docs! Thanks to these and other participants we were able to fully update the docs and add Snack examples to all of them in time for 0.62: <a href="https://twitter.com/martadabrowka" target="_blank" rel="noopener noreferrer">Marta Dabrowka</a>, <a href="https://twitter.com/nnajiabraham" target="_blank" rel="noopener noreferrer">Abraham Nnaji</a>, <a href="https://twitter.com/ahmdtalat" target="_blank" rel="noopener noreferrer">Ahmed Talaat El-Hager</a>, <a href="https://twitter.com/mohamedsgap" target="_blank" rel="noopener noreferrer">Mohamed Abdel Nasser Abdou</a>, <a href="https://twitter.com/danilobrinu" target="_blank" rel="noopener noreferrer">Danilo Britto</a>, <a href="https://twitter.com/mitulsavani" target="_blank" rel="noopener noreferrer">Mitul Savani</a>, <a href="https://twitter.com/kaiodduarte" target="_blank" rel="noopener noreferrer">Kaio Duarte</a>, <a href="https://twitter.com/espipj" target="_blank" rel="noopener noreferrer">Pablo Espinosa</a>, <a href="https://twitter.com/natural_clar" target="_blank" rel="noopener noreferrer">Jesse Katsumata</a>, <a href="https://twitter.com/gedeagas" target="_blank" rel="noopener noreferrer">I Gede Agastya Darma Laksana</a>, <a href="https://twitter.com/bruno_kiafuka" target="_blank" rel="noopener noreferrer">Sebastião Bruno Kiafuka Fernando</a>, <a href="https://twitter.com/Darking360" target="_blank" rel="noopener noreferrer">Miguel Bolivar</a>, <a href="https://twitter.com/dani_akash_" target="_blank" rel="noopener noreferrer">Dani Akash</a>, <a href="https://twitter.com/_eucelso" target="_blank" rel="noopener noreferrer">Luiz Celso de Faria Alves</a>, and <a href="https://twitter.com/simek" target="_blank" rel="noopener noreferrer">Bartosz Kaszubowski</a>. With their contributions, these are the best and most up to date React Native docs yet!</li><li><strong>Keep those PRs coming!</strong> We are able to consistently keep our open PRs under 10 per week! Thank you for sending them!</li></ul><p>Thank you so much to everyone who participated in the interviews, the survey, and our documentation efforts! Your collaboration makes this possible.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a></div><div class="col text--right"><a aria-label="Read more about React Native Documentation Update" href="/blog/2020/07/23/docs-update"><strong>Read More</strong></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2020/07/17/react-native-principles">React Native Team Principles</a></h2><div class="margin-vert--md"><time datetime="2020-07-17T00:00:00.000Z" class="blogPostDate_2q4-">July 17, 2020 · 5 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/Eli_White" target="_blank" rel="noreferrer noopener"><img src="https://avatars2.githubusercontent.com/u/249164?s=460&v=4" alt="Eli White"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/Eli_White" target="_blank" rel="noreferrer noopener">Eli White</a></h4><small class="avatar__subtitle">Engineering Manager on React Native</small></div></div></header><section class="markdown"><p>The React Native team at Facebook is guided by principles that help determine how we prioritize our work on React Native. These principles represent our team specifically and do not necessarily represent every stakeholder in the React Native community. We are sharing these principles here to be more transparent about what drives us, how we make decisions, and how we focus our efforts.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="native-experience"></a><strong>Native Experience</strong><a class="hash-link" href="#native-experience" title="Direct link to heading">#</a></h2><p>Our top priority for React Native is to <strong>match the expectations people have for each platform</strong>. This is why React Native renders to platform primitives. We value native look-and-feel over cross-platform consistency.</p><p>For example, the TextInput in React Native renders to a UITextField on iOS. This ensures that integration with password managers and keyboard controls work out of the box. By using platform primitives, React Native apps are also able to stay up-to-date with design and behavior changes from new releases of Android and iOS.</p><p>In order to match the look-and-feel of native apps, we must also match their performance. This is where we focus our most ambitious efforts. For example, Facebook created Hermes, <a href="https://facebook.github.io/react-native/blog/2019/07/17/hermes" target="_blank" rel="noopener noreferrer">a new JavaScript Engine built from scratch for React Native on Android</a>. Hermes significantly improves the start time of React Native apps. We are also working on major architectural changes that optimize the threading model and make React Native easier to interoperate with native code.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="massive-scale"></a>Massive Scale<a class="hash-link" href="#massive-scale" title="Direct link to heading">#</a></h2><p>Hundreds of screens in the Facebook app are implemented with React Native. The Facebook app is used by billions of people on a huge range of devices. <strong>This is why</strong> <strong>we invest in the most challenging problems at scale.</strong></p><p>Deploying React Native in our apps lets us identify problems that we wouldn’t see at a smaller scale. For example, Facebook focuses on improving performance across a broad spectrum of devices from the newest iPhone to many older generations of Android devices. This focus informs our architecture projects such as Hermes, Fabric, and TurboModules.</p><p>We have proven that React Native can scale to massive organizations too. When hundreds of developers are working on the same app, gradual adoption is a must. This is why we made sure that React Native can be adopted one screen at a time. Soon, we will be taking this one step further and enable migrating individual native views of an existing native screen to React Native.</p><p>A focus on massive scale means there are many things our team isn’t currently working on. For example, our team doesn’t drive the adoption of React Native in the industry. We also do not actively build solutions for problems that we don’t see at scale. We are proud that we have <a href="https://github.com/facebook/react-native/blob/master/ECOSYSTEM.md" target="_blank" rel="noopener noreferrer">many partners and core contributors</a> that are able to focus on those important areas for the community.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="developer-velocity"></a>Developer Velocity<a class="hash-link" href="#developer-velocity" title="Direct link to heading">#</a></h2><p>Great user experiences are created iteratively. <strong>It should only take a few seconds to seeing the result of code changes</strong> in a running app. React Native's architecture enables it to provide near-instant feedback during development.</p><p>We often hear from teams that adopting React Native significantly improved their development velocity. These teams find that the instant feedback during development makes it much easier to try different ideas and add extra polish when they don’t have to interrupt their coding session for every little change. When we make changes to React Native, we make sure to preserve this quality of the developer experience.</p><p>Instant feedback is not the only way that React Native improves developer velocity. Teams can easily leverage the fast-growing ecosystem of high quality open source packages. Teams can also share business logic between Android, iOS, and the web. This helps them ship updates faster and reduce organizational silos between platform teams.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="every-platform"></a>Every Platform<a class="hash-link" href="#every-platform" title="Direct link to heading">#</a></h2><p>When we introduced React Native in 2014, we presented it with our motto “Learn once, write anywhere” — and we mean <em>anywhere</em>. <strong>Developers should be able to reach as many people as possible without being limited by device model or operating system.</strong></p><p>React Native targets very different platforms including mobile, desktop, web, TV, VR, game consoles, and more. We want to enable rich experiences on each platform instead of requiring developers to build for the lowest common denominator. To accomplish this, we focus on supporting the unique features of each platform. This ranges from varying input mechanisms (e.g. touch, pen, mouse) to fundamentally different consumption experiences like 3D environments in VR.</p><p>This principle informed our decision to implement React Native’s new core architecture in cross-platform C++ to promote parity across platforms. We are also refining the public interface targeted at other platform maintainers like Microsoft with Windows and macOS. We strive to enable any platforms to support React Native.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="declarative-ui"></a>Declarative UI<a class="hash-link" href="#declarative-ui" title="Direct link to heading">#</a></h2><p>We don’t believe in deploying the exact same user interface on every platform, we believe in <strong>exposing each platform’s unique capabilities with the same declarative programming model</strong>. Our declarative programming model is React.</p><p>In our experience, the unidirectional data flow popularized by React makes applications easier to understand. We prefer to express a screen as a composition of declarative components rather than imperatively managed views. React’s success on the web and the direction of the new native Android and iOS frameworks show that the industry has also embraced declarative UI.</p><p>React popularized declarative user interfaces. However, there remain many unsolved problems that React is uniquely positioned to solve. React Native will continue to build on top of the innovations of React and remain at the forefront of the declarative user interface movement.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2020/07/06/version-0.63">Announcing React Native 0.63 with LogBox</a></h2><div class="margin-vert--md"><time datetime="2020-07-06T00:00:00.000Z" class="blogPostDate_2q4-">July 6, 2020 · 8 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/grabbou" target="_blank" rel="noreferrer noopener"><img src="https://avatars0.githubusercontent.com/u/2464966?s=460&v=4" alt="Mike Grabowski"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/grabbou" target="_blank" rel="noreferrer noopener">Mike Grabowski</a></h4><small class="avatar__subtitle">CTO and Co-Founder at Callstack</small></div></div></header><section class="markdown"><p>Today we’re releasing React Native 0.63 that ships with LogBox turned on by default.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="logbox"></a>LogBox<a class="hash-link" href="#logbox" title="Direct link to heading">#</a></h2><p>We’ve heard frequent feedback from the community that errors and warnings are difficult to debug in React Native. To address these issues we took a look at the entire error, warning, and log system in React Native and redesigned it <a href="https://www.youtube.com/watch?v=Y8brBH5O-bQ&feature=youtu.be" target="_blank" rel="noopener noreferrer">from the ground up</a>.</p><p><img alt="Screenshot of LogBox" src="/assets/images/0.63-logbox-a209851328e548bf0810bdee050fb960.png"></p><p>LogBox is a completely redesigned redbox, yellowbox, and logging experience in React Native. In 0.62 we introduced LogBox as an opt-in. In this release, we’re launching LogBox as the default experience in all of React Native.</p><p>LogBox addresses complaints that errors and warnings were too verbose, poorly formatted, or unactionable by focusing on three primary goals:</p><ul><li><strong>Concise</strong>: Logs should provide the minimum amount of information necessary to debug an issue.</li><li><strong>Formatted</strong>: Logs should be formatted so that you can quickly find the information you need.</li><li><strong>Actionable</strong>: Logs should be actionable, so you can fix the issue and move on.</li></ul><p>To achieve these goals, LogBox includes:</p><ul><li><strong>Log notifications</strong>: We’ve redesigned the warning notifications and added support for errors so that all console.warn and console.log messages show up as notifications instead of covering your app.</li><li><strong>Code Frames</strong>: Every error and warning now includes a code frame that shows the source code of the log right inside the app, allowing you to quickly identify the source of your issue.</li><li><strong>Component Stacks</strong>: All component stacks are now stripped from error messages and put into their own section with the top three frames visible. This gives you a single, consistent space to expect stack frame information that doesn’t clutter the log message.</li><li><strong>Stack Frame Collapsing</strong>: By default we now collapse call stack frames not related to your application’s code so you can quickly see the issue in your app and not sift through React Native internals.</li><li><strong>Syntax Error Formatting</strong>: We’ve improved the formatting for syntax errors and added codeframes with syntax highlighting so you can see the source of the error, fix it, and continue coding without React Native getting in your way.</li></ul><p>We’ve wrapped all of these features into an improved visual design that’s consistent between errors and warnings and allows paginating through all logs in one enjoyable UI.</p><p>With this change we’re also deprecating YellowBox in favor of LogBox APIs:</p><ul><li><code>LogBox.ignoreLogs()</code>: This function replaces <code>YellowBox.ignoreLogs([])</code> as a way to silence any logs that match the given strings or regexes.</li><li><code>LogBox.ignoreAllLogs()</code>: This function replaces <code>console.disableYellowBox</code> as a way to turn off error or warning notifications. Note: this only disables notifications, uncaught errors will still open a full screen LogBox.</li></ul><p>In 0.63, we will warn when using these deprecated modules or methods. Please update your call sites off of these APIs before they are removed in 0.64.</p><p>For more information on LogBox and debugging react native, see the docs <a href="https://reactnative.dev/docs/debugging#in-app-errors-and-warnings" target="_blank" rel="noopener noreferrer">here</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="pressable"></a>Pressable<a class="hash-link" href="#pressable" title="Direct link to heading">#</a></h2><p>React Native is built to enable applications to meet user’s expectations of the platform. This includes avoiding “tells”—little things that give away that the experience was built with React Native. One major source of these tells has been the Touchable components: <code>Button</code>, <code>TouchableWithoutFeedback</code>, <code>TouchableHighlight</code>, <code>TouchableOpacity</code>, <code>TouchableNativeFeedback</code>, and <code>TouchableBounce</code>. These components make your application interactive by allowing you to provide visual feedback to user interactions. However, because they include built-in styles and effects that don’t match the platform interaction, users can tell when experiences are written with React Native.</p><p>Further, as React Native has grown and our bar for high-quality applications has gone up, these components haven't grown with it. React Native now supports platforms like Web, Desktop, and TV, but support for additional input modalities has been lacking. React Native needs to support high-quality interaction experiences on all platforms.</p><p>To address these problems, we are shipping a new core component called <code>Pressable</code>. This component can be used to detect various types of interactions. The API was designed to provide direct access to the current state of interaction without having to maintain state manually in a parent component. It was also designed to enable platforms to extend it's capabilities to include hover, blur, focus, and more. We expect that most people will build and share components utilizing <code>Pressable</code> under the hood instead of relying on the default experience of something like <code>TouchableOpacity</code>.</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> Pressable</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> Text </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Pressable</span><span class="token tag" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">onPress</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript operator" style="color:#fc929e">=></span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> console</span><span class="token tag script language-javascript punctuation" style="color:#657b83">.</span><span class="token tag script language-javascript function" style="color:#79b6f2">log</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript string" style="color:#8dc891">'pressed'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">;</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript parameter punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript parameter" style="color:#fc929e"> pressed </span><span class="token tag script language-javascript parameter punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript operator" style="color:#fc929e">=></span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> pressed </span><span class="token tag script language-javascript operator" style="color:#fc929e">?</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'lightskyblue'</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript string" style="color:#8dc891">'white'</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e">styles</span><span class="token tag script language-javascript punctuation" style="color:#657b83">.</span><span class="token tag script language-javascript" style="color:#fc929e">text</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain">Press Me</span><span class="token operator" style="color:#fc929e">!</span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Pressable</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p class="snippet-caption">A simple example of a Pressable component in action</p><p>You can learn more about it from <a href="https://reactnative.dev/docs/pressable" target="_blank" rel="noopener noreferrer">the documentation</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="native-colors-platformcolor-dynamiccolorios"></a>Native Colors (PlatformColor, DynamicColorIOS)<a class="hash-link" href="#native-colors-platformcolor-dynamiccolorios" title="Direct link to heading">#</a></h2><p>Every native platform has the concept of system-defined colors. Colors that automatically respond to system theme settings such as Light or Dark mode, accessibility settings such as a High Contrast mode, and even its context within the app such as the traits of a containing view or window.</p><p>While it is possible to detect some of these settings via the <a href="https://reactnative.dev/docs/appearance#getcolorscheme" target="_blank" rel="noopener noreferrer"><code>Appearance</code></a> API and/or <a href="https://reactnative.dev/docs/accessibilityinfo#isgrayscaleenabled" target="_blank" rel="noopener noreferrer"><code>AccessibilityInfo</code></a> and set your styles accordingly, such abstractions are not only costly to develop but are just approximating the appearance of native colors. These inconsistencies are particularly noticeable when working on a hybrid application, where React Native elements co-exist next to the native ones.</p><p>React Native now provides an out-of-the-box solution to use these system colors. <code>PlatformColor()</code> is a new API that can be used like any other color in React Native.</p><p>For example, on iOS, the <a href="https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors?language=objc" target="_blank" rel="noopener noreferrer">system provides a color called <code>labelColor</code></a>. That can be used in React Native with <code>PlatformColor</code> like this:</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> Text</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> PlatformColor </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"> color</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript function" style="color:#79b6f2">PlatformColor</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript string" style="color:#8dc891">'labelColor'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> This is a label</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p class="snippet-caption">Sets the color of the Text component to labelColor as defined by iOS.</p><p>Android, on the other hand, <a href="https://developer.android.com/reference/android/R.attr#colorButtonNormal" target="_blank" rel="noopener noreferrer">provides colors like colorButtonNormal</a>. You can use this color in React Native with:</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> View</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> Text</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> PlatformColor </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> backgroundColor</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript function" style="color:#79b6f2">PlatformColor</span><span class="token tag script language-javascript punctuation" style="color:#657b83">(</span><span class="token tag script language-javascript string" style="color:#8dc891">'?attr/colorButtonNormal'</span><span class="token tag script language-javascript punctuation" style="color:#657b83">)</span><span class="token tag script language-javascript" style="color:#fc929e"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token tag script language-javascript" style="color:#fc929e"> </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain">This is colored like a button</span><span class="token operator" style="color:#fc929e">!</span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">View</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p class="snippet-caption">Sets the background color of the View component to colorButtonNormal as defined by Android.</p><p>You can learn more about <code>PlatformColor</code> from <a href="https://reactnative.dev/docs/platformcolor" target="_blank" rel="noopener noreferrer">the documentation</a>. You can also check the actual <a href="https://github.com/facebook/react-native/blob/master/packages/rn-tester/js/examples/PlatformColor/PlatformColorExample.js" target="_blank" rel="noopener noreferrer">code examples present in the RNTester</a>.</p><p><code>DynamicColorIOS</code> is an iOS only API that lets you define which color to use in light and dark mode. Similar to <code>PlatformColor</code>, this can be used anywhere you can use colors. <code>DynamicColorIOS</code> uses iOS’s <code>colorWithDynamicProvider</code> under the hood.</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> Text</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> DynamicColorIOS </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> customDynamicTextColor </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">DynamicColorIOS</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> dark</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'lightskyblue'</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> light</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'midnightblue'</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag" style="color:#fc929e"> </span><span class="token tag attr-name" style="color:#c5a5c5">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#657b83">=</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript punctuation" style="color:#657b83">{</span><span class="token tag script language-javascript" style="color:#fc929e"> color</span><span class="token tag script language-javascript operator" style="color:#fc929e">:</span><span class="token tag script language-javascript" style="color:#fc929e"> customDynamicTextColor </span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag script language-javascript punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> This color changes automatically based on the system theme</span><span class="token operator" style="color:#fc929e">!</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p class="snippet-caption">Changes the text color based on the system theme</p><p>You can learn more about <code>DynamicColorIOS</code> from <a href="https://reactnative.dev/docs/dynamiccolorios" target="_blank" rel="noopener noreferrer">the documentation</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="dropping-ios-9-and-nodejs-8-support"></a>Dropping iOS 9 and Node.js 8 support<a class="hash-link" href="#dropping-ios-9-and-nodejs-8-support" title="Direct link to heading">#</a></h2><p>After over four years from its release, we are dropping support for iOS 9. This change will allow us to move faster by being able to reduce the number of compatibility checks that need to be placed in the native code to detect whether a given feature was supported on a certain iOS version. With its <a href="https://david-smith.org/iosversionstats/" target="_blank" rel="noopener noreferrer">market share of 1%</a>, it shouldn’t have much negative impact on your customers.</p><p>At the same time, we are dropping support for Node 8. <a href="https://nodejs.org/fr/blog/release/v8.9.0/" target="_blank" rel="noopener noreferrer">Its LTS maintenance cycle expired in December 2019</a>. The current LTS is Node 10 and it is now the version that we are targeting. If you are still using Node 8 for the development of React Native applications, we encourage you to upgrade in order to receive all the latest security fixes and updates.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="other-notable-improvements"></a>Other notable improvements<a class="hash-link" href="#other-notable-improvements" title="Direct link to heading">#</a></h2><ul><li><strong>Support rendering <code><View /></code> in <code><Text /></code> without explicit size</strong>: You can now render any <code><View /></code> inside any <code><Text /></code> component without setting its width and height explicitly, which wasn’t always possible. On previous releases of React Native, this would result in a RedBox.</li><li><strong>Changed iOS LaunchScreen from <code>xib</code> to <code>storyboard</code></strong>: Starting April 30, 2020, all apps submitted to the App Store must use an Xcode storyboard to provide the app’s launch screen and all iPhone apps must support all iPhone screens. This commit adjusts the default React Native template to be compatible with this requirement.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="thanks"></a>Thanks<a class="hash-link" href="#thanks" title="Direct link to heading">#</a></h2><p>Thank you to the hundreds of contributors that helped make 0.63 possible!</p><blockquote><p>Special thanks to <a href="https://twitter.com/rickhanlonii" target="_blank" rel="noopener noreferrer">Rick Hanlon</a> for authoring the section on <code>LogBox</code> and <a href="https://twitter.com/Eli_White" target="_blank" rel="noopener noreferrer">Eli White</a> for authoring the <code>Pressable</code> part of this article.</p></blockquote><p>To see all the updates, take a look at the <a href="https://github.com/react-native-community/releases/blob/master/CHANGELOG.md#0630" target="_blank" rel="noopener noreferrer">0.63 changelog</a>.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a><a class="margin-horiz--sm" href="/blog/tags/release">release</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2020/03/26/version-0.62">Announcing React Native 0.62 with Flipper</a></h2><div class="margin-vert--md"><time datetime="2020-03-26T00:00:00.000Z" class="blogPostDate_2q4-">March 26, 2020 · 5 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/rickhanlonii" target="_blank" rel="noreferrer noopener"><img src="https://avatars3.githubusercontent.com/u/2440089?s=460&v=4" alt="Rick Hanlon"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/rickhanlonii" target="_blank" rel="noreferrer noopener">Rick Hanlon</a></h4><small class="avatar__subtitle">React Native Core at Facebook</small></div></div></header><section class="markdown"><p>Today we’re releasing React Native version 0.62 which includes support for Flipper by default.</p><p>This release comes in the midst of a global pandemic. We’re releasing this version today to respect the work of hundreds of contributors who made this release possible and to prevent the release from falling too far behind master. Please be mindful of the reduced capacity of contributors to help with issues and prepare to delay upgrading if necessary.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="flipper-by-default"></a>Flipper by default<a class="hash-link" href="#flipper-by-default" title="Direct link to heading">#</a></h2><p><a href="https://fbflipper.com/" target="_blank" rel="noopener noreferrer">Flipper</a> is a developer tool for debugging mobile apps. It’s popular in the Android and iOS communities, and in this release we’ve enabled support by default for new and existing React Native apps.</p><p><img alt="Screenshot of Flipper for React Native" src="/assets/images/0.62-flipper-dc5a5cb54cc6033750c56f3c147c6ce3.png"></p><p>Flipper provides the following features out of the box:</p><ul><li><strong>Metro Actions</strong>: Reload the app and trigger the Dev Menu right from the toolbar.</li><li><strong>Crash Reporter</strong>: View crash reports from Android and iOS devices.</li><li><strong>React DevTools</strong>: Use the newest version of React DevTools right alongside all your other tools.</li><li><strong>Network Inspector</strong>: View all of the network requests made by device applications.</li><li><strong>Metro and Device Logs</strong>: View, search, and filter all logs from both Metro and the Device.</li><li><strong>Native Layout Inspector</strong>: View and edit the native layout output by the React Native renderer.</li><li><strong>Database and Preference Inspectors</strong>: View and edit the device databases and preferences.</li></ul><p>Additionally, since Flipper is an extensible platform, it provides a marketplace that pulls plugins from NPM so you can publish and install custom plugins specific to your workflows. See the available plugins <a href="https://www.npmjs.com/search?q=flipper-plugin" target="_blank" rel="noopener noreferrer">here</a>.</p><p>For more information, check out the <a href="https://fbflipper.com/docs/features/react-native" target="_blank" rel="noopener noreferrer">Flipper documentation</a>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="new-dark-mode-features"></a>New dark mode features<a class="hash-link" href="#new-dark-mode-features" title="Direct link to heading">#</a></h2><p>We’ve added a new <code>Appearance</code> module to provide access to the user's appearance preferences, such as their preferred color scheme (light or dark).</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-js codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> colorScheme </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token maybe-class-name">Appearance</span><span class="token punctuation" style="color:#657b83">.</span><span class="token method function property-access" style="color:#79b6f2">getColorScheme</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token plain">colorScheme </span><span class="token operator" style="color:#fc929e">===</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'dark'</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token comment" style="color:#93a1a1">// Use dark color scheme</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p>We’ve also added a hook to subscribe to state updates to the users preferences:</p><div class="mdxCodeBlock_1daz"><div class="codeBlockContent_2es_"><div tabindex="0" class="prism-code language-jsx codeBlock_27aQ thin-scrollbar"><div class="codeBlockLines_2rCb" style="color:#FFFFFF;background:#282C34"><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token keyword" style="color:#c5a5c5">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"> Text</span><span class="token punctuation" style="color:#657b83">,</span><span class="token plain"> useColorScheme </span><span class="token punctuation" style="color:#657b83">}</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">from</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">'react-native'</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain" style="display:inline-block">
|
||
</span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#79b6f2">MyComponent</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token plain"> </span><span class="token operator" style="color:#fc929e">=></span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">const</span><span class="token plain"> colorScheme </span><span class="token operator" style="color:#fc929e">=</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">useColorScheme</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#657b83"><</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token function" style="color:#79b6f2">useColorScheme</span><span class="token punctuation" style="color:#657b83">(</span><span class="token punctuation" style="color:#657b83">)</span><span class="token operator" style="color:#fc929e">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#657b83">{</span><span class="token plain">colorScheme</span><span class="token punctuation" style="color:#657b83">}</span><span class="token tag punctuation" style="color:#657b83"></</span><span class="token tag class-name" style="color:#fac863">Text</span><span class="token tag punctuation" style="color:#657b83">></span><span class="token punctuation" style="color:#657b83">;</span><span class="token plain"></span></div><div class="token-line" style="color:#FFFFFF;background:#282C34"><span class="token plain"></span><span class="token punctuation" style="color:#657b83">}</span><span class="token punctuation" style="color:#657b83">;</span></div></div></div><button type="button" aria-label="Copy code to clipboard" class="copyButton_2bml">Copy</button></div></div><p>See the docs for <a href="/docs/appearance">Appearance</a> and <a href="/docs/usecolorscheme">useColorScheme</a> for more information.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="moving-apple-tv-to-react-native-tvos"></a>Moving Apple TV to react-native-tvos<a class="hash-link" href="#moving-apple-tv-to-react-native-tvos" title="Direct link to heading">#</a></h2><p>As part of our <a href="/blog/#lean-core">Lean Core effort</a> and to bring Apple TV in line with other platforms like React Native Windows and React Native macOS, we’ve started to remove Apple TV specific code from core.</p><p>Going forward, Apple TV support for React Native will be maintained in <a href="https://github.com/react-native-community/react-native-tvos" target="_blank" rel="noopener noreferrer">react-native-community/react-native-tvos</a> along with the corresponding <code>react-native-tvos</code> NPM package. This is a full fork of the main repository, with only the changes needed to support Apple TV.</p><p>Releases of <code>react-native-tvos</code> will be based on the public release of React Native. For this 0.62 release of <code>react-native</code> please upgrade Apple TV projects to use <code>react-native-tvos</code> 0.62.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="more-upgrade-support"></a>More upgrade support<a class="hash-link" href="#more-upgrade-support" title="Direct link to heading">#</a></h2><p>When 0.61 was released, the community introduced a new <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">upgrade helper</a> tool to support developers upgrading to new versions of React Native. The upgrade helper provides a diff of changes from the version you're on to the version you're targeting, allowing you to see the changes that need to be made for your specific upgrade.</p><p>Even with this tool, issues come up when upgrading. Today we're introducing more dedicated upgrading support by announcing <a href="https://github.com/react-native-community/upgrade-support" target="_blank" rel="noopener noreferrer">Upgrade-Support</a>. Upgrade Support is a GitHub issue tracker where users can submit issues specific to upgrading their projects to receive help from the community.</p><p>We're always working to improve the upgrade experience, and we hope that these tools give users the support they need in the edge cases we haven't covered yet.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="other-improvements"></a>Other improvements<a class="hash-link" href="#other-improvements" title="Direct link to heading">#</a></h2><ul><li><strong>LogBox</strong>: We’re adding the new LogBox error and warning experience as an opt-in; to enable it, add <code>require('react-native').unstable_enableLogBox()</code> to your <code>index.js</code> file.</li><li><strong>React DevTools v4</strong>: This change includes an upgrade to the <a href="https://reactjs.org/blog/2019/08/15/new-react-devtools.html" target="_blank" rel="noopener noreferrer">latest React DevTools</a> which offers significant performance gains, an improved navigation experience, and full support for React Hooks.</li><li><strong>Accessibility improvements</strong>: We’ve made improvements to accessibility including adding <a href="https://reactnative.dev/docs/accessibility#accessibilityvalue-ios-android" target="_blank" rel="noopener noreferrer">accessibilityValue</a>, missing props on <a href="https://github.com/facebook/react-native/commit/8c0c860e38f57e18296f689e47dfb4a54088c260" target="_blank" rel="noopener noreferrer">Touchables</a>, <code>onSlidingComplete</code> <a href="https://github.com/facebook/react-native/commit/c7aa6dc8270c0eabc913fe6c617c8131e3f4b3c5" target="_blank" rel="noopener noreferrer">accessibility events</a>, and changing the default role of Switch component from <code>"button"</code> to <code>"switch"</code>.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="breaking-changes"></a>Breaking changes<a class="hash-link" href="#breaking-changes" title="Direct link to heading">#</a></h2><ul><li><strong>Remove PropTypes</strong>: We're removing <code>propTypes</code> from core components in order to reduce the app size impact of React Native core and to favor static type systems which check at compile time instead of runtime.</li><li><strong>Remove accessibilityStates</strong>: We’ve <a href="https://github.com/facebook/react-native/commit/7b35f427fd66cb0f36921b992095fe5b3c14d8b9" target="_blank" rel="noopener noreferrer">removed</a> the deprecated <code>accessibilityStates</code> property in favor of the new <code>accessibilityState</code> prop which is a more semantically rich way for components to describe information about their state to accessibility services.</li><li><strong>TextInput changes</strong>: We removed <code>onTextInput</code> <a href="https://github.com/facebook/react-native/commit/3f7e0a2c9601fc186f25bfd794cd0008ac3983ab" target="_blank" rel="noopener noreferrer">from TextInput</a> as it’s uncommon, not W3C compliant, and difficult to implement in <a href="https://github.com/react-native-community/discussions-and-proposals/issues/4" target="_blank" rel="noopener noreferrer">Fabric</a>. We also removed the undocumented <code>inputView</code> prop, and <code>selectionState</code>.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="deprecations"></a>Deprecations<a class="hash-link" href="#deprecations" title="Direct link to heading">#</a></h2><ul><li><code>AccessibilityInfo.fetch</code> was already deprecated, but in this release we <a href="https://github.com/facebook/react-native/commit/523ab8333800afbfb169c6fd70ab6611fe07cc2a" target="_blank" rel="noopener noreferrer">added a warning</a>.</li><li>Setting <code>useNativeDriver</code> is <a href="https://github.com/facebook/react-native/commit/5876052615f4858ed5fc32fa3da9b64695974238" target="_blank" rel="noopener noreferrer">now required</a> to support switching the default in the future.</li><li>The <code>ref</code> of an <code>Animated</code> component is now the internal component and <a href="https://github.com/facebook/react-native/commit/66e72bb4e00aafbcb9f450ed5db261d98f99f82a" target="_blank" rel="noopener noreferrer">deprecated</a> <code>getNode</code>.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="thanks"></a>Thanks<a class="hash-link" href="#thanks" title="Direct link to heading">#</a></h2><p>Thank you to the hundreds of contributors that helped make 0.62 possible!</p><p>To see all the updates, take a look at the <a href="https://github.com/react-native-community/releases/blob/master/CHANGELOG.md#0620" target="_blank" rel="noopener noreferrer">0.62 changelog</a>.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a><a class="margin-horiz--sm" href="/blog/tags/release">release</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2019/11/18/react-native-doctor">Meet Doctor, a new React Native command</a></h2><div class="margin-vert--md"><time datetime="2019-11-18T00:00:00.000Z" class="blogPostDate_2q4-">November 18, 2019 · 2 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/lbentosilva" target="_blank" rel="noreferrer noopener"><img src="https://avatars3.githubusercontent.com/u/6207220?s=460&v=4" alt="Lucas Bento"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/lbentosilva" target="_blank" rel="noreferrer noopener">Lucas Bento</a></h4><small class="avatar__subtitle">React Native Community</small></div></div></header><section class="markdown"><p>After over 20 pull requests from 6 contributors in the React Native Community, we're excited to launch <code>react-native doctor</code>, a new command to help you out with getting started, troubleshooting and automatically fixing errors with your development environment. The <code>doctor</code> command is heavily inspired by <a href="https://expo.io/" target="_blank" rel="noopener noreferrer">Expo</a> and <a href="https://brew.sh/" target="_blank" rel="noopener noreferrer">Homebrew</a>'s own doctor command with a pinch of UI inspired by <a href="https://jestjs.io/" target="_blank" rel="noopener noreferrer">Jest</a>.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a></div><div class="col text--right"><a aria-label="Read more about Meet Doctor, a new React Native command" href="/blog/2019/11/18/react-native-doctor"><strong>Read More</strong></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2019/09/18/version-0.61">Announcing React Native 0.61 with Fast Refresh</a></h2><div class="margin-vert--md"><time datetime="2019-09-18T00:00:00.000Z" class="blogPostDate_2q4-">September 18, 2019 · 3 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/dan_abramov" target="_blank" rel="noreferrer noopener"><img src="https://avatars1.githubusercontent.com/u/810438?s=460&v=4" alt="Dan Abramov"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/dan_abramov" target="_blank" rel="noreferrer noopener">Dan Abramov</a></h4><small class="avatar__subtitle">React Core at Facebook</small></div></div></header><section class="markdown"><p>We’re excited to announce React Native 0.61, which includes a new reloading experience we’re calling Fast Refresh.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="fast-refresh"></a>Fast Refresh<a class="hash-link" href="#fast-refresh" title="Direct link to heading">#</a></h2><p>When we asked the React Native community about <a href="https://github.com/react-native-community/discussions-and-proposals/issues/64" target="_blank" rel="noopener noreferrer">common pain points</a>, one of the top answers was that the “hot reloading” feature was broken. It didn’t work reliably for function components, often failed to update the screen, and wasn’t resilient to typos and mistakes. We heard that most people turned it off because it was too unreliable.</p><p>In React Native 0.61, <strong>we’re unifying the existing “live reloading” (reload on save) and “hot reloading” features into a single new feature called “Fast Refresh”</strong>. Fast Refresh was implemented from scratch with the following principles:</p><ul><li>Fast Refresh <strong>fully supports modern React</strong>, including function components and Hooks.</li><li>Fast Refresh <strong>gracefully recovers after typos</strong> and other mistakes, and falls back to a full reload when needed.</li><li>Fast Refresh <strong>doesn’t perform invasive code transformations</strong> so it’s reliable enough to be on by default.</li></ul><p>To see Fast Refresh in action, check out this video:</p><p style="text-align:center"><video width="700" controls="" autoplay=""><source type="video/mp4" src="https://reactnative.dev/img/homepage/ReactRefresh.mp4"></video></p><p>Give it a try, and let us know what you think! If you prefer, you can turn it off in the Dev Menu (Cmd+D on iOS, Cmd+M or Ctrl+M on Android). Turning it on and off is instant so you can do it any time.</p><p>Here are a few Fast Refresh tips:</p><ul><li>Fast Refresh preserves React local state in function components (and Hooks!) by default.</li><li>If you need to reset the React state on every edit, you can add a special <code>// @refresh reset</code> comment to the file with that component.</li><li>Fast Refresh always remounts class components without preserving state. This ensures it works reliably.</li><li>We all make mistakes in the code! Fast Refresh automatically retries rendering after you save a file. You don't need to reload the app manually after fixing a syntax or a runtime error.</li><li>Adding a <code>console.log</code> or a <code>debugger</code> statement during edits is a neat debugging technique.</li></ul><p>Please report any issues with Fast Refresh on GitHub, and we’ll look into them.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="other-improvements"></a>Other Improvements<a class="hash-link" href="#other-improvements" title="Direct link to heading">#</a></h2><ul><li><strong>Fixed use_frameworks! CocoaPods support.</strong> In 0.60 we made some updates to integrate CocoaPods by default. Unfortunately, this broke builds using <a href="https://guides.cocoapods.org/syntax/podfile.html#use_frameworks_bang" target="_blank" rel="noopener noreferrer">use_frameworks!</a>. This is <a href="https://github.com/facebook/react-native/pull/25619" target="_blank" rel="noopener noreferrer">fixed in 0.61</a>, making it easier to integrate React Native into your iOS projects that require building with dynamic frameworks.</li><li><strong>Add useWindowDimensions Hook.</strong> This new Hook automatically provides and subscribes to dimension updates, and can be used instead of the Dimensions API in most cases.</li><li><strong>React was upgraded to 16.9.</strong> This version deprecates old names for the UNSAFE_ lifecycle methods, contains improvements to <code>act</code>, and more. See the <a href="https://reactjs.org/blog/2019/08/08/react-v16.9.0.html" target="_blank" rel="noopener noreferrer">React 16.9 blog post</a> for an automated migration script and more information.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="breaking-changes"></a>Breaking Changes<a class="hash-link" href="#breaking-changes" title="Direct link to heading">#</a></h2><ul><li><strong>Remove React .xcodeproj.</strong> In 0.60, we introduced auto-linking support via CocoaPods. We have also integrated CocoaPods into the e2e tests runs, so that from now on, we have a unified standard way of integrating RN into iOS apps. This effectively deprecates the React .xcodeproj support, and the file has been removed starting 0.61. Note: if you use 0.60 auto-linking already, you shouldn't be affected.</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="thanks"></a>Thanks<a class="hash-link" href="#thanks" title="Direct link to heading">#</a></h2><p>Thanks to all of the contributors that helped make 0.61 possible!</p><p>To see all the updates, take a look at the <a href="https://github.com/react-native-community/releases/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer">0.61 changelog</a>.</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a><a class="margin-horiz--sm" href="/blog/tags/release">release</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2019/07/17/hermes">Meet Hermes, a new JavaScript Engine optimized for React Native</a></h2><div class="margin-vert--md"><time datetime="2019-07-17T00:00:00.000Z" class="blogPostDate_2q4-">July 17, 2019 · 2 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/rachelnabors" target="_blank" rel="noreferrer noopener"><img src="https://avatars0.githubusercontent.com/u/236306?s=460&v=4" alt="Rachel Nabors"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/rachelnabors" target="_blank" rel="noreferrer noopener">Rachel Nabors</a></h4><small class="avatar__subtitle">Documentation Engineer at Facebook</small></div></div></header><section class="markdown"><p>Last week at Chain React we announced Hermes, an open source JavaScript engine we’ve been working on at Facebook. It’s a small and lightweight JavaScript engine optimized for running React Native on Android. <a href="https://code.fb.com/android/hermes/" target="_blank" rel="noopener noreferrer">Check it out!</a></p><p>Hermes improves React Native performance by decreasing memory utilization, reducing download size, and decreasing the time it takes for the app to become usable or “time to interactive” (TTI).</p><blockquote><p>“As we analyzed performance data, we noticed that the JavaScript engine itself was a significant factor in startup performance and download size. With this data in hand, we knew we had to optimize JavaScript performance in the more constrained environments of a mobile phone compared with a desktop or laptop. After exploring other options, we built a new JavaScript engine we call Hermes. It is designed to improve app performance, focusing on our React Native apps, even on mass-market devices with limited memory, slow storage, and reduced computing power.” —<a href="https://code.fb.com/android/hermes/" target="_blank" rel="noopener noreferrer">Hermes: An open source JavaScript engine optimized for mobile apps, starting with React Native</a></p></blockquote><p>Want to get started right away? Be sure to <a href="/docs/hermes/">check out our new guide to enabling Hermes in your existing React Native app</a> in the docs!</p><p><a href="https://code.fb.com/android/hermes/" target="_blank" rel="noopener noreferrer"><img alt="Illustration of the Hermes and React Native logos joined into a winged fury, rising in a crashing electrical storm from a lone, glowing, presumably Android phone." src="/assets/images/2019_hermes-launch-illo-rachel-nabors-05aac3b583be3cc5b84b78b88d60fa09.jpg"></a> <em>Illustration by Rachel Nabors</em></p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="margin-bottom--sm blogPostTitle_2I12"><a href="/blog/2019/07/03/version-60">Announcing React Native 0.60</a></h2><div class="margin-vert--md"><time datetime="2019-07-03T00:00:00.000Z" class="blogPostDate_2q4-">July 3, 2019 · 5 min read</time></div><div class="avatar margin-vert--md"><a class="avatar__photo-link avatar__photo" href="https://twitter.com/turnrye" target="_blank" rel="noreferrer noopener"><img src="https://avatars0.githubusercontent.com/u/701035?s=460&v=4" alt="Ryan Turner"></a><div class="avatar__intro"><h4 class="avatar__name"><a href="https://twitter.com/turnrye" target="_blank" rel="noreferrer noopener">Ryan Turner</a></h4><small class="avatar__subtitle">Core Maintainer & React Native Developer</small></div></div></header><section class="markdown"><p>After months of hard work from hundreds of contributors, the React Native Core team is proud to announce the release of version 0.60. This release handles significant migrations for both Android and iOS platforms, and many issues are resolved too. This blog post covers the highlights of the release. As always though, refer to the changelog for more detailed information. Finally, thank you contributors for helping us to make this milestone!</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="focus-on-accessibility"></a>Focus on Accessibility<a class="hash-link" href="#focus-on-accessibility" title="Direct link to heading">#</a></h2><p>There have been many improvements to the accessibility APIs, like <a href="https://github.com/facebook/react-native/commit/cfe0032" target="_blank" rel="noopener noreferrer">announceForAccessibility</a>, plus improvements to <a href="https://github.com/facebook/react-native/commit/1aeac1c" target="_blank" rel="noopener noreferrer">roles</a>, <a href="https://github.com/facebook/react-native/commit/14b4668" target="_blank" rel="noopener noreferrer">action support</a>, <a href="https://github.com/facebook/react-native/commit/0090ab3" target="_blank" rel="noopener noreferrer">flags</a>, and more. Accessibility is a complex science, but we hope these improvements make it a bit easier to be an A11Y. Be sure to check <a href="/blog/2019/06/12/react-native-open-source-update#meaningful-community-contributions">React Native Open Source Update June 2019</a> for more details of these changes.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="a-fresh-start"></a>A Fresh Start<a class="hash-link" href="#a-fresh-start" title="Direct link to heading">#</a></h2><p>React Native's start screen has been updated! Thank you to the many contributors who helped create the new UI. This new "Hello World" will welcome users to the ecosystem in a more friendly, engaging way.</p><p><img alt="The new init screen helps developers get started from the get-go with resources and a good example" src="/assets/images/0.60-new-init-screen-5b31714cd0630d7df25c66cab80c210b.png"></p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="androidx-support"></a>AndroidX Support<a class="hash-link" href="#androidx-support" title="Direct link to heading">#</a></h2><p><a href="https://developer.android.com/jetpack/androidx" target="_blank" rel="noopener noreferrer">AndroidX</a> is a major step forward in the Android ecosystem, and the old support library artifacts are being deprecated. For 0.60, React Native has been migrated over to AndroidX. This is a breaking change, and <strong>your native code and dependencies will need to be migrated</strong> as well.</p><blockquote><p>With this change, React Native apps will need to begin using AndroidX themselves. They cannot be used side-by-side in one app, so all of the app code and dependency code needs to be using one or the other.</p><p><a href="https://github.com/matt-oakes" target="_blank" rel="noopener noreferrer">matt-oakes</a> on <a href="https://github.com/react-native-community/discussions-and-proposals/issues/129" target="_blank" rel="noopener noreferrer">discussions-and-proposals</a></p></blockquote><p>While your own native code will need to be migrated by you, <a href="https://github.com/mikehardy" target="_blank" rel="noopener noreferrer">@mikehardy</a>, <a href="https://github.com/cawfree" target="_blank" rel="noopener noreferrer">@cawfree</a>, and <a href="https://github.com/m4tt72" target="_blank" rel="noopener noreferrer">@m4tt72</a> built a <a href="https://github.com/mikehardy/jetifier" target="_blank" rel="noopener noreferrer">clever tool named "jetifier"</a> to patch your <code>node_modules</code>. Library maintainers will need to upgrade, but this tool provide you with a temporary solution while giving them time to release an AndroidX version. So if you find errors related to AndroidX migration, give this a shot.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="cocoapods-by-default"></a>CocoaPods by Default<a class="hash-link" href="#cocoapods-by-default" title="Direct link to heading">#</a></h2><p><a href="https://github.com/react-native-community/discussions-and-proposals/blob/master/proposals/0004-cocoapods-support-improvements.md" target="_blank" rel="noopener noreferrer">CocoaPods are now part of React Native's iOS project</a>. If you weren't already, be sure to open iOS platform code using the <code>xcworkspace</code> file from now on (protip: try <code>xed ios</code> from the root project directory). Also, the <code>podspec</code>s for the internal packages have changed to make them compatible with the Xcode projects, which will help with troubleshooting and debugging. Expect to make <a href="https://github.com/facebook/react-native/commit/2321b3f" target="_blank" rel="noopener noreferrer">some straightforward changes</a> to your <code>Podfile</code> as part of the upgrade to 0.60 to bring this exciting support. Note that we are aware of a compatibility issue with <code>use_frameworks!</code>, and we're tracking an <a href="https://github.com/facebook/react-native/issues/25349" target="_blank" rel="noopener noreferrer">issue</a> with workarounds and a future patch.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="lean-core-removals"></a>Lean Core Removals<a class="hash-link" href="#lean-core-removals" title="Direct link to heading">#</a></h2><p><strong>WebView</strong> and <strong>NetInfo</strong> were previously extracted into separate repositories, and in 0.60 we’ve finished migrating them out of the React Native repository. Additionally, in response to community feedback about new App Store policy, <strong>Geolocation</strong> has been extracted. If you haven’t already, complete your migration by adding dependencies to <a href="https://github.com/react-native-community/react-native-webview" target="_blank" rel="noopener noreferrer">react-native-webview</a>, <a href="https://github.com/react-native-community/react-native-netinfo" target="_blank" rel="noopener noreferrer">@react-native-community/netinfo</a>, and <a href="https://github.com/react-native-community/react-native-geolocation" target="_blank" rel="noopener noreferrer">@react-native-community/geolocation</a>. If you'd like an automated solution, consider using <a href="https://github.com/lucasbento/rn-update-deprecated-modules" target="_blank" rel="noopener noreferrer">rn-upgrade-deprecated-modules</a>. Maintainers have made more than 100 commits to these repositories since extraction and we’re excited to see the community’s support!</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="native-modules-are-now-autolinked"></a>Native Modules are now Autolinked<a class="hash-link" href="#native-modules-are-now-autolinked" title="Direct link to heading">#</a></h2><p>The team working on the <a href="https://github.com/react-native-community/cli" target="_blank" rel="noopener noreferrer">React Native CLI</a> has introduced major improvements to native module linking called <a href="https://github.com/react-native-community/cli/blob/master/docs/autolinking.md" target="_blank" rel="noopener noreferrer">autolinking</a>! Most scenarios will not require the use of <code>react-native link</code> anymore. At the same time, the team overhauled the linking process in general. Be sure to <code>react-native unlink</code> any preexisting dependencies as mentioned in the docs above.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="upgrade-helper"></a>Upgrade Helper<a class="hash-link" href="#upgrade-helper" title="Direct link to heading">#</a></h2><p><a href="https://github.com/lucasbento" target="_blank" rel="noopener noreferrer">@lucasbento</a>, <a href="https://github.com/pvinis" target="_blank" rel="noopener noreferrer">@pvinis</a>, <a href="https://github.com/kelset" target="_blank" rel="noopener noreferrer">@kelset</a>, and <a href="https://github.com/watadarkstar" target="_blank" rel="noopener noreferrer">@watadarkstar</a> have built a great tool called <a href="https://react-native-community.github.io/upgrade-helper/" target="_blank" rel="noopener noreferrer">Upgrade Helper</a> to make the upgrade process simpler. It helps React Native users with brownfield apps or complex customizations to see what's changed between versions. Take a look at the <a href="/docs/upgrading">updated upgrading docs</a> and try it out today for your upgrade path!</p><p><img alt="Upgrade Helper cleanly and easily shows the changes needed to migrate to a different version of React Native" src="/assets/images/0.60-upgrade-helper-220ec6d7cb848ee06ae952c142c1cf2a.png"></p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="a-note-to-library-maintainers"></a>A Note to Library Maintainers<a class="hash-link" href="#a-note-to-library-maintainers" title="Direct link to heading">#</a></h2><p>Changes for AndroidX will almost certainly require updates to your library, so be sure to include support soon. If you're not able to upgrade yet, consider checking your library against the jetifier to confirm that users are able to patch your library at build time.</p><p>Review the <a href="https://github.com/react-native-community/cli/blob/master/docs/autolinking.md" target="_blank" rel="noopener noreferrer">autolinking</a> docs to update your configs and readme. Depending on how your library was previously integrated, you may also need to make some additional changes. Check the <a href="https://github.com/react-native-community/cli/blob/master/docs/dependencies.md" target="_blank" rel="noopener noreferrer">dependencies</a> guide from the CLI for information on how to define your dependency interface.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_E4oP" id="thanks"></a>Thanks<a class="hash-link" href="#thanks" title="Direct link to heading">#</a></h2><p>While these are the highlights that we noted, there are many others to be excited about. To see all the updates, take a look at the <a href="https://github.com/react-native-community/react-native-releases/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer">changelog</a>. As always, stay tuned for more news. Enjoy 0.60 in the meantime!</p></section><footer class="row margin-vert--lg"><div class="col"><strong>Tags:</strong><a class="margin-horiz--sm" href="/blog/tags/announcement">announcement</a><a class="margin-horiz--sm" href="/blog/tags/release">release</a></div></footer></article><nav class="pagination-nav" aria-label="Blog list page navigation"><div class="pagination-nav__item"></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/blog/page/2"><div class="pagination-nav__label">Older Entries »</div></a></div></nav></main></div></div></div><footer class="footer footer--dark"><div class="container"><div class="row footer__links"><div class="col footer__col"><h4 class="footer__title">Docs</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started">Getting Started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/tutorial">Tutorial</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/components-and-apis">Components and APIs</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/more-resources">More Resources</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">Community</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/help">The React Native Community</a></li><li class="footer__item"><a class="footer__link-item" href="/showcase">Who's using React Native?</a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/react-native" target="_blank" rel="noopener noreferrer" class="footer__link-item">Ask Questions on Stack Overflow</a></li><li class="footer__item"><a href="https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contributor Guide</a></li><li class="footer__item"><a href="https://dev.to/t/reactnative" target="_blank" rel="noopener noreferrer" class="footer__link-item">DEV Community</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">Find us</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://twitter.com/reactnative" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter</a></li><li class="footer__item"><a href="https://github.com/facebook/react-native" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">More</h4><ul class="footer__items"><li class="footer__item"><a href="https://reactjs.org/" target="_blank" rel="noopener noreferrer" class="footer__link-item">React</a></li><li class="footer__item"><a href="https://opensource.facebook.com/legal/privacy" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy Policy</a></li><li class="footer__item"><a href="https://opensource.facebook.com/legal/terms" target="_blank" rel="noopener noreferrer" class="footer__link-item">Terms of Service</a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><a href="https://opensource.facebook.com" target="_blank" rel="noopener noreferrer" class="footerLogoLink_3cAK"><img class="footer__logo" alt="Facebook Open Source Logo" src="/img/oss_logo.png"></a></div><div class="footer__copyright">Copyright © 2021 Facebook, Inc.</div></div></div></footer></div>
|
||
<script src="/styles.9d29dd5a.js"></script>
|
||
<script src="/runtime~main.b00a5634.js"></script>
|
||
<script src="/main.4103a08e.js"></script>
|
||
<script src="/1.7a6193e2.js"></script>
|
||
<script src="/2.9b40dc51.js"></script>
|
||
<script src="/3.5038d2af.js"></script>
|
||
<script src="/01a85c17.ba6e50e3.js"></script>
|
||
<script src="/18b93cb3.0f191383.js"></script>
|
||
<script src="/1be78505.c251d713.js"></script>
|
||
<script src="/1f391b9e.08b65592.js"></script>
|
||
<script src="/5fc994c2.1a243557.js"></script>
|
||
<script src="/6875c492.c3f7c047.js"></script>
|
||
<script src="/a6aa9e1f.d957d979.js"></script>
|
||
<script src="/c4f5d8e4.03c60be1.js"></script>
|
||
<script src="/ccc49370.337c1f21.js"></script>
|
||
<script src="/1093.b6be3a0d.js"></script>
|
||
<script src="/e4eeaf16.f80aca8e.js"></script>
|
||
<script src="/0305cd95.8ed2a7dd.js"></script>
|
||
<script src="/26b4f16a.91e0cb2b.js"></script>
|
||
<script src="/1b94994a.e767a380.js"></script>
|
||
<script src="/f80d3992.0e9cb87c.js"></script>
|
||
<script src="/8415f7e8.0de00eb5.js"></script>
|
||
<script src="/5860a2aa.4db4074a.js"></script>
|
||
<script src="/3e16fe84.371a673d.js"></script>
|
||
<script src="/10a433e1.3d997d5a.js"></script>
|
||
<script src="/000e4255.fb3f1146.js"></script>
|
||
<script src="/474240c1.4181d117.js"></script>
|
||
<script src="/b2b675dd.99615fa5.js"></script>
|
||
</body>
|
||
</html> |