JavaScript ServiceWorker API的好處就是讓WEB開發人員輕松的控制緩存。雖然使用ETags等技術也是一種控制緩存的技術,按使用JavaScript讓程序來控制緩存功能更強大,更自由。當然,強大有強大的好處,也有弊處——你需要做善后處理,所謂的善后處理,就是要清理緩存。
下面我們來看看如何創建緩存對象、在緩存里添加請求緩存數據,從緩存里刪除請求緩存的數據,后是如何完全的刪除緩存。
cache API的支持
檢查瀏覽器是否支持Cache API…
if('caches' in window) {
// Has support!
}
…檢查window里是否存在caches對象。
創建一個緩存對象的方法是使用caches.open(),并傳入緩存的名稱:
caches.open('test-cache').then(function(cache) {
// 緩存創建完成,現在就可以訪問了
});
這個caches.open方法返回一個Promise,其中的cache對象新創建出來,如果是以前創建過,就不重新創建。
對于這類的緩存,你可以把它想象成一個Request對象數組,Request請求獲取的響應數據將會按鍵值存儲在緩存對象里。有兩個方法可以往緩存里添加數據:add 和 addAll。用這兩個方法將要緩存的請求的地址添加進去。關于Request對象的介紹你可以參考fetch API這篇文章。
使用addAll方法可以批量添加緩存請求:
caches.open('test-cache').then(function(cache) {
cache.addAll(['/', '/images/logo.png'])
.then(function() {
// Cached!
});
});
這個addAll方法可以接受一個地址數組作為參數,這些請求地址的響應數據將會被緩存在cache對象里。addAll返回的是一個Promise。添加單個地址使用add方法:
caches.open('test-cache').then(function(cache) {
cache.add('/page/1'); // "/page/1" 地址將會被請求,響應數據會緩存起來。
});
add()方法還可以接受一個自定義的Request:
caches.open('test-cache').then(function(cache) {
cache.add(new Request('/page/1', { /* 請求參數 */ }));
});
跟add()方法很相似,put()方法也可以添加請求地址,同時添加它的響應數據:
fetch('/page/1').then(function(response) {
return caches.open('test-cache').then(function(cache) {
return cache.put('/page/1', response);
});
});
要查看已經換的請求數據,我們可以使用緩存對象里的keys()方法來獲取所有緩存Request對象,以數組形式:
caches.open('test-cache').then(function(cache) {
cache.keys().then(function(cachedRequests) {
console.log(cachedRequests); // [Request, Request]
});
});
/*
Request {
bodyUsed: false
credentials: "omit"
headers: Headers
integrity: ""
method: "GET"
mode: "no-cors"
redirect: "follow"
referrer: ""
url: "http://www.webhek.com/images/logo.png"
}
*/
如果你想查看緩存的Request請求的響應內容,可以使用cache.match()或cache.matchAll()方法:
caches.open('test-cache').then(function(cache) {
cache.match('/page/1').then(function(matchedResponse) {
console.log(matchedResponse);
});
});
/*
Response {
body: (...),
bodyUsed: false,
headers: Headers,
ok: true,
status: 200,
statusText: "OK",
type: "basic",
url: "https://www.webhek.com/page/1"
}
*/
關于Response對象的用法和詳細信息,你可以參考fetch API這篇文章。
從緩存里刪除數據,我們可以使用cache對象里的delete()方法:
caches.open('test-cache').then(function(cache) {
cache.delete('/page/1');
});
這樣,緩存里將不再有/page/1請求數據。
想要獲取緩存里已經存在的緩存數據的名稱,我們需要使用caches.keys()方法:
caches.keys().then(function(cacheKeys) {
console.log(cacheKeys); // ex: ["test-cache"]
});
window.caches.keys()返回的也是一個Promise。
想要刪除一個緩存對象,你只需要緩存的鍵名即可:
caches.delete('test-cache').then(function() {
console.log('Cache successfully deleted!');
});
大量刪除舊緩存數據的方法:
// 假設`CACHE_NAME`是新的緩存的名稱
// 現在清除舊的緩存
var CACHE_NAME = 'version-8';
// ...
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if(cacheName != CACHE_NAME) {
return caches.delete(cacheName);
}
})
);
});
想成為一個service worker專家?上面的這些代碼值得放到你的儲備庫里。火狐瀏覽器和谷歌瀏覽器都支持service worker,相信很快就會有更多的網站、app使用這種緩存技術來提高運行速度。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。