Service Worker の登録

Service Worker の登録のタイミングに関するベスト プラクティス

サービス ワーカー ウェブアプリへの再訪問を大幅にスピードアップできますが、 Service Worker の初期インストールによって ユーザーの初回訪問時のエクスペリエンスを 向上させることができます

通常、Service Worker は 登録 最初のページの読み込みが終わるまでは そのコンテンツを最適化すると 特にネットワーク接続の遅いモバイル デバイスを使用しているユーザーに対しては、かなりの負荷がかかります。

一般的な登録ボイラープレート

Service Worker の説明を読んだことがある方は、 次のようなボイラープレートになります。

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js');
}

これには、いくつかの console.log() ステートメントが伴うことがあります。または、 コード 以前の Service Worker 登録への更新を検出し、 ユーザーにページの更新を通知しますこれらはわずかな違いで 見てみましょう。

では、「navigator.serviceWorker.register」に何か違いはないでしょうか。何かありますか? 従うべきベスト プラクティスは何か。驚くことではないでしょう(この記事が どちらの場合も、どちらの場合も「はい」と回答します。

ユーザーの初回訪問

ユーザーが初めてウェブアプリにアクセスする場合を考えてみましょう。Service Worker はまだありませんが ブラウザには、サービスが提供されるかどうかを事前に知る手段がありません。 インストールされます。

デベロッパーは、ブラウザを高速かつ高速に インタラクティブな表示に必要な最小限の重要なリソースのセットを できます。回答の取得を遅らせるものは 攻撃者にとって 体験までの時間を短縮できます。

ダウンロードした JavaScript や画像をダウンロードしている リクエストが行われると、ブラウザがバックグラウンド スレッドを開始するか、 (簡潔にするためにスレッドであると仮定します)。仮定 大型のデスクトップマシンではなく 携帯電話、スマートフォンです。スピンアップ この追加のスレッドにより、ブラウザの CPU 時間とメモリの競合を インタラクティブなウェブページのレンダリングに消費する可能性があります。

アイドル状態のバックグラウンド スレッドによって大きな違いが生じる可能性は低くなります。では、 そのスレッドがアイドル状態ではないものの、 ダウンロードするかなどです。CPU やメモリに関する懸念 帯域幅不足の心配がなくなり、 多くのモバイル デバイスで利用できます。帯域幅は貴重なので、無駄にしない セカンダリ リソースを同時にダウンロードすることで、重要なリソースを保護できます。

つまり、新しい Service Worker スレッドをスピンアップして キャッシュ リソースをバックグラウンドで実行すると、 ユーザーが初めてサイトにアクセスしたときの やり取りまでの時間が最も短くなります サイトをご覧ください。

ボイラープレートの改善

これを解決するには、Service Worker を起動するタイミングを navigator.serviceWorker.register()。単純な経験則として、 load eventまで登録可能 以下のように、window で起動します。

if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
    navigator.serviceWorker.register('/service-worker.js');
    });
}

ただし、Service Worker の登録を開始する適切なタイミングは、 ウェブアプリが読み込まれた直後の動作を確認できます。たとえば、Google I/O 2016 年のウェブアプリ: 短いアニメーション 確認することもできます。Google のチーム 見つけました アニメーション中に Service Worker の登録から外れると、ジャンクが発生する可能性がある ローエンドのモバイルデバイスで使えますユーザーに不快感を与えるのではなく 遅延 アニメーションが終わるまで、Service Worker の登録に アイドル状態である可能性が高いため

同様に、ウェブアプリで追加のセットアップを行うフレームワークを ページが読み込まれた時点で、そのことを示すフレームワーク固有のイベントを探します。 終わりです。

再訪問

これまでは初回訪問時に重点を置いてきましたが Service Worker の登録が遅いと、サイトへの再アクセスが増えますか? 驚く人もいるかもしれませんが、まったく影響はないはずです。

Service Worker が登録されると、install を介して activate のライフサイクル できます。 アクティベートされた Service Worker は、任意のイベントに対して fetch イベントを ウェブアプリへのその後の訪問Service Worker は、Cloud Storage バケットの作成 そのスコープ内のページに対するリクエストが行われると、 説明します。以前の Service Worker で既存の Service Worker が ユーザーがページにアクセスした場合、そのページの fetch イベントを リクエストできます。

アクティブな Service Worker があれば、呼び出しのタイミングは navigator.serviceWorker.register()、あるいは実際の呼び出しでも同様です。 Service Worker スクリプトの URL を変更しない限り、 navigator.serviceWorker.register() は、実質的には 以降のアクセスは no-op にします。次の場合 という意味ではありません。

早期登録のメリット

Service Worker を早期に Service Worker で どうすればよいでしょうか。思い浮かぶのは Service Worker で clients.claim() 最初のアクセス時にページをコントロールし、Service Worker は ランタイムに積極的に キャッシュ保存 その fetch ハンドラ内で指定する必要があります。そのような状況では Service Worker をできるだけ早くアクティブにすることで、 後で役立つ可能性のあるリソースをランタイム キャッシュに挿入する。条件 自分のウェブアプリがこのカテゴリにあてはまる場合は、一歩引いて Service Worker の install ハンドラが メインページのリクエストに応じて帯域幅を奪い合うリソースを検出できます。

テスト

初めてアクセスする場合をシミュレートするには、ウェブ アプリケーションを Chrome シークレット モード ウィンドウ ネットワーク トラフィックをChrome の DevTools。ウェブ ウェブアプリのローカルインスタンスを数十回再読み込みし 1 日に数十回の頻度で導入しますしかし、まだ見つかっていない時間帯に サイトに再度アクセスすれば 完全に入力されたキャッシュでは ユーザーエクスペリエンスは変わりません 発生しがちな問題も無視しやすくなります。

次の例は、登録のタイミングによって結果が変わります。 できます。どちらのスクリーンショットも、サンプルにアクセス中に撮影されます。 アプリ ネットワーク スロットリングを使用して低速な接続をシミュレートするシークレット モード。

早期登録によるネットワーク トラフィック。

上のスクリーンショットは、サンプルが変更されたときのネットワークトラフィックを示しています。 Service Worker を登録する必要があります。ご覧のとおり、 リクエスト(gear の付いたエントリ アイコン その隣にある、Service Worker の install ハンドラから開始)。 ページの表示に必要な他のリソースのリクエストが混在しています。

登録が遅れたネットワーク トラフィック。

上のスクリーンショットでは、Service Worker の登録が ページが読み込まれました。ご覧のとおり、プリキャッシュ リクエストは、 リソースがネットワークから取得され、ネットワーク間の競合が あります。さらに、事前キャッシュする項目の一部は、すでに ブラウザの HTTP キャッシュ(Size に (from disk cache) が含まれるアイテム) その列に移動しなくても、Service Worker のキャッシュにデータを入力できます。 接続し直します

この種のテストを実際のローエンドのデバイスで 接続します。Chrome のリモート デバッグを 機能 USB 経由でデスクトップ マシンに Android スマートフォンを接続して、 実施しているテストには 組織の実際の経験が できます。

まとめ

まとめると、初回訪問時のユーザー エクスペリエンスが最適になるようにする 最優先事項である必要がありますService Worker の登録を 初回訪問時にページの読み込みが 遅らないようにしましょう引き続き 再訪問時に Service Worker を使用すると すべてのメリットが得られます

Service Worker の初期状態を 最初のページが読み込まれるまでは、次のように登録する必要があります。

if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
    navigator.serviceWorker.register('/service-worker.js');
    });
}