本日、React Native 0.80のリリースを発表できることを嬉しく思います!このリリースでは、React NativeにバンドルされているReactのバージョンを最新の安定版である19.1.0に更新しました。また、JS APIの安定性向上も含まれています:deep importsに警告が表示されるようになり、より正確で安全に使用できる型を提供する新しいオプトイン形式のStrict TypeScript APIを提供しています。さらに、React NativeのLegacy Architectureが正式に凍結され、Legacy Architectureを完全に廃止した際に動作しなくなるAPIに対する警告が表示されるようになります。
ハイライト
- JavaScript deep importsの非推奨化
- Legacy Architectureの凍結と警告
- React 19.1.0
- 実験的機能 - React Native iOSの依存関係がプリビルド化
JavaScript deep importsの非推奨化
このリリースでは、React NativeのパブリックJavaScript APIの改善と安定化を進めています。その第一歩として、アプリやフレームワークがインポート可能なAPIのスコープをより適切に定義しています。これに伴い、React Nativeからのdeep importsを正式に非推奨化し([RFC参照](see RFC))、ESLintとJSコンソールを通じて警告を導入しています。
これらの警告は、プロジェクトのソースコード内からのインポートに限定され、オプトアウトすることも可能です。ただし、将来のリリースでReact NativeのAPIからdeep importsを削除することを目指しており、代わりにルートインポートに更新する必要があることにご注意ください。
import { Alert } from 'react-native/Libraries/Alert/Alert';
import { Alert } from 'react-native';
一部のAPIはルートでエクスポートされておらず、deep importsなしでは利用できなくなります。これは、React Native APIの全体的な表面積を削減するための意図的な変更です。ユーザーの問題に対するオープンなフィードバックスレッドがあり、少なくとも次の2つのReact Nativeリリースにわたって、コミュニティと協力してエクスポートするAPIを最終決定していきます。ぜひフィードバックをお寄せください!
この変更の詳細については、専用の投稿をご覧ください:[Moving Towards a Stable JavaScript API](Moving Towards a Stable JavaScript API)
オプトイン形式のStrict TypeScript API
上記のパブリックAPIエクスポートの再定義に伴い、0.80ではreact-nativeパッケージ用の新しいTypeScript型セットも提供しています。これを「Strict TypeScript API」と呼んでいます。
Strict TypeScript APIへのオプトインは、React Nativeの将来の安定したJavaScript APIのプレビューです。これらの新しい型は:
- ソースコードから直接生成 — カバレッジと正確性が向上し、より強力な互換性保証が期待できます
- React Nativeのindexファイルに制限 — パブリックAPIをより厳密に定義し、内部ファイル変更時にAPIを破壊しないことを意味します
これらは既存の型と並行して提供されるため、準備ができたときに移行を選択できます。また、標準的なReact Native APIを使用している場合、多くのアプリは変更なしで検証されるはずです。
早期採用者や新規作成されたアプリには、tsconfig.jsonファイルを通じてオプトインすることを強く推奨します。コミュニティの準備が整ったら、Strict TypeScript APIが将来のデフォルトAPIとなり、deep imports削除と同期されます。
この変更の詳細については、専用の投稿をご覧ください:[Moving Towards a Stable JavaScript API](Moving Towards a Stable JavaScript API)
Legacy Architectureの凍結と警告
React NativeのNew Architectureはバージョン0.76以降のデフォルト選択肢であり、それから大きな恩恵を受けるプロジェクトやツールの成功事例を読んでいます。最近、Legacy Architectureを凍結したと考えていることを共有しました。Legacy Architectureでの新しいバグ修正や機能開発は行わず、リリース作業中のLegacy Architectureのテストも停止します。
移行をスムーズにするため、バグや回帰を経験している場合は、ユーザーがNew Architectureをオプトアウトすることを引き続き許可しています。しかし、React Nativeで2つのアーキテクチャを提供することは大きな課題であり、ランタイムパフォーマンス、アプリサイズ、コードベースのメンテナンスに影響を与えます。そのため、将来的にはLegacy Architectureを廃止する必要があります。
0.80では、New Architectureで動作しないAPIを使用している場合にReact Native DevToolsでポップアップする一連の警告を追加しました。これらの警告を無視せず、将来に備えてアプリとライブラリをNew Architectureに移行することを検討することをお勧めします。
これらの変更の詳細については、最近App.jsで発表した講演「Life After Legacy: The New Architecture Future」をご覧ください。
React 19.1.0
このReact Nativeリリースには、最新のReact安定版19.1.0が含まれています。
React 19.1.0で導入されたすべての新機能とバグ修正については、リリース説明をお読みください。
警告
React 19.1.0の注目すべき機能の1つは、owner stacksの実装と改善です。これは開発専用機能で、特定のエラーの原因となるコンポーネントを特定するのに役立ちます。ただし、React Native Babel Presetでデフォルトで有効になっている@babel/plugin-transform-function-name Babelプラグインを使用している場合、owner stacksがReact Nativeで期待通りに動作しないことを認識しています。この修正は、React Nativeの将来のリリースで提供予定です。
実験的機能 - React Native iOSの依存関係がプリビルド化
React Native iOSアプリをビルドしている場合、最初のネイティブビルドに時間がかかることに気づいているでしょう:数分、または古いマシンではそれ以上かかります。これは、React Native iOS全体のコードとそのすべての依存関係をコンパイルする必要があるためです。
過去数週間にわたって、Androidで起こっていることと同様に、React Native iOSアプリを初回実行する際のビルド時間を短縮するため、React Nativeコアの一部をiOS向けにプリビルドする実験を行ってきました。
React Native 0.80は、ビルド時間短縮を支援するため、React Native for iOSの一部をプリビルドとして提供できる最初のリリースです。React Nativeのリリースプロセス中に、React Nativeが依存する第三者依存関係のみのプリビルド版であるReactNativeDependencies.xcframeworkというXCFrameworkを作成しています。
このiOS向け初期プリビルドがどの程度時間を節約するかを実験・ベンチマークした結果、M4マシンで実行したベンチマークでは、iOSビルドがソースからビルドするよりもプリビルドで約12%高速化されました。
経験上、ユーザーからのバグレポートの多くが、React Nativeの第三者依存関係に関連するビルド問題によって引き起こされていることも観察しました(例:#39568)。第三者依存関係をプリビルドすることで、これらを代わりにビルドするため、これらのビルド問題に直面することがなくなります。
React Native全体をプリビルドしているわけではないことにご注意ください:Metaが直接制御していないライブラリ(FollyやGLogなど)のみをプリビルドしています。将来のリリースでは、React Nativeコアの残りの部分もプリビルドとして提供予定です。
使用方法
この機能はまだ実験的であるため、デフォルトでは有効になっていません。使用したい場合は、RCT_USE_RN_DEP環境変数を追加してpodsをインストールできます:
RCT_USE_RN_DEP=1 bundle exec pod install
または、すべての開発者に対して有効にしたい場合は、Podfileを次のように変更できます:
if linkage != nil
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
use_frameworks! :linkage => linkage.to_sym
end
+ ENV['RCT_USE_RN_DEP'] = '1'
target 'HelloWorld' do
config = use_native_modules!
プリビルドがあなたやあなたのアプリに引き起こす可能性のある問題については、このディスカッションで報告してください。これらを調査し、その使用がアプリに対して透明であることを確実にすることをお約束します。
その他の変更
Android - IPOによるAPKサイズの削減
このリリースでは、React NativeでビルドされたすべてのAndroidアプリのサイズが大幅に削減されます。0.80以降、React NativeとHermesの両方のビルドでInterprocedural Optimizationを有効にしました。これにより、すべてのAndroidアプリで約1MBの節約が実現されました。
React Nativeバージョンを0.80に更新するだけでこのサイズ削減効果を得ることができ、プロジェクトへの追加変更は不要です。
New App Screenの再設計
Expoを使用せず、Community CLI & Templateを使用している場合、このバージョンではNew App Screenを独自のパッケージに移動し、新しいデザインを適用しました。これにより、Community Templateで新しいアプリを作成する際の初期コードボイラープレートが削減され、大画面で表示する際のエクスペリエンスも向上します。
JSCコミュニティサポートに関する通知
React Native 0.80は、ファーストパーティJSCサポートを提供するReact Nativeの最後のバージョンです。JSCのサポートは、コミュニティメンテナンスパッケージ@react-native-community/javascriptcoreを通じて提供されます。
発表を見逃した場合は、こちらで詳細をお読みください。
破壊的変更
メインパッケージに"exports"フィールドを追加
JS Stable API変更の一環として、react-nativeのpackage.jsonマニフェストに"exports"フィールドを導入しました。0.80では、このマッピングはデフォルトですべてのJavaScriptサブパスを公開し続けるため、大きな破壊的変更にはならないはずです。
同時に、これはreact-nativeパッケージ内のモジュール解決方法に微妙な影響を与える可能性があります:
- Metroでは、プラットフォーム固有の拡張子が"exports"マッチに対して自動展開されません。これに対応するため、多数のshimモジュールを提供しています(#50426)
- Jestでは、deep importsをモックする機能が変更される可能性があり、テストの更新が必要になる場合があります
その他の破壊的変更
このリストには、製品コードに軽微な影響を与える可能性があり、注目に値するその他の破壊的変更が含まれています:
JS
eslint-plugin-react-hooksをv4.6.0からv5.2.0にバンプしました(完全なchangelogはこちら)。react-hooksリントルールが新しいエラーシグナルを生成する可能性があり、修正または抑制する必要があります
Android
- このリリースでは、React Nativeに同梱されるKotlinバージョンを2.1.20にバンプしました。Kotlin 2.1では、モジュール/コンポーネントで使用を開始できる新しい言語機能がプレビューで導入されています。詳細は公式リリースノートをお読みください
StandardCharsetsクラスを削除しました。0.73以降非推奨でした。代わりにjava.nio.charset.StandardCharsetsクラスを使用してください
- 複数のクラスを内部化しました。これらのクラスはパブリックAPIの一部ではなく、アクセスすべきではありません。影響を受けるライブラリには既に通知またはパッチを提出しています:
com.facebook.react.fabric.StateWrapperImpl
com.facebook.react.modules.core.ChoreographerCompat
com.facebook.react.modules.common.ModuleDataCleaner
- 複数のクラスをJavaからKotlinに移行しました。これらのクラスを使用している場合、一部のパラメータのnull許可性と型が変更されたため、コードの調整が必要になる場合があります:
com.facebook.react.devsupport内のすべてのクラス
com.facebook.react.bridge.ColorPropConverter
com.facebook.react.views.textinput.ReactEditText
com.facebook.react.views.textinput.ReactTextInputManager
iOS
RCTUtils.hからRCTFloorPixelValueフィールドを削除しました - RCTFloorPixelValueメソッドはReact Nativeで使用されておらず、完全に削除しました
その他の小さな破壊的変更は、0.80のCHANGELOGに記載されています。
謝辞
React Native 0.80には、127人の貢献者による1167以上のコミットが含まれています。すべてのハードワークに感謝します!
このリリースで重要な貢献を行った以下のコミュニティメンバーに特別な感謝を送りたいと思います:
- Christian Falch:React Native Dependencies用iOSプリビルドの作業
- Iwo Plaza、Jakub Piasecki、Dawid Małecki:Strict TypeScript APIの作業
さらに、このリリース投稿の機能文書化に取り組んだ追加の著者にも感謝します:
- Riccardo Cipolleschi:React Native Dependencies用iOSプリビルド関連部分の執筆
- Alex Hunt:Deep imports非推奨化、オプトイン形式Strict TypeScript API、New App Screen再設計
- Nicola Corti:Legacy Architecture凍結と警告
0.80へのアップグレード
既存プロジェクトについては、[React Native Upgrade Helper](React Native Upgrade Helper)を使用してReact Nativeバージョン間のコード変更を確認し、アップグレードドキュメントも併せてご利用ください。新しい