Service Worker Cache API 更新內容

阿奇巴德 (Jake Archibald)
Jake Archibald

有人向 Service Worker Cache API 進行微幅更新,通知我撰寫這篇文章。這證明瞭我的文章並不是什麼。經過長時間的辯論後,我終於開始體驗剪刀石頭布的遊戲,結果就輸了。

你準備好瞭解 Chrome 實作 Service Worker 快取 API 的更新內容了嗎?

我聽不到你說的話!我想瞭解 Chrome 的 Service Worker Cache API 實作項目的最新異動嗎?

(你只有在坐在椅子上,然後大喊「YEAHHH!」才能閱讀)。你可以同時假裝揮灑雷索,但十分鼓勵。

cache.addAll 已在 Chrome 46 版中推出

當然!答對了!快取!不全部新增!Chrome 46!

好的,不過,這其實很重大,因為 cache.addAll快取「必要」 polyfill 的最後一部分,也就是不再需要。

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 會擷取一系列網址和要求並加以擷取,並將這些網址新增至快取。這是交易 - 如果任何擷取或寫入失敗,整個作業都會失敗,而快取會傳回之前的狀態。這在上述安裝作業中特別實用,因為這類安裝作業只會發生單一失敗,導致整體故障。

上述範例位於 Service Worker 中,但快取 API 也可以完全從網頁存取。

Firefox 已在開發人員版本中支援這個 API,因此會包含他們導入的其餘服務。

不過,不僅如此,管道的快取改善項目還有更多...

cache.matchAll 將在 Chrome 47 推出

這可產生多個相符項目:

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

執行上述動作會取得 mysite-static-v1 中與 / 相符的所有內容。如果可以獨立快取的項目 (例如有不同的 Vary 標頭),快取可讓您為每個網址有多個項目。

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 的要求,但「不會」來自快取。如要解決這個問題,您可以在比對時忽略網址搜尋字串:

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 - 在要求引數和快取要求中忽略網址的搜尋部分
  • ignoreMethod - 忽略要求引數的方法,因此 POST 要求可以比對快取中的 GET 項目
  • ignoreVary - 忽略快取回應中的變化標頭

Firefox 已支援這項功能... 您知道了。那就告訴 Ben Kelly 他將所有功能整合至 Firefox 真的有多棒。

如要採用 Chrome 的快取查詢選項實作方式,請參閱 crbug.com/426309

下次見,我們再玩一章「我們在 cache API 實作的內容」!