有人向 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 實作的內容」!