W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Service Worker 可以增強(qiáng)傳統(tǒng)的 Web 發(fā)布模式,并使應(yīng)用程序能夠提供可與原生代碼(它運(yùn)行在你的操作系統(tǒng)和硬件層面)媲美的高可靠、高性能的用戶體驗(yàn)。為 Angular 應(yīng)用添加 Service Worker 是把應(yīng)用轉(zhuǎn)換成漸進(jìn)式應(yīng)用(PWA)的步驟之一。
簡(jiǎn)單來(lái)說(shuō),Service Worker 就是一段運(yùn)行在 Web 瀏覽器中,并為應(yīng)用管理緩存的腳本。
Service Worker 的功能就像一個(gè)網(wǎng)絡(luò)代理。它們會(huì)攔截所有由應(yīng)用發(fā)出的 HTTP 請(qǐng)求,并選擇如何給出響應(yīng)。比如,它們可以查詢局部緩存,如果有緩存的響應(yīng)數(shù)據(jù),就用它做出響應(yīng)。這種代理行為不會(huì)局限于通過(guò)程序調(diào)用 API(比如 ?fetch
?)發(fā)起的請(qǐng)求,還包括 HTML 中對(duì)資源的引用,甚至對(duì) ?index.html
? 的首次請(qǐng)求?;?nbsp;Service Worker 的緩存是完全可編程的,并且不依賴于服務(wù)端指定的那些控制緩存策略的頭。
不像應(yīng)用中的其它腳本(如 Angular 的應(yīng)用包),Service Worker 在用戶關(guān)閉瀏覽器頁(yè)標(biāo)簽時(shí)仍然會(huì)被保留。下次瀏覽器加載本應(yīng)用時(shí),Service Worker 會(huì)首先加載,然后攔截加載本應(yīng)用時(shí)的對(duì)每一項(xiàng)資源的請(qǐng)求。如果這個(gè) Service Worker 就是為此而設(shè)計(jì)的,它就能完全滿足應(yīng)用加載時(shí)的需求,而不需要依賴網(wǎng)絡(luò)。
即使在快速可靠的網(wǎng)絡(luò)中,往返延遲也可能在加載應(yīng)用程序時(shí)產(chǎn)生顯著的延遲。使用 Service Worker 來(lái)減少對(duì)網(wǎng)絡(luò)的依賴可以顯著改善用戶體驗(yàn)。
作為單頁(yè)面應(yīng)用,Angular 應(yīng)用可以受益于 Service Worker 的優(yōu)勢(shì)。從 Angular v5.0.0 開始,Angular 提供了一份 Service Worker 的實(shí)現(xiàn)。Angular 開發(fā)人員可以利用 Service Worker,并受益于其增強(qiáng)的可靠性和性能,而無(wú)需再針對(duì)底層 API 寫代碼。
Angular 的 Service Worker 的設(shè)計(jì)目標(biāo)是優(yōu)化那些使用慢速、不可靠網(wǎng)絡(luò)的最終用戶的體驗(yàn),同時(shí)還要盡可能減小提供過(guò)期內(nèi)容的風(fēng)險(xiǎn)。
為了達(dá)成此目標(biāo),Angular Service Worker 的行為遵循下列設(shè)計(jì)原則:
要支持這些行為,Angular 的 Service Worker 會(huì)從服務(wù)器上下載一個(gè) ?manifest
?文件。 這個(gè) ?manifest
?文件(不同于 web 應(yīng)用的 manifest)描述要緩存的資源,并包含每個(gè)文件內(nèi)容的哈希值。
當(dāng)發(fā)布了應(yīng)用的一個(gè)新版本時(shí),?manifest
?的內(nèi)容就會(huì)改變,通知 Service Worker 應(yīng)該下載并緩存應(yīng)用的一個(gè)新版本了。 這個(gè) manifest 是從 CLI 生成的一個(gè)名叫 ?ngsw-config.json
? 的文件中生成的。
安裝 Angular 的 Service Worker 就像引入一個(gè) ?NgModule
?一樣簡(jiǎn)單。除了使用瀏覽器注冊(cè) Angular 的 Service Worker 之外,還要制作一些可供注入的服務(wù),它們可以與 Service Worker 交互,并控制它。比如,應(yīng)用可以要求當(dāng)新的更新已經(jīng)就緒時(shí)通知自己,或要求 Service Worker 檢查服務(wù)器,看是否有可用的更新。
要使用 Angular Service Worker 的所有功能,請(qǐng)使用最新版本的 Angular 和 Angular CLI。
要注冊(cè) Service Worker,必須通過(guò) HTTPS 而非 HTTP 訪問(wèn)該應(yīng)用程序。瀏覽器會(huì)忽略通過(guò)不安全連接訪問(wèn)的頁(yè)面上的 Service Worker。原因是 Service Worker 非常強(qiáng)大,因此需要格外小心,以確保 Service Worker 的腳本未被篡改。
這條規(guī)則有一個(gè)例外:為了方便本地開發(fā),當(dāng)訪問(wèn) ?localhost
?上的應(yīng)用時(shí),瀏覽器不要求安全連接。
要從 Angular Service Worker 中受益,你的應(yīng)用必須在支持 Service Worker 的 Web 瀏覽器中運(yùn)行。當(dāng)前,最新版本的 Chrome,F(xiàn)irefox,Edge,Safari,Opera,UC 瀏覽器(Android 版)和 Samsung Internet 支持 Service Worker。而 IE 和 Opera Mini 等瀏覽器不支持 Service Worker。
如果用戶通過(guò)不支持 Service Worker 的瀏覽器訪問(wèn)你的應(yīng)用程序,則該 Service Worker 不會(huì)注冊(cè),并且不會(huì)發(fā)生相關(guān)行為,比如脫機(jī)緩存管理和推送通知。進(jìn)一步來(lái)說(shuō):
ngsw.json
? 清單文件。SwUpdate.checkForUpdate()
?,會(huì)返回被拒絕的承諾(Promise)SwUpdate.available
?)的可觀察事件不會(huì)觸發(fā)強(qiáng)烈建議你確保即使在瀏覽器中沒(méi)有 Service Worker 支持的情況下,你的應(yīng)用也可以正常運(yùn)行。盡管不受支持的瀏覽器會(huì)忽略 Service Worker 緩存,但如果應(yīng)用程序嘗試與 Service Worker 進(jìn)行交互,它將仍然會(huì)報(bào)告錯(cuò)誤。比如,調(diào)用 ?SwUpdate.checkForUpdate()
? 將返回被拒絕的承諾。為避免此類錯(cuò)誤,你可以使用 ?SwUpdate.isEnabled()
? 檢查是否啟用了 Angular Service Worker。
要了解關(guān)于其它支持 Service Worker 的瀏覽器的更多信息,請(qǐng)參閱 Can I Use 頁(yè)面和 MDN 文檔。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: