學會使用Cache API
後,默默的我們已經能搭配,Fetch API
來實現Service Worker
的Offline
特色,
從前面幾天中,我們在載入頁面之後,
再install
事件觸發時,我們將很少出現變化的資源加入名為Static
(命名隨意)的快取資源中,
接著透過fetch
事件,讓我們有能力,動態捕捉不需要第一時間就cache
的資源,
放入Dynamic
的快取資源中,
到這邊為止,當瀏覽過網站,再無網路的情境下,使用者仍然能繼續瀏覽網站上的內容,
而不會因為網路不穩或搭個電梯就出現瘋狂轉圈圈等待的窘境。
但是...
你會說不是已經,將快取的資源都捕捉到了嗎?
什麼情境會讓小恐龍出現呢?
從前面幾天測試的頁面都很順利,能擊退小恐龍,
但是你會發現有個問題,我們都只在同一頁做測試,
而且我們一定要先再有網路的情況至少載入網頁一次,
才會觸發到Cache
的時機,
如果,今天我多了一頁關於我
的頁面,當我從來沒有瀏覽過那頁,
而在沒有網路的前提下,首頁瀏覽的狀況,跟我們之前一樣會完整呈現
而今天,我們突如起來點到其他頁面之後,會出現。
看到這個頁面,會傻眼,那我們快取其他資源,不就沒有意義了嗎?
因此,今天要試做防呆頁面,專門給正在瀏覽的使用者,再沒網路的情況下,
假如使用者點到沒有看過的頁面時,判斷有沒有抓過快取資料,
假如沒有快取,就導向預先做好的錯誤頁面。
頁面內容不重要,在此我就不貼原始碼,
要做最簡單的測試,也可以直接設定body
背景顏色,可以很快的看出有沒有成功。
static
的快取內容 caches.open(CACHE_STATIC)
.then(function(cache){
cache.addAll([
'/',
'/index.html',
'/offlinePage.html',
...
]);
})
);
再一開始install
時,將替代頁面順便cache
,
當使用者發出沒有再cache
中的資源時,就將資源替換成此網頁。
self.addEventListener('fetch', function(event){
var url = 'https://httpbin.org/get';
if(-1 < event.request.url.indexOf(url)){
//當對應到一致的url
event.respondWith(
caches.open(CACHE_DYNAMIC)
.then(function(cache){
return fetch(event.request)
.then(function(response){
cache.put(event.request, response.clone());
return response;
});
})
);
} else{
//其他資源
event.respondWith(
caches.match(event.request)
.then(function(response){
//當快取抓到資源時做處理
})
//重點在此
.catch(function(err){
return caches.open(CACHE_STATIC)
.then(function(cache){
return cache.match('/offlinePage.html');
});
})
);
}
});
當我們看到小恐龍是因為在沒有網路的情況下,cache.match
也找不到資源時,她就會直接顯是無此網頁。
所以,我們要做的就是再後面加上catch
,
並將offlinePage
的頁面代替原本的頁面回傳給使用者。
預設有網路的情況下,顯示上方畫面。
執行網站,有網路情況瀏覽首頁「/」。
打勾「Offline」,確保現在無網路,並再更新一次網頁,確保原本的cache
都正常運作。
再無網路的情況下,點選「About Me」連結。
4.成功!
看網址確實是點選「about.html」,使用者也沒有瀏覽過網頁,但是重點是網站沒有直接掛掉
這樣即使頁面內容出不來,也不會讓使用者覺得網站有問題而直接滑掉網站。