ClaudeReact Native2025/10/08 0:00

React Native 0.82 - A New Era

要点だけを先に読めるように短く再構成したセクションです。

元記事

Quick Digest

要約

要点だけを先に読めるように短く再構成したセクションです。

claudejamodel: claude-sonnet-4-20250514

React Native 0.82 - New Architecture完全移行とHermes V1実験的サポート

Key Points

  • New Architectureのみで動作する初のバージョン
  • 実験的Hermes V1でTTI最大9%改善
  • DOM Node APIでWeb互換性向上

Summary

React Native 0.82は、New Architectureのみで動作する初のバージョンです。Legacy Architectureは完全に無効化され、実験的なHermes V1サポート、React 19.1.1への更新、DOM Node APIサポートが追加されました。

Key Points

  • New Architecture完全移行: Legacy Architectureの設定は無視され、すべてのアプリがNew Architectureで動作
  • Hermes V1実験的サポート: バンドル読み込み時間とTTIの大幅な改善(最大9%高速化)
  • React 19.1.1対応: owner stacksの完全サポートとuseDeferredValue/startTransitionの信頼性向上
  • DOM Node APIs: ネイティブコンポーネントがDOM-likeなAPIを提供(getBoundingClientRect等)
  • Android debugOptimized: 開発時のパフォーマンス向上(20FPSから60FPSへ改善)
  • Web Performance APIs: performance.now()やPerformanceObserverなどのWeb標準API実装(Canaryのみ)

Breaking Changes

  • 未処理のPromise rejectionがconsole.errorで報告される
  • ReactNativeFeatureFlagsがsrc/privateに移動
  • Appearance.setColorScheme()でnull値が非対応('unspecified'を使用)

Full Translation

翻訳

原文の流れを保ったまま読める翻訳セクションです。

claudejamodel: claude-sonnet-4-20250514

React Native 0.82 - 新時代の始まり

本日、React Native 0.82をリリースできることを嬉しく思います。これは完全にNew Architectureで動作する初のReact Nativeです。これはReact Nativeにとってマイルストーンとなるリリースであり、新時代の始まりだと信じています。今後のバージョンでは、インストールサイズを削減し、コードベースを合理化するために、Legacy Architectureの残りのコードを削除していく予定です。さらに、0.82では、Hermes V1と呼ばれる新しいバージョンのHermesへの実験的なオプトインも提供されます。また、Reactのバージョンを19.1.1に更新することで複数のReact機能を有効にし、DOM Node APIのサポートも提供します。

ハイライト

  • New Architectureのみ
  • 実験的なHermes V1
  • React 19.1.1
  • DOM Node APIs

New Architectureのみ

React Native 0.76では、New ArchitectureがReact Nativeのデフォルトアーキテクチャになったことを発表しました。それ以来、New Architectureはテストと改良が重ねられ、このバージョンと今後のバージョンのReact Nativeで唯一のアーキテクチャにすることに確信を持っています。

これは、AndroidでnewArchEnabled=falseを設定しようとしても、またはiOSでRCT_NEW_ARCH_ENABLED=0でCocoaPodsをインストールしようとしても、これらは無視され、アプリは依然としてNew Architectureを使用して実行されることを意味します。

移行方法

プロジェクトをNew Architectureに移行していない場合は、まずプロジェクトをReact Native 0.81またはExpo SDK 54に移行することをお勧めします。これらはLegacy Architectureの使用を許可する最後のバージョンです。これらには、New Architectureへの移行を支援するための警告とパフォーマンス改善が特別に含まれています。

次に、0.81でNew Architectureを有効にし、アプリケーションが正常に動作することを確認してください。0.81でNew Architectureを使用している場合は、Legacy Architectureの有効化を防ぐReact Native 0.82に安全に更新できます。

互換性のないサードパーティの依存関係がNew Architectureへの移行を妨げている場合は、ライブラリのメンテナーに直接連絡することをお勧めします。React Nativeコアのバグが移行を妨げている場合は、issue trackerを通じてご連絡ください。

Interop Layersとサードパーティライブラリの互換性

Interop layersは当面の間、コードベースに保持されます。Interop layersで必要なすべてのクラスと関数は、すぐには削除されません。Interop Layersの削除に関する詳細な更新は今後共有します。

また、両方のアーキテクチャとの後方互換性を提供するサードパーティライブラリは、New Architectureが唯一のアーキテクチャである0.82でも引き続き動作することを確認しています。

Legacy Architectureクラスの削除

後方互換性を確保し、破壊的変更を減らすため、このバージョンではReact NativeのコアからLegacy ArchitectureのAPIを削除していません。Legacy Architectureの削除により、全体的なバンドルサイズを大幅に節約できるため、削除はReact Nativeの次のバージョンから開始される予定です。

