iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 12
2
Modern Web

30天走訪Progressive Web Apps(PWAs)系列 第 12

Day12-Cache API之動態快取

  • 分享至 

  • xImage
  •  

動態快取資源

https://ithelp.ithome.com.tw/upload/images/20171229/20103808uxbKAR5TXK.png
目前為止,從生命週期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回傳。

https://ithelp.ithome.com.tw/upload/images/20171229/201038084DHoNnOVaT.png
執行後,第一次會看到快取中只有install事件時,預先快取的資源static,接著重整一次畫面。

https://ithelp.ithome.com.tw/upload/images/20171229/20103808WecJGDZmY6.png
dynamic接著就出現了,將第一次篩選快取的資源,如果沒有資源就會透過put存進dynamic快取中。

https://ithelp.ithome.com.tw/upload/images/20171229/20103808eZTZMchjqY.png
接著在將offline打勾,重整畫面,因為網頁上需要的資源都已經在快取中,這時候,終於沒網路和有網路的情況下,網頁的基本視覺和功能,都能正常運作。/images/emoticon/emoticon07.gif

如果更新Service Worker的快取,那舊得快取怎麼辦?

假設現在網站更新了需要快取的資源,例如頁面上將主視覺得背景色換掉接著執行看看會發生什麼事?

caches.open('static-v2.0')

https://ithelp.ithome.com.tw/upload/images/20171229/20103808t4nwefD867.png
會發現快取中,多了新的static-v2.0的資源,但是網頁的畫面並沒有更新,這是因為現在同時存在staticstatic-v2.0,新與舊的資源同時被快取,所以網站在回傳快取中的資源時,就吃到了舊的快取內容,
那現在怎麼辦呢?

讓我們明天繼續/images/emoticon/emoticon28.gif


上一篇
Day11-Cache API 能使用的其他方法
下一篇
Day13-Cache API刪除舊快取
系列文
30天走訪Progressive Web Apps(PWAs)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言