iT邦幫忙

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

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

Day6- Service Worker終結小恐龍的命運(觀念篇)

  • 分享至 

  • xImage
  •  

今天要來介紹Service Worker終結小恐龍的利器啦。

支援度

https://ithelp.ithome.com.tw/upload/images/20171220/20103808yXoiYiwOov.png

根據Is Service Worker Ready網站顯示,目前Chrome和FireFox已經支援,而Edge和Safari都還在開發中,代表之後瀏覽器支援度會更完善。

什麼是Service Worker?

Service Worker是一支運行在瀏覽器背後的javascript檔案,在Day2的時候有提到,它是運行在Client端的Proxy,當使用者提出需求時,會先看網頁有無註冊Service Worker,有註冊的情況下,如果有快取頁面資訊存在,則不須將請求丟給Server端,可以直接由Service Worker做回應。

另外一點是,Service Worker雖然是Javascript檔案,但它屬於Javascript Worker,它是另外一條獨立的執行緒,換句話說,原本操作頁面上元素及內容的Javascript與Service Worker是兩個分開的線,因此,Service Worker是無法存取DOM元素的,如下圖。

https://ithelp.ithome.com.tw/upload/images/20171220/20103808f9SubWjSf5.png
平常網頁載入時,會載入CSS、JS等檔案,接著在JS檔案中,註冊Service Worker,或是你要直接在html寫script,但通常會抽檔案比較好管理,註冊成功後,我們就可以實作它的許多功能啦。

Service Worker可監聽的事件介紹

Fetch

雖然Service Worker無法直接存取DOM,但可以透過fetch事件,來監聽頁面上的資源,舉例來說,瀏覽器要抓取網頁上的資源時(CSS或圖片等等),就會觸發fetch,也就是說每一個http需求都會經過Service Worker,而我們就可以來控制資源快取起來或是刪除等等。

Push Notifications 推播

功能就跟名字一樣,推送訊息給使用者,如果將推播寫在網站的Javascript的情形下,使用者關閉網頁,就不會有訊息,但前面提到Service Worker是在背景作業,所以就算使用者關閉網站,Service Worker還是在運行,這樣就能在瀏覽器關閉的情況下,發訊息給使用者,提升回顧率。

Notification Interaction

監聽使用者是否有理會推播訊息。

Background Sync

這也是個很方便的功能,前面都在吹捧說Service Worker可以運行在低網路或甚至沒有網路的情境,現在假設使用者,填寫完一份表單,在沒有網路的地方,按送出一般情況下會直接失敗,但這功能可以暫存執行的動作,換句話說,不馬上執行,等網路重新連線時候,才發出執行。

Install

監聽Service Worker安裝的事件。

Activate

如果瀏覽器有舊的Service Worker,重新載入網頁,發現有新的Service Worker,就會觸發Activate事件,當舊的Service Worker刪除後,就能執行新的Service Worker的控制內容,覺得很繞口令,不過我們到了實際寫程式的時候就會清楚多了!

生命週期(Lifecycle)

https://ithelp.ithome.com.tw/upload/images/20171220/20103808sp1Jf2a9ID.png

圖片來源: https://developers.google.com/web/fundamentals/primers/service-workers/#you_need_https

這張生命週期是Google網站用來解釋Service Worker的運作流程的,從一開始瀏覽器沒有Service Worker,接著載入網頁後,觸發了「Installing」安裝事件,如果瀏覽器支援Service Worker,則註冊成功指向「Activated」,安裝失敗導向「Error」但不影響原本網站瀏覽,它指向了「Idle」,其實是因為Service Worker運行在瀏覽器背景的情況,當如果有其他事件例如「Fetch」,觸發則會在執行Service Worker,沒有事件發生則會指向**「Terminated」這不代表解除Service Worker**,意思是閒置而已,如果有其他事件觸發,就會在喚醒Service Worker。

以這30天使用的範例專案來描圖解釋

https://ithelp.ithome.com.tw/upload/images/20171220/20103808loplTosSen.png
有沒有突然覺得比官網好懂多了/images/emoticon/emoticon01.gif
Step1. 網頁載入後,app.js裡面寫註冊Service Worker的請求
Step2-1. 如果頁面已經有Service Worker且已經是最新的,就不執行註冊
Step2-2. 如果沒有就註冊,觸發安裝事件
Step3. 觸發Activate事件控制頁面上的資源
Step4. Service Worker存在於「Idle」等待事件發生
Step5. 如果一陣子沒事件發生則處於「Terminated」閒置狀態
Step6. 發生Fetch事件,重新啟動存在於Idle的Service Worker

總結

今天我們踏入了PWA第二的核心功能,雖然Service Worker也是javascript檔,但是撰寫的程式跟一般操作DOM的JS概念不同,當有能力讓JS在背景執行時,可以做到的功能就變得更多元了,我們可以掌控資源是不是要快取,哪些資料可以不用再重覆跟Server發請求,網路不穩的情況,不用馬上開始玩恐龍,而可以詢問上一次瀏覽過網頁的Service Worker快取過的資源,有沒有可以回傳的內容,讓網頁可以顯是一些基本的內容等等。
明天就開始踏入Service Worker程式篇,透過實作印證觀念吧/images/emoticon/emoticon28.gif

閱讀資源

Edge SW支援進度
Google SW
MDN
MDN-FetchAPI


上一篇
Day5 -Manifest File 之 IOS的替代方案及App Install Event實作
下一篇
Day7-Service Worker 走訪Lifecyle(程式篇)
系列文
30天走訪Progressive Web Apps(PWAs)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Ho.Chun
iT邦新手 5 級 ‧ 2019-12-11 18:20:20

觀念介紹的很清晰 !! 易於吸收,感謝您 /images/emoticon/emoticon41.gif

我要留言

立即登入留言