React Native 0.81 - Android 16対応、iOSビルドの高速化など
本日、React Native 0.81のリリースを発表できることを嬉しく思います!
このバージョンではAndroid 16(APIレベル36)をサポートし、その他さまざまな安定性の向上とバグ修正が含まれています。また、プリコンパイルを使用したiOSビルドの高速化が実験的にサポートされています。
ハイライト
ハイライト
Android 16のサポート
React Native 0.81でビルドされたAndroidアプリは、デフォルトで Android 16 (APIレベル36) をターゲットにするようになります。
Googleから以前に発表されたように、Android 16ではアプリをedge-to-edgeで表示することが必須となり、オプトアウトすることはできなくなります。
これをサポートするため、以前に発表した通り、<SafeAreaView>
コンポーネントを非推奨とし、代替手段を推奨します。下記で、より優れたedge-to-edgeサポートを提供する代替手段について説明します。
また、16以降のすべてのサポートされているAndroidバージョンでedge-to-edgeを有効にするかどうかを選択できる新しいgradleプロパティedgeToEdgeEnabled
を追加しています。
予測型「戻る」ジェスチャーが、Android 16をターゲットとするアプリでデフォルトで有効になります。BackHandler APIは、ほとんどのユースケースで以前と同様に機能するはずです。しかし、アプリが戻る操作にカスタムネイティブコード(onBackPressed()
メソッドのオーバーライドなど)に依存している場合は、コードを手動で移行するか、一時的にオプトアウトする必要があるかもしれません。アップグレード後は、アプリの「戻る」ナビゲーションを十分にテストしてください。
Googleは現在、アプリが向きやサイズの制約に関わらず、大画面デバイスでアダプティブレイアウトをサポートすることを期待しています。現時点ではオプトアウトできますが、Android 17が登場する前に、大画面でのレスポンシブUIのためにアプリをテストし、更新することをお勧めします。
2025年11月1日より、すべてのGoogle Playアプリの提出物は、ネイティブバイナリに対して16KBのページサイズの要件を満たす必要があります。これは、Android 15以降のデバイスをターゲットとする新しいアプリとアップデートに適用されます。React Nativeはすでに16KBページサイズに準拠しています。すべてのネイティブコードとサードパーティライブラリも準拠していることを確認してください。
Android 16の変更と移行手順の詳細については、discussions-and-proposalsリポジトリのこの投稿を参照してください。
SafeAreaViewの非推奨
組み込みの<SafeAreaView>
コンポーネントは、もともと画面の「セーフエリア」(カメラのノッチや丸みを帯びた角などから離れた領域)にコンテンツを保持するための、限定的なiOS専用のサポートを提供するために設計されました。これはAndroidのedge-to-edgeレンダリングと互換性がなく、パディング以外のカスタマイズもできません。その結果、多くのアプリはreact-native-safe-area-context
のような、よりポータブルで柔軟なソリューションを選択しています。
React Native 0.81では、従来の<SafeAreaView>
コンポーネントは非推奨となり、アプリがそれを使用している場合、React Native DevToolsに警告が表示されます。
これは将来のReact Nativeのバージョンで削除される予定です。アプリがすべてのプラットフォームで最高の見栄えになるように、react-native-safe-area-context
または同様のライブラリに移行することをお勧めします。
コミュニティがメンテナンスするJavaScriptCoreのサポート
昨年発表したように、JavaScriptCore (JSC) エンジンのサポートは、React Native本体とは別にリリースされるコミュニティがメンテナンスするパッケージに移行しました。React Native 0.81では、組み込みバージョンのJavaScriptCoreを削除します。JavaScriptCoreを必要とするすべてのアプリは、0.81にアップグレードするためにコミュニティパッケージを使用する必要があります。詳細はインストール手順をお読みください。
この変更は、Hermesを使用しているアプリには影響しません。
実験的な事前コンパイル済みiOSビルド
React Native 0.81では、事前コンパイル済みiOSビルドが導入され、React Nativeが主要な依存関係であるプロジェクトにおいて、コンパイル時間が最大10倍短縮されます。これはExpoとMetaの協力の成果であり、React Native 0.80で以前に提供した作業を拡張したものです。
この機能はまだ実験的ですが、将来のリリースですべてのアプリで有効にすることを目指しています。もしご自身のアプリで事前コンパイル済みビルドを試したい場合は、pod install
を実行する際に以下の環境変数を指定することで有効にできます。
RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 bundle exec pod install
こちらのGitHubディスカッションでフィードバックを提供してください。
すでに認識しており、解決に取り組んでいる2つの制限があります。
- 事前コンパイル済みビルドでは、React Nativeの内部をデバッグしてステップインすることはできません。ただし、事前コンパイル済みのReact Nativeを使用しながら、ご自身のネイティブコードをデバッグすることは可能です。
- Xcode 26 Betaでは、IDEがすべてのターゲットをSwift explicit modulesを有効にしてビルドするため、事前ビルドはサポートされていません。Xcode 26で事前コンパイル済みビルドを使用するには、Xcodeプロジェクトで
SWIFT_ENABLE_EXPLICIT_MODULES
フラグをNO
に設定してください。これは今後のパッチリリースで対応します。
この機能についての詳細は、Expoの完全なブログ記事「Precompiled React Native for iOS: Faster builds are coming in 0.81」で読むことができます。
破壊的変更
最小Node.jsバージョンが20に引き上げ
React Nativeは、Node.jsバージョン20.19.4(執筆時点での最新のメンテナンスLTSバージョン)以上を必要とするようになりました。React Native 0.81にアップグレードする際には、開発環境またはCI環境のNode.jsをアップグレードする必要があるかもしれません。
最小Xcodeバージョンが16.1に引き上げ
React Nativeは、iOSプロジェクトをビルドするためにXcode 16.1以上を必要とするようになりました。React Native 0.81にアップグレードする際には、開発環境またはCI環境のXcodeをアップグレードする必要があるかもしれません。
Metro: Community CLIプロジェクトにおける高度な設定のサポート改善
Metroは、React Native Community CLIプロジェクトのmetro.config.js
ファイルで指定された場合、resolveRequest
とgetModulesRunBeforeMainModule
オプションを尊重するようになりました。以前は、これらを設定しても効果がありませんでした。もしmetro.config.js
ファイルにこれらのオプションのカスタム値がある場合、以前の動作に戻すためにはそれらを削除する必要があるかもしれません。
キャッチされなかったJavaScriptエラーの報告改善
React Native DevToolsは、キャッチされなかったJavaScriptエラーの元のメッセージとスタックトレース、エラーのcause(もしあれば)、そしてコンポーネントによってスローされたエラーのオーナー・スタックを表示するようになりました。これにより、エラーのデバッグと修正が容易になります。
もしJavaScriptエラーをバックエンドやサードパーティのエラー報告サービスにログ記録している場合、React Native 0.81へのアップグレード後に表示されるログに影響が出る可能性があります(例:以前はconsole.error
経由で報告されていたスローされたエラーがより多く表示されるようになるかもしれません)。それに伴い、バックエンドのロジックを更新する必要があるかもしれません。
RN_SERIALIZABLE_STATE
とC++フラグ
このバージョンのReact Nativeでは、新しいアーキテクチャ上のコンポーネントでシリアライズ可能な状態をサポートするために、RN_SERIALIZABLE_STATE
という新しいマクロを導入しました。
もしあなたがライブラリ作者で、カスタムのCMakeLists.txt
ファイルを持っている場合、このマクロをCMakeLists.txtファイルで指定しないと、C++コードのコンパイルに失敗する可能性があります。
これをサポートするため、このマクロと必要なすべてのC++フラグを設定してくれる新しいCMake関数target_compile_reactnative_options
を導入しました。CMakeListsファイルで次のように呼び出すことができます。
target_compile_reactnative_options(myLibraryName PRIVATE)
react-native-screensがこのマクロをどのように設定したかの例を見ることができます。
この変更は、より高度で複雑なライブラリにのみ影響します。もしあなたのライブラリがcodegenを使用しており、カスタムのCMakeファイルを持っていない場合は、この変更の影響を受けません。
その他の破壊的変更
このリストには、製品コードに軽微な影響を与える可能性があり、注目に値すると考えられるその他の一連の破壊的変更が含まれています。
Android
- いくつかのクラスをinternalにしました。これらのクラスはパブリックAPIの一部ではなく、アクセスすべきではありません。影響を受けるライブラリにはすでに通知またはパッチを提出しています。
com.facebook.react.fabric.mounting.MountingManager
com.facebook.react.views.text.TextLayoutManager
textAlignVertical
ネイティブプロップをTextAttribute.h
からParagraphAttribute.h
に移動しました。- プロップ
textAlignVertical
は最上位のテキストビュー(パラグラフビュー)にのみ影響します。にもかかわらず、それはテキスト属性のプロップに存在していました。このプラットフォームの制限をよりよく反映するために、パラグラフプロップに移動されました。 - この変更は
<Text>
コンポーネントのJS APIには影響しません。 - この変更の影響を受けるのは、C++ Text APIとやり取りするFabricコンポーネントを実装している場合のみです。
- この変更の影響を受ける場合は、コード内の
TextAttributes.h
をParagraphAttribute.h
に置き換えることができます。
- プロップ
CHANGELOG for 0.81で破壊的変更の完全なリストを読んでください。
謝辞
React Native 0.81には、110人のコントリビューターによる1110以上のコミットが含まれています。皆さんのご尽力に感謝します!
このリリースで重要な貢献をしてくださったコミュニティメンバーの方々に、特別な感謝を送りたいと思います。
- 事前コンパイル済みiOSビルドに関する素晴らしい仕事をしてくれたChristian Falch氏。
- Androidのedge-to-edgeサポートに重要な貢献をしてくれたMathieu Acthernoene氏。
- Android 16の統合とSafeAreaViewの非推奨化のテストを手伝ってくれたEnrique López-Mañas氏。
0.81へのアップグレード
既存のプロジェクトについては、アップグレードに関するドキュメントに加えて、React Native Upgrade Helperを使用して、React Nativeのバージョン間のコード変更を確認してください。
新しいプロジェクトを作成するには
npx @react-native-community/cli@latest init MyProject --version latest
Expoを使用している場合、React Native 0.81は、今後のExpo SDK 54でデフォルトのReact Nativeバージョンとしてサポートされます。
0.81がReact Nativeの最新の安定バージョンとなり、0.78.xはサポート対象外に移行します。詳細については、React Nativeのサポートポリシーを参照してください。