22

Service Workers に関する多くのリソースを調べました。

ただし、新しい ServiceWorker がインストールされた後にページを更新する方法を理解することはできません。何をしても、私のページは古いバージョンのままで、ハード リフレッシュ (Cmd-Shift-R) だけが修正されます。1) タブを閉じる、2) Chrome を閉じる、または 3)location.reload(true)を組み合わせても、新しいコンテンツは提供されません。

主にSVGOMGに基づいた非常に単純なサンプルアプリがあります。インストール時に、 を使用して一連のリソースをキャッシュします。また、現在のバージョンのメジャー バージョン番号がアクティブなバージョンの番号と一致しない場合cache.addAll()にも行いますskipWaiting()(IndexedDB ルックアップに基づく)。

self.addEventListener('install', function install(event) {
  event.waitUntil((async () => {
    var activeVersionPromise = localForage.getItem('active-version');
    var cache = await caches.open('cache-' + version);
    await cache.addAll(staticContent);
    var activeVersion = await activeVersionPromise;
    if (!activeVersion ||
      semver.parse(activeVersion).major === semver.parse(version).major) {
      if (self.skipWaiting) { // wrapping in an if while Chrome 40 is still around
        self.skipWaiting();
      }
    }
  })());
});

私は、メジャー バージョン番号が新しい ServiceWorker を古い ServiceWorker にホットスワップできないことを示す、semver にインスパイアされたシステムを使用しています。これは ServiceWorker 側で機能します。v1.0.0 から v1.0.1 へのバンプでは、ワーカーは更新時にすぐにインストールされますが、v1.0.0 から v2.0.0 では、タブが閉じられて再度開かれるまで待機します。インストールされています。

メインスレッドに戻って、登録後に ServiceWorker を手動で更新しています。そうしないと、ServiceWorker の新しいバージョンが利用可能であるというメモがページに表示されません (奇妙なことに、ServiceWorker の文献のどこにもこれについての言及はほとんどありません)。

navigator.serviceWorker.register('/sw-bundle.js', {
  scope: './'
}).then(registration => {
  if (typeof registration.update == 'function') {
    registration.update();
  }
});

ただし、メイン スレッドに提供されるコンテンツは、バージョンを 1.0.1 にインクリメントするか 2.0.0 にインクリメントするかに関係なく、ページの古いバージョン (「私のバージョンは 1.0.0」) で常に停止します。

私はここで困惑しています。私はServiceWorkerのバージョニングに対するエレガントなsemver-yソリューションを見つけたいと思っていました(したがって、私の使用require('./package.json').version)が、現在の実装では、ハードリフレッシュするか手動ですべてをクリアしない限り、ユーザーは永久にページの古いバージョンにとどまります彼らのデータ。:/

4

3 に答える 3

26

問題が見つかりました - ServiceWorker JS ファイル自体のキャッシュ ヘッダーを避ける必要があります。max-age=0問題をすぐに解決するようにキャッシュを設定する: https://github.com/nolanlawson/serviceworker-update-demo/pull/1

私を正してくれたジェイク・アーチボルドに乾杯: https://twitter.com/jaffathecake/status/689214019308224513

于 2016-01-18T22:47:54.720 に答える