Service Worker Cache API の更新

Jake Archibald 氏
Jake Archibald

この投稿は、Service Worker Cache API の軽微なアップデートについて書くよう依頼されました。独自の記事が妥当だとは思いませんでしたが、長い議論の末、じゃんけんのゲームに行きつきました。今回は負けました。

Chrome の Service Worker Cache API の実装に関する最新情報をお届けします。

よく聞こえないよ。先ほどお伝えした、Chrome の Service Worker Cache API の実装に関する最新情報をお届けします。

(椅子に飛び乗って「イエーイ!」と叫んだ場合にのみ読むことができます。それと同時に投げ縄をスイングするふりをするのも自由ですが、おすすめです)。

cache.addAll が Chrome 46 で利用可能に

オーバープロビジョニングと正解です。キャッシュ!すべて追加してください。Chrome 46

皮肉はさておき、cache.addAllキャッシュの「必須事項」のポリフィルの最後の部分であり、不要になったため、これは実際には非常に大事なことです。

cache.addAll の仕組みは次のとおりです。

// when the browser sees this SW for the first time
self.addEventListener('install', function(event) {
    // wait until the following promise resolves
    event.waitUntil(
    // open/create a cache named 'mysite-static-v1'
    caches.open('mysite-static-v1').then(function(cache) {
        // fetch and add this stuff to it
        return cache.addAll([
        '/',
        '/css/styles.css',
        '/js/script.js',
        '/imgs/cat-falls-over.gif'
        ]);
    })
    );
});

addAll は、URL とリクエストの配列を取得して取得し、キャッシュに追加します。これはトランザクションです。フェッチまたは書き込みのいずれかが失敗した場合、オペレーション全体が失敗し、キャッシュは以前の状態に戻ります。これは、1 つの障害が全体的な 1 つの障害になるような、このようなインストール操作で特に有用です。

上記の例は Service Worker 内にありますが、Caches API はページからも完全にアクセスできます。

Firefox のデベロッパー エディションでこの API がすでにサポートされているため、Service Worker の残りの部分と一緒に実装されます。

それだけではありません。パイプラインにはさらに多くのキャッシュ改善があります。

cache.matchAll のリリース(Chrome 47)

これにより、複数の一致を取得できます。

caches.open('mysite-static-v1').then(function(cache) {
    return cache.matchAll('/');
}).then(function(responses) {
    // …
});

上記のように指定すると、/ に一致する mysite-static-v1 内のすべてが取得されます。Vary ヘッダーが異なる場合など、エントリを個別にキャッシュに保存できる場合は、URL ごとに複数のエントリを保持できます。

Firefox のデベロッパー エディションですでにこの機能をサポートしているため、Service Worker の他の実装も一緒に使用できます。

Chrome にキャッシュ クエリ オプションを追加予定

標準的なフェッチ ハンドラは次のとおりです。

self.addEventListener('fetch', function(event) {
    event.respondWith(
    caches.match(event.request).then(function(response) {
        return response || fetch(event.request);
    })
    );
});

/ がキャッシュされている場合、/ のリクエストを受け取った場合はキャッシュから提供されます。ただし、/?utm_source=blahblahwhatever のリクエストを受け取った場合は、キャッシュから取得されません。この問題を回避するには、マッチングの際に URL 検索文字列を無視します。

self.addEventListener('fetch', function(event) {
    event.respondWith(
    caches.match(event.request, {
        ignoreSearch: true
    }).then(function(response) {
        return response || fetch(event.request);
    })
    );
});

これで、/?utm_source=blahblahwhatever/ のエントリと照合されます。すべてのオプションは次のとおりです。

  • ignoreSearch - リクエストの引数とキャッシュに保存されたリクエストの両方で URL の検索部分を無視します。
  • ignoreMethod - POST リクエストがキャッシュ内の GET エントリと一致するように、リクエスト引数のメソッドを無視します。
  • ignoreVary - キャッシュに保存されたレスポンスの vari ヘッダーを無視します。

Firefox はすでにサポートしています。ご存じのとおり、Firefox でこれらの作業を完了できるようになったことを Ben Kelly に伝えましょう。

キャッシュ クエリ オプションの Chrome 実装を確認するには、crbug.com/426309 をご覧ください。

次回の記事では「キャッシュ API で実装した内容」をご紹介します。