目前為止,從生命週期install
時,已經預先快取固定要使用的資源(static
),但是,有些資源並不需要在載入頁面的時候全部快取,因為不是所有資源都會需要馬上用到,在Day11瀏覽Cache API
的方法,可以試著在fetch
的時候,當抓到沒有快取的資源時,就透過cache.put()
方法放進資源中。
self.addEventListener('fetch', function(event){
event.respondWith(
caches.match(event.request)
.then(function(response){
//抓不到會拿到 null
if(response){
return response;
}else{
return fetch(event.request)
.then(function(res){
caches.open('dynamic')
.then(function(cache){
cache.put(event.request.url, res.clone());
return res;
})
});
}
})
)
});
當在資源中if(response)
在快取中找到資源就回傳快取中的資源,如果沒有找到就將資源放進dynamic
快取中,並將原本的response
回傳。
執行後,第一次會看到快取中只有install
事件時,預先快取的資源static
,接著重整一次畫面。
dynamic
接著就出現了,將第一次篩選快取的資源,如果沒有資源就會透過put
存進dynamic
快取中。
接著在將offline
打勾,重整畫面,因為網頁上需要的資源都已經在快取中,這時候,終於沒網路和有網路的情況下,網頁的基本視覺和功能,都能正常運作。
Service Worker
的快取,那舊得快取怎麼辦?假設現在網站更新了需要快取的資源,例如頁面上將主視覺得背景色換掉接著執行看看會發生什麼事?
caches.open('static-v2.0')
會發現快取中,多了新的static-v2.0
的資源,但是網頁的畫面並沒有更新,這是因為現在同時存在static
和static-v2.0
,新與舊的資源同時被快取,所以網站在回傳快取中的資源時,就吃到了舊的快取內容,
那現在怎麼辦呢?
讓我們明天繼續