React Native 0.84 リリース
本日、React Native 0.84 をリリースします!このリリースでは、Hermes V1 が iOS と Android のデフォルト JavaScript エンジンになり、すべての React Native アプリで大幅なパフォーマンス向上が期待できます。さらに、iOS でプリコンパイル済みバイナリをデフォルトで提供するようになり、iOS/Android ともにレガシーアーキテクチャの削除を継続しています。
ハイライト
- Hermes V1 をデフォルトに
- iOS でのプリコンパイル済みバイナリをデフォルトで提供
- レガシーアーキテクチャコンポーネントの削除
- Node.js 22 を最低要件に
Hermes V1 をデフォルトに
Hermes V1 は React Native の iOS / Android 両プラットフォームでデフォルトの JavaScript エンジンになりました(React Native 0.82 での実験的オプトインの後)。Hermes V1 はコンパイラと VM の改善により、計測可能な JavaScript 性能の向上を提供します。
何が意味するか
- 自動的なパフォーマンス向上: すべてのアプリはデフォルトで Hermes V1 を使用し、実行速度の向上とメモリ使用量の削減が見込まれます。
- マイグレーション不要: すでに Hermes を使用している場合(デフォルトは 0.70 以降)、Hermes V1 が自動的に有効になります。追加の設定は不要です。
Hermes V1 をオプトアウトする方法
-
パッケージマネージャのオーバーライド
- npm(
package.json の overrides)
"overrides": { "hermes-compiler": "0.15.0" }
- yarn(
package.json の resolutions)
"resolutions": { "hermes-compiler": "0.15.0" }
- pnpm(
package.json の pnpm.overrides)
"pnpm": { "overrides": { "hermes-compiler": "0.15.0" } }
-
iOS
- CocoaPods 依存関係をインストールする際に環境変数を渡します:
RCT_HERMES_V1_ENABLED=0 と RCT_USE_PREBUILT_RNCORE=0
-
Android
android/gradle.properties に hermesV1Enabled=false を追加し、React Native をソースからビルドするようにアプリケーションを構成します。
iOS のプリコンパイル済みバイナリをデフォルトで提供
React Native 0.84 は iOS でプリコンパイル済みの .xcframework バイナリをデフォルトで配布します。以前はオプトインだったこの仕組みがデフォルト化され、iOS アプリのビルド時間が大幅に短縮されます。クリーンビルドのたびに React Native コアをソースからコンパイルする必要がなくなり、pod install 時にプリコンパイル済みバイナリが自動ダウンロードされて使用されます。
- ソースからビルドする必要がある(例: Hermes V1 をオプトアウトする)場合は、
pod install 実行時に RCT_USE_PREBUILT_RNCORE=0 を設定してプリビルトを無効化してください。
レガシーアーキテクチャコンポーネントの削除
0.82 で開始した作業(New Architecture を唯一のランタイムオプションにした)を踏まえ、0.84 では iOS と Android 両方からレガシーアーキテクチャのコードをさらに削除しています。RFC に記載のとおり、各リリースで複数のレガシークラスを削除しています。
iOS
- 0.83 で導入した実験的フラグ
RCT_REMOVE_LEGACY_ARCH によるレガシーコードのコンパイル除外は、0.84 でデフォルトの挙動になりました。iOS ビルドにレガシーアーキテクチャコードは含まれず、ビルド時間とアプリサイズが削減されます。
- New Architecture 上にあるアプリに対しては破壊的変更は見込まれていません。互換性のために必要な Interop Layer のコードは残されています。
iOS でレガシーアーキテクチャコードを再有効化するには
- ソースからビルドする必要があります。CocoaPods の依存をインストールする際に以下のフラグを指定してください:
RCT_USE_PREBUILT_RNCORE = 0
RCT_REMOVE_LEGACY_ARCH = 0
Android
- 削除されたレガシーアーキテクチャクラス(主なもの):
com.facebook.react.LazyReactPackage
com.facebook.react.bridge.CxxModuleWrapper
com.facebook.react.bridge.CxxModuleWrapperBase
com.facebook.react.bridge.CallbackImpl
com.facebook.react.bridge.NotThreadSafeBridgeIdleDebugListener
com.facebook.react.bridge.OnBatchCompleteListener
com.facebook.react.bridge.ReactCxxErrorHandler
com.facebook.react.bridge.ReactInstanceManagerInspectorTarget
com.facebook.react.modules.debug.DidJSUpdateUiDuringFrameDetector
com.facebook.react.devsupport.BridgeDevSupportManager
com.facebook.react.uimanager.NativeKind
com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener
com.facebook.react.uimanager.layoutanimation.LayoutAnimationController
com.facebook.react.uimanager.layoutanimation.LayoutAnimationListener
Node.js 22 以上が最低要件に
React Native 0.84 は Node.js v22.11 以降を要求します。これにより、React Native ツールチェーン全体でモダンな JavaScript 機能の利用が向上します。アップグレード前に Node.js のバージョンを更新してください。nvm や fnm といった Node バージョンマネージャの使用を推奨します。
その他の変更
- React 19.2.3 を React Native に同期しています。
- ESLint v9 Flat Config のサポートを追加し、最新の ESLint ツール導入が容易になりました。
プラットフォームサポート
- 画像フォーマット: HEIC および HEIF のサポートを追加しました。
- PlatformColor: アニメーション補間や出力レンジにおける PlatformColor のテストとサポートを強化しました。
- Android のキーボードイベント:
onKeyDown / onKeyUp を追加し、ハードウェアキーボードや TV リモコンのキーイベント処理を可能にしました。
アクセシビリティ
Text コンポーネントに onPress や onLongPress ハンドラがある場合、自動的に accessibilityRole="link" が付与されるようになり、スクリーンリーダーでの案内が改善されます。
- Android では、リサイクルされるビューに対するアクセシビリティ状態の問題を修正しました。ビューのリサイクル時に
isClickable や OnClickListener の状態が適切にリセットされるようになり、スクリーンリーダーが誤った状態を読み上げることを防ぎます。
URL API の改善
URL に標準プロパティ(hash, host, pathname など)を追加しました。
URLSearchParams にメソッド(get, set, delete など)を追加し、Web 標準に近づけました。URLSearchParams の重複エントリ問題も修正済みです。
その他の破壊的変更
iOS
ImageResponseObserverCoordinator の稀な EXC_BAD_ACCESS クラッシュを、オブザーバを参照カウントされたポインタでラップすることで修正しました。これにより RCTImage のオブザーバ API のオブジェクト宣言が変わるため、react-native-svg のような依存ライブラリに影響が出る可能性があります。
Android
BridgeDevSupportManager を削除しました。
C++
JSBigString が直接 jsi::Buffer を実装します。BigStringBuffer の仲介は削除(現在は非推奨)されました。BigStringBuffer を直接サブクラス化または依存しているコードは更新が必要になる場合があります。
JS
- インアプリの Element Inspector から従来の
Perf と Network タブを削除しました。これらの機能は現在 React Native DevTools から利用できます。
詳細な破壊的変更は 0.84 の CHANGELOG を参照してください。
非推奨
- Networking:
XHRInterceptor と WebSocketInterceptor API は非推奨になりました。開発者ツールは Chrome DevTools Protocol (CDP) の Network ドメインを使用してください。
- TurboModules:
TurboModuleProviderFunctionType が非推奨になりました。
謝辞
React Native 0.84 には 95 人のコントリビュータによる 650 を超えるコミットが含まれています。ご協力ありがとうございました!
特に本リリースで重要な貢献をしてくださった方々:
- Riccardo Cipolleschi — iOS のプリコンパイル済みバイナリのデフォルト化と iOS におけるレガシーアーキテクチャの削除
- Rob Hogan — Node.js 22 へのバージョン引き上げ
- Fabrizio Cucci — Android のアクセシビリティ改善
- @pipopotamasu — ESLint v9 Flat Config サポート
0.84 へのアップグレード
- 情報: 0.84 は現在の最新安定版です。0.81.x はサポート対象外になります。詳細は React Native のサポートポリシーを参照してください。
アップグレード手順
- 既存プロジェクトのバージョン間のコード差分を見るには React Native Upgrade Helper と Upgrading ドキュメントを参照してください。
- 新機能: Community CLI Projects 向けの実験的な
upgrade-react-native AI スキルを試すことができます。
新しいプロジェクトを作成する
npx @react-native-community/cli@latest init MyProject --version latest
Expo
- Expo プロジェクト向けには、React Native 0.84 は
expo@canary リリースの一部として利用可能になります。次の SDK(SDK 56)は、次の安定版 React Native リリース 0.85 とともに提供される予定です。