Facebookは米国時間4月22日、GoogleのChromeブラウザのAPIに対して、初めて大きな貢献を果たしたことを発表した。
Facebookのチームは、Googleと共同で、ブラウザにコードを提供するためのAPIプロポーザルを作成した。これはFacebookとしては初めてのこと。このコードは、ウェブ上のツールや標準に関するFacebookの他の多くの仕事と同様に、ユーザー体験をスムーズかつ高速にすることを目指したもの。このAPIの場合、ユーザーがクリック、またはキーを操作してから、ブラウザが応答するまでの時間を短縮する。
この新しいシステムの最初の試験的な実装はChrome 74とともにリリースされる予定だ。
一般的に、ブラウザのJavaScriptエンジンは、コードの実行を制御している。そして、応答しなければならない入力が保留になっていないかどうかを確認するため、一瞬コードの実行を停止することもある。マルチコアのマシンで動作する最新のJavaScriptエンジンも、基本的にはシングルスレッドで動作する。そのため、実際にはエンジンは1度に1つのことしか実行できない。そこで、入力イベントを確認しつつ、コードの実行をどのように組み合わせるかということがカギとなる。
「他の多くのサイトと同様に、私たちもJavaScriptを小さなブロックに分割することでこの問題に対処しています。ページがロードされている間も、若干のJavaScriptを実行し、その後にブラウザに制御を戻すのです」と、Facebookチームは発表の中で説明している。「ブラウザは、そこで入力イベントのキューをチェックして、ページに通知する必要のあるものがあるかどうかを確認できます。その後ブラウザは、JavaScriptのブロックが読み込まれる都度、それらを実行する動作に戻ります」。
ブラウザがこのようなサイクルで動作している際に、新しいイベントをチェックして、その処理に入ると、わずかながら余計な時間がかかる。それが何度も積み重なると、ページのロードが遅くなる。とはいえ、入力のチェックのインターバルを長くすると、こんどはブラウザの応答が鈍くなるので、ユーザー体験が劣化してしまう。
これを解決するため、FacebookのエンジニアはisInputPendingというAPIを作成した。これにより、上のようなトレードオフをする必要がなくなる。Facebookは、このAPIを、W3Cのウェブパフォーマンスのワーキンググループにも提案した。これを利用すれば、デベロッパーは保留中の入力があるかどうかを、コードの実行中に確認できる。
これにより、コードは応答すべきものがあるかどうかを自分でチェックできるようになる。ブラウザに完全に制御を戻さなくてもよく、さらにそこからJavaScriptエンジンに入力を引き渡す必要もない。
現時点ではこれはまだ試験的なもの。デベロッパーは、このAPIを自分のコードに組み込む必要があるため、Chrome 74のリリース後に、自動的にブラウザの動作が速くなるというわけではない。この試行が成功すれば、もちろんデベロッパーはこのAPIを利用するようになるだろうし(もちろんFacebookは自ら利用するだろう)、他のブラウザベンダーもそれぞれのエンジンにこのAPIを実装するようになるはずだ。
「ChromeにisInputPendingを導入するプロセスは、Facebookにおいてウェブ標準を開発する新しい方法を象徴するものです」とチームは言う。「私たちは今後も新しいAPIに取り組み続け、オープンソースのウェブブラウザへの貢献を増強したいと考えています。将来的には、このAPIをReactのコンカレントモードに直接組み込むことも可能となるでしょう。そうすれば、デベロッパーはこのAPIのメリットを、自動的に享受できるようになります。さらに、isInputPendingは、スケジューリングに関するプリミティブをウェブに導入するという大きな流れの一環なのです」。
画像クレジット:Getty Images上のAlexander Koerner/Getty Images
[原文へ]
(翻訳:Fumihiko Shibata)