メインコンテンツへスキップ

デフォルトとしての Hermes

·5 分で読めます
Michael Leon
Michael Leon
Meta のソフトウェアエンジニア

昨年10月、私たちは Hermes をすべての React Native アプリのデフォルトエンジンにする ための作業を開始したことを発表しました

Hermes は Meta 内で React Native に多くの価値を提供しており、オープンソースコミュニティも恩恵を受けると信じています。Hermes はリソースが制約されたデバイス向けに設計されており、起動、アプリサイズ、メモリ消費量を最適化します。Hermes と他の JS エンジンとの重要な違いの 1 つは、JavaScript ソースコードを事前にバイトコードにコンパイルする機能があることです。このプリコンパイルされたバイトコードはバイナリ内にバンドルされ、アプリの起動時にインタプリタがこのコストのかかるステップを実行する必要をなくします。

発表以来、Hermes の改善に多くの作業が行われており、本日、**React Native 0.70 は Hermes をデフォルトエンジンとして出荷される**ことを発表できることを嬉しく思います。これは、v0.70 で開始されるすべての新しいプロジェクトで、Hermes がデフォルトで有効になることを意味します。7月でのロールアウトが近づいているため、私たちはコミュニティと密接に協力し、移行がスムーズに進み、すべてのユーザーに価値をもたらすようにしたいと考えています。このブログ記事では、この変更から期待できること、パフォーマンスベンチマーク、新機能などについて説明します。React Native 0.70 を待たずに Hermes の使用を開始できることに注意してください。**既存の React Native アプリで Hermes を有効にするには、これらの指示に従ってください**。

Hermes は新しい React Native プロジェクトでデフォルトで有効になりますが、他のエンジンのサポートは継続されることに注意してください。

ベンチマーク

アプリ開発者にとって重要な 3 つの異なるメトリクス (TTI、バイナリサイズ、メモリ消費量) を測定しました。テストには React Native アプリ Mattermost を使用しました。これらの実験は、2020 年のハイエンドハードウェアで Android と iOS の両方で実行しました。

  • TTI (Time to Interactive) は、アプリの起動からユーザーが操作できるようになるまでの時間です。このベンチマークでは、アプリのアイコンを押してから最初の画面が表示されるまでの時間として定義します。また、Mattermost の起動時の画面録画も示します。
  • バイナリサイズは、Android では APK サイズ、iOS では IPA サイズとして測定しました。
  • メモリ消費量のデータは、Mattermost アプリを数分間使用して収集しました。両方のエンジンでアプリ内で同じ操作が実行されました。

Android ベンチマークデータ

すべての Android テストは Samsung Galaxy S20 で実行されました。

Android Benchmarking Data

TTI ビデオ

Android TTI Video

iOS ベンチマークデータ

すべての iOS テストは iPhone 12 Pro で実行されました。

iOS Benchmarking Data

TTI ビデオ

iOS TTI Video

起動時間の違いをより明確に示すための TTI ビデオのスロー再生。

iOS Slowed Down TTI Video

React Native/Hermes の統合

私たちは、互換性の問題を引き起こし、新しい React Native バージョンをリリースする際に繰り返し発生する問題である、長年の問題に対処しました。React Native は CocoaPods および npm を介して配布されるプリビルドバイナリを介して Hermes に依存しており、API または ABI の非互換性が発生する可能性があります。この問題を解決するために、React Native 0.69 以降、Hermes は React Native のすべてのバージョンとともにビルドされます。これにより、各バージョンの React Native との完全な互換性が保証されます。また、これにより、より緊密な統合が実現します。これにより、機能の開発やバグ修正の展開のイテレーション時間が短縮され、Hermes に対する大きな変更が正しく行われることをより確信できるようになります。新しい統合の変更に関するより詳細な情報は、こちらにあります。

iOS Intl

幅広い言語依存機能を提供する ECMAScript Internationalization API である Intl の iOS 対応実装を完了しました。これは、一部の開発者が Hermes を使用できないようにしていた長年のギャップでした。Microsoft との提携により行われた Android 実装は、React Native 0.65 で出荷されました。React Native 0.70 では、開発者は両方のプラットフォームでネイティブサポートを利用できるようになります。

Intl の一般的な実装では、Unicode CLDR のような大きなルックアップテーブルやデータをインポートする必要があります。ただし、これは最大 6MB というサイズの大きな増加を伴う可能性があるため、Hermes のバイナリサイズが膨張するのを避けるために、iOS 自体が公開する API を呼び出すことによって Intl を実装しました。これは、iOS に付属しているすべてのロケールおよび国際化データを活用できることを意味します。

進行中の作業

Hermes の進化を続けるにあたり、私たちはコミュニティに、直近の優先事項を共有したいと考えています。それは、開発者のエクスペリエンスを向上させ、JavaScript の言語機能の欠如が原因で Hermes の利用を避ける人がいないようにすることです。具体的には、以下のことに取り組んでいます。

  • Chrome DevTools UI から直接サンプリングプロファイラーを実行できるようにします。
  • コミュニティから長らく要望があり、ポリフィルができないため、一部の開発者が Hermes の利用を妨げている可能性のあるBigIntのサポートを追加します。
  • 開発者に新しいメモリ管理コントロールを公開するWeakRefのサポートを追加します。

まとめ

Hermes がデフォルトになることは、長期的な道のりの始まりです。私たちは、コミュニティが今後長年にわたって効率的なアプリを作成できるようにするための新機能に取り組んでいます。また、バグ、質問、フィードバック、アイデアなどがあれば、GitHubリポジトリでご連絡ください。Hermes に固有の投稿に使用できるhermesラベルを作成しました。