詳細については、RFC0929: Removal of the Legacy Architecture of React Nativeをご覧ください。

実験的なHermes V1

React Native 0.82では、Hermes V1へのオプトインサポートが追加されました。Hermes V1はHermesの次の進化です。私たちは内部的にアプリでそれを実験してきており、今度はコミュニティにも試してもらう時が来ました。

コンパイラとVMの改善により、Hermesのパフォーマンスが向上します。初期のテストとベンチマークから、Hermes V1は様々なシナリオで現在のHermesを上回る性能を示しています。バンドル読み込みとTTIの改善が見られました。改善は、アプリの詳細に大きく依存します。

実世界の複雑なアプリケーションであるExpensifyアプリでは、以下の改善が見られました:

メトリックAndroid(ローエンドデバイス)iOS
Bundle Load Time3.2%高速9%高速
Total TTI7.6%高速2.5%高速
Content TTI7.2%高速7.5%高速

Total TTIでは、バンドル読み込みからアプリの最初の画面がレンダリングされ、インタラクティブになるまでの時間を測定しました。Content TTIでは、コンポーネント自体の最初のレンダリングから、コンポーネントがインタラクティブになるまでの時間を測定しました。

Hermes V1には、JS-to-nativeコンパイル(以前は「Static Hermes」として知られていた)やReact Native EU 2023で発表されたJITコンパイルはまだ含まれていません。これらの機能はまだテスト中であり、進展があり次第共有します。

Hermes V1の有効化方法

info
Hermes V1が実験段階にある間は、それを試すためにReact Nativeをソースからビルドする必要があります。Hermes V1が将来のReact Nativeバージョンでデフォルトとして出荷されると、この制限は解除されます。

自分のプロジェクトでHermes V1を試すには、以下の手順を使用してください:

  1. package.jsonファイルの対応するセクションを変更して、パッケージマネージャーにHermes V1コンパイラパッケージの実験バージョンを解決するよう強制します(現在のバージョニング規則はHermes V1の実験段階のみのものです):

yarn

"resolutions": {
  "hermes-compiler": "250829098.0.1"
}

npm

"overrides": {
  "hermes-compiler": "250829098.0.1"
}
  1. android/gradle.properties内にhermesV1Enabled=trueを追加してAndroid用のHermes V1を有効にします:
hermesV1Enabled=true
  1. android/settings.gradleを編集してReact Nativeをソースからビルドするよう設定します:
includeBuild('../node_modules/react-native') {
  dependencySubstitution {
    substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid"))
    substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid"))
    substitute(project(":packages:react-native:ReactAndroid:hermes-engine")).using(module("com.facebook.hermes:hermes-android:250829098.0.1"))
  }
}
  1. RCT_HERMES_V1_ENABLED=1環境変数でpodsをインストールしてiOS用のHermes V1を有効にします:
RCT_HERMES_V1_ENABLED=1 bundle exec pod install

Hermes V1はプリコンパイルされたReact Nativeビルドと互換性がないため、podsをインストールする際にRCT_USE_PREBUILT_RNCOREフラグを使用しないでください。

アプリがHermes V1を実行していることを確認するには、アプリまたはDevToolsコンソール内で以下のコードを実行してください。このコードはHermesのバージョンを返し、ステップ1で指定したバージョン(250829098.0.1)と一致するはずです:

// Hermes V1では "250829098.0.1" を期待
HermesInternal.getRuntimeProperties()['OSS Release Version'];

React 19.1.1

このReact Nativeのリリースには、最新のReact安定版であるReact 19.1.1が含まれています。このReactのリリースには、React Native用のowner stacksの完全サポートが含まれています。

React Native 0.80で19.1.0のサポートを出荷した際、@babel/plugin-transform-function-name Babelプラグインを使用している場合、owner stacksが完全にサポートされていないと述べました。このリリースではこの制限が解除され、すべてのReact Nativeユーザーでowner stacksが有効になります。

BEFOREAFTER

React 19.1.1はまた、React NativeでのSuspense境界内でのuseDeferredValuestartTransitionの信頼性も向上させます。これらはアプリの応答性を向上させるために設計された重要なReact機能です。以前は、React NativeでSuspense境界と一緒に使用すると、両方とも誤ってfallbackコンポーネントを表示していました。React 19.1.1では、React Native上で期待通りに一貫して動作し、Webでの動作と一致します。

DOM Node APIs

React Native 0.82から、ネイティブコンポーネントはrefs経由でDOM風のノードを提供します。以前は、ネイティブコンポーネントはmeasuresetNativePropsなどの少数のメソッドのみを持つReact Native固有のオブジェクトを提供していました。このリリース後は、UIツリーの走査、レイアウトの測定など、Web上と同様にDOM APIのサブセットを実装するノードを提供します。

