web-dev-qa-db-ja.com

Service Workerを強制的に更新する方法は?

Sw-precacheを使用して、Polymer CLIビルドプロセスでサービス作業を生成するため、更新されたファイルのハッシュを更新して、キャッシュを更新する必要があることを通知します。キャッシュ内で置換されないため、ctrl + rで更新すると古いバージョンになりますが、ctrl + shift + rで更新すると新しいバージョンになります。その理由は、サービスワーカーが更新されていないことです。

このドキュメント

現在のファイルと比較して、Service Workerファイルに1バイトの違いさえあれば、それは新しいものと見なされます。

、しかし、新しいサービスワーカーがバイトを変更しなかった場合はどうなりますか? (たった1つのハッシュが変更された場合に起こります)。 sw-precacheを設定して、新しいリクエストごとにサービスの動作を更新する方法は?

12
Jp_

1つのファイルのハッシュが変更された場合、サービスワーカーのJavaScriptファイルがsw-precache変更。これは、Service Workerの更新フローをトリガーするのに十分です。

テスト中に更新フローがトリガーされない場合は、ネットワークからではなくブラウザーのキャッシュから取得されるHTTPキャッシングヘッダーでサービスワーカーのJavaScriptファイルが提供されていることが原因である可能性があります。

HTTPキャッシングヘッダーがどのように機能するか、およびそれに関するベストプラクティスについては、 https://stackoverflow.com/a/38854905/385997 を参照してください。

10
Jeff Posnick

「sw-precache」は Workbox に置き換えられました。これにより、プリキャッシュするファイルのハッシュが生成され、サービスワーカーのソースコードに追加されます(sw-precacheは同じように機能します、ジェフの答えはそれがそうであることを示唆しています。事前キャッシュしたいファイルのいずれかが変更され、ビルドが再実行されると、Service Workerの更新されたハッシュが更新され、Service Workerが「少なくとも1バイト異なる」ことが保証されます。

リロードすると(ctrl-r)またはアプリに再度アクセスすると、ブラウザは登録されたサービスワーカーを再度取得します。そして、そのサービスワーカーが変更された場合、アプリを管理するために「キュー」に入れられます。ただし、アプリを開いた状態ですべてのタブを閉じてから新しいタブを開くまで、アプリの管理は開始されません。

ハードリフレッシュするとき(shift-ctrl-rコントローラなしで常にロードされます これは、新しいService Workerを使用する場合とは異なります。

開発中のテストには、devtoolsで skip waiting を使用して、すべてのタブを閉じるのを待たずに新しいサービスワーカーが古いサービスワーカーを置き換えるようにします。

10
Bitterjug

前の回答で述べたように、ブラウザがサービスワーカーの更新を検索するには1日(24時間)の組み込み制限がありますが、注意する必要があるのは、まだ.update()を呼び出す必要があることですServiceWorkerRegistrationオブジェクトでは、ファイルの元のバージョンが使用されます。

Chromeで変更をテストしている間、サービスワーカースクリプトで作業するときは、常に更新ボタンを右クリックし、[キャッシュを空にしてハードリセット]を選択します(開発者ツールを開いているときにオプションを使用できます)。

9
jcaruso