React Nativeの最新バージョンでは、iOSでのHermes JavaScriptエンジンのサポートを追加し、React 17に移行する。
Hermesは、AndroidでのReact Nativeアプリの実行を最適化するためにFacebookが作成した軽量のJavaScriptエンジンである。Hermesが約束する主な利点は、アプリ起動の高速化と事前のコード最適化である。これは、バイトコードサイズと実行時パフォーマンスの改善が目的である。
Hermesは、React Nativeを実行するために最適化されたオープンソースのJavaScriptエンジンです。メモリ使用率を減らし、ダウンロードサイズを小さくし、アプリが使用可能になるまでの時間、あるいは「操作可能になるまでの時間」(TTI)を減らすことで、パフォーマンスを改善しています。
以前はAndroidでのみ利用可能であったが、HermesはiOSのReact Nativeアプリでも使用できるようになった。既存のプロジェクトをHermesに切り替える前に、React Native 0.64を使用するようにプロジェクトをアップグレードし、すべてが期待どおりに機能することを確認する必要がある。その後、ポッドファイルでhermes_enabled
をtrue
に設定することで、iOSでHermesを有効にできる。Androidでは、android/app/build.gradle
ファイルにenableHermes: true
を追加することで、Hermesを有効にできる。
React NativeアプリをHermesに移動する前に、すべての依存関係に互換性があり、サポートされていない機能を使用していないことも確認する必要がある。この点でも、React Native 0.64では、react-native-firebase
や状態管理パッケージmobx
などのパッケージとの互換性に必要なProxyのサポートが追加されており、改善されている。
最後の注意として、Hermesリリースは特定のReact Nativeバージョンに厳密に関連付けられているため、常に対応するバージョンを使用する必要がある。
起動時間を改善することを目的としたReact Native 0.64におけるもう1つの変更は、デフォルトでインラインrequire
が有効になることである。このオプションは以前のMetroバージョンにすでに存在していたが、オプトインとして利用可能であった。つまり、インライン要求は、JavaScriptモジュールの実行を、起動時にロードするのではなく、実際に使用される瞬間まで遅らせる。
前述のように、React Native 0.64はReact 17に移行する。そこには開発者向けの新しい機能の追加はない。React 17は主に、既存のアプリを新しいReactバージョンにアップグレードするプロセスを簡素化するための基盤を構築している。これは、1つのページで2つの異なるバージョンのReactを混在させることで実現される。これにより、アプリのコンポーネントをコンポーネントごとにアップグレードできる。内部的には、React 17では、イベント移譲の動作方法が変更されている。その方法は、document
レベルではなく、ReactがレンダリングされるルートDOMコンテナーにイベントハンドラーをアタッチするように変更されている。この変更により、異なるReactバージョンを共存させることができるが、一部のアプリでは後方互換性がなくなる可能性もある。