例:

function MyComponent(props) {
  const ref = useRef();
  
  useEffect(() => {
    const element = ref.current;
    
    // 新しいメソッド
    element.parentNode;
    element.parentElement;
    element.childNodes;
    element.children;
    
    const bounds = element.getBoundingClientRect();
    const doc = element.ownerDocument;
    const maybeElement = doc.getElementById('some-view');
    
    // レガシーメソッドは引き続き利用可能
    element.measure((x, y, width, height, pageX, pageY) => {
      /* ... */
    });
  }, []);
  
  return <View ref={ref} />;
}

さらに、これによりリーフテキストノード(Textコンポーネントによって作成される)とReact Nativeルートノードを表すドキュメントノードへのアクセスが公開されます。

新しいノードは引き続きレガシーメソッド(measureなど)を実装するため、これは後方互換性のある変更です。

詳細については、ドキュメントをご確認ください。

その他の変更

Web Performance APIs(Canary)

React NativeはWeb上で利用可能なperformance APIのサブセットを実装するようになりました:

  • High Resolution Time: performance.now()performance.timeOriginを定義
  • Performance Timeline: PerformanceObserverとperformanceオブジェクトのパフォーマンスエントリにアクセスするメソッド(getEntries()getEntriesByType()getEntriesByName())を定義
  • User Timing: performance.markperformance.measureを定義
  • Event Timing API: PerformanceObserverに報告されるイベントエントリタイプを定義
  • Long Tasks API: PerformanceObserverに報告されるlongtaskエントリタイプを定義

これらにより、実行時にアプリのパフォーマンスの様々な側面を追跡(テレメトリ用)でき、React Native DevToolsのパフォーマンスパネルで表示されます(React Nativeの将来のバージョンで利用可能)。

現在はcanary release levelでのみ利用可能で、React Nativeの将来のバージョンで安定版としてリリースされます。

Android用最適化デバッグビルドタイプ

React Native 0.82から、開発体験を高速化するためにdebugOptimizedビルドタイプを使用できるようになります。

従来、Androidは2つのデフォルトビルドバリアントを作成していました:

  • debug: 開発時にデフォルトで使用され、React Native DevTools、Metro、Android JVM、C++デバッガーなどの様々なデバッガーツールに接続可能
  • release: アプリケーションを本番環境に出荷する際に使用。完全に最適化され、難読化と最適化によりデバッグが困難

ほとんどのReact Native開発者は開発時にC++デバッガーを必要としないため、debugOptimizedビルドタイプを導入しました。debugOptimizedでは、複数のC++最適化が有効になったReact Nativeビルドを実行するため、アニメーションと再レンダリングが高速になります。同時に、JavaScriptコードをデバッグするためにReact Native Dev Toolsを引き続き使用できます。

debugOptimizedを使用する場合、C++ネイティブデバッガーは使用できませんが、debugビルドタイプを使用すれば引き続き使用できます。

アプリのdebugOptimizedバリアントを実行するには、以下を実行できます:

Community CLI

npx react-native run-android --mode debugOptimized

Expo

npx expo run:android --variant debugOptimized

info
debugOptimizedビルドタイプはReact Native 0.81とExpo SDK 54にもバックポートされています。

複数のアニメーションを画面上でレンダリングするこれらのサンプルで、debugOptimizedの動作を確認できます。debugビルドは約20FPSで実行されているのに対し、debugOptimizedは約60FPSで実行されています:

debugdebugOptimized

破壊的変更

キャッチされていないpromise rejectionがconsole.errorを発生させるようになりました

前のバージョンでキャッチされていないJavaScriptエラーの報告が改善されたことに続き、キャッチされていないpromiseもそのメカニズムを通じて報告されるようになります:

バグにより、これらは以前は完全に飲み込まれて無視されていたため、React Native 0.81にアップグレード後に既存のエラーが表面化することを予期してください。そのため、以前から存在していたエラーがバックエンドに報告されるJavaScriptエラーにも表面化し、新しいレポートの急増を引き起こす可能性があります。

その他の破壊的変更

全般

  • ReactNativeFeatureFlagsをsrc/privateに移動: 一般的に、ReactNativeFeatureFlagsはプライベートAPIであるため、まったく依存すべきではありません。
  • Appearance.setColorScheme()の型が更新され、null値を受け入れなくなりました: カラースキームをリセットする必要がある稀なケースでは、null/undefinedの代わりに'unspecified'を使用してください。

iOS

  • RCTDisplayLinkを移行しました