Facebookは先頃、初の大規模なブラウザAPIのコントリビューションを発表した。新しいisInputPending APIは、ユーザ入力からブラウザによる処理までの時間を短縮することによる、高度にインタラクティブなアプリケーションのユーザーエクスペリエンス向上を目的とする。
新たに提案されたnavigator.scheduling.isInputPending
ブラウザAPIは、ディスパッチスケジュールされた入力イベントがブラウザにある場合にtrueを返す関数isInputPending
を公開する。APIコンシューマは、適切なパラメータでこの関数を呼び出すことにより、チェック対象とするイベントタイプ(タッチイベントやキーイベントなど)を指定することもできる。
発表のブログ記事では、FacebookのNate Schloss氏とAndrew Comminos氏が、次のような使用例を紹介している。このスクリプトには、計算処理を中断してブラウザが入力を処理するためのロジックが含まれている。
while (workQueue.length > 0) {
if (navigator.scheduling.isInputPending(['mousedown', 'mouseup', 'keydown', 'keyup'])) {
// Stop doing work if we think we'll start receiving a mouse or key event.
break;
}
let job = workQueue.shift();
job.execute();
}
提案されたAPIでは、ブラウザに実行が渡るのは、必要性のある場合に限定される。メインスレッドで長いスクリプトを実行する場合、対話性への影響を軽減する一般的な方法として、任意に定義された間隔でブラウザに戻る、というものが他にある。しかしながら、特に大規模なスクリプトをページにロードする必要のあるフレームワークの場合には、処理すべき入力がない時にもブラウザに実行を譲るのは非効率だ。Facebookは次のように説明する。
実行移譲の頻度が高過ぎると、ページの読み込みが遅くなります。頻度が低ければ、ユーザイベントへの応答に時間がかかり、ユーザが不満を持ちます。
もうひとつの方法は、Background Tasks API、特にrequestIdleCallback()
APIを使用して、ブラウザがアイドル状態のときにスクリプトを実行することだ。ただし、このAPIは、優先度が高くないタスク用に設計されているため、このアプローチにも提案で説明しているような問題がある。
さまざまなUIコンポーネントの動作を登録するような例では、アイドル状態になるまでUIコンポーネントの登録を待つ訳にはいきません。
このような状況において、新しいAPIは、タスクを可能な限り早く完了させると同時に、入力から作用(一般的にはDOMの変更)までの時間的遅れをユーザに気付かせずにブラウザが入力イベントを処理できるような、協調的なスケジューリングソリューションの提供を試みる。
新しいisInputPending APIは、初期トライアル版としてChrome 74に含まれている。Facebookの説明によると、
初期トライアルにより、開発者にとってこのAPIがどの程度重要であるかを知ることができます。これは、Web上のすべてのブラウザベンダにとって重要な情報であり、このAPIに関する今後の議論を形成するものになります。
新APIは、Microsoft、Apple、Google、Mozillaなど主要なブラウザベンダがサポートするプラットフォームであるW3CのWeb Platform Incubator Community Group (WICG)を通じて公開され、新機能に関する意見の交換が行われることになる。対応するWICG提案には、APIの背景にある論理的根拠と、満足する必要のある制約、プライバシとセキュリティに関して生じる問題が詳述されている。
フィードバックが肯定的なものであれば、新APIは、Chromeや他のブラウザでも利用可能になる可能性がある。Facebookは、さらに新たなAPIを、将来的に提供する可能性があることを示唆している。
isInputPendingは、スケジューリングプリミティブをWebに組み込むための大きな活動の一部です。最終的には、開発者がブラウザのタスクキューにさらに深く統合し、ブラウザにさまざまなネットワークリクエストやタスクの優先順位に関する洞察を与えられるようなブラウザツールになることを期待しています。
開発者は登録すれば、初期トライアルに関するフィードバックを共有できる。