處理導航要求

使用 Service Worker 回應導航要求,不必等待網路。

當您在導覽列中輸入新網址,或透過網頁上的連結前往新網址時,瀏覽器發出的 HTML 文件要求是瀏覽器發出的 HTML 文件要求。這就是服務工作站對效能的最大的影響:如果您使用 Service Worker 來回應導覽要求,而不等待網路,那麼除了在無法使用網路時確保導覽穩定外,還能確保導覽速度穩定可靠。相較於 HTTP 快取,這是 Service Worker 帶來的單一最大效能優勢。

如「識別從網路載入的資源」指南所述,在網路流量「刊登序列」中可能有許多要求發出的要求中,導覽要求是第一個。透過導覽要求載入的 HTML 會啟動所有其他子資源 (例如圖片、指令碼和樣式) 要求的流程。

在服務工作站的 fetch 事件處理常式中,您可以透過檢查 FetchEventrequest.mode 屬性,判斷要求是否為導覽要求。如果設為 'navigate',則為導覽要求。

一般而言,請勿使用長期的 Cache-Control headers 來快取導覽要求的 HTML 回應。它們通常應該透過網路並搭配使用 Cache-Control: no-cache,確保 HTML 及後續網路要求鏈結 (合理) 保持最新狀態。當使用者每次前往新網頁時,不幸地進入網路就表示每次瀏覽的速度都「可能」。至少代表它的運作速度較不「穩定」

不同的架構方法

想瞭解在避開網路的情況下回應導航要求的方式,可能並不容易。具體方法取決於網站架構和使用者可能前往的不重複網址數量。

雖然沒有一體適用的解決方案,但下列一般指南可協助您判斷哪種做法最可行。

小型靜態網站

如果您的網頁應用程式只包含相對較少 (例如幾個

您可以使用預先快取,在安裝 Service Worker 後立即快取 HTML,且每次重新建構網站並重新部署 Service Worker 時,也能更新快取的 HTML。

或者,如果您不想預先快取所有 HTML (可能是因為使用者通常只會瀏覽網站上一部分的網址),可以使用 stale-while-revalidate 執行階段快取策略。不過,由於每個 HTML 文件是分別快取及更新,因此請謹慎使用。如果您只有一組使用者「經常」重新檢索的少數網址,而且您認為這些網址會彼此獨立重新驗證,就最適合使用執行階段快取進行 HTML。

單頁應用程式

現代網頁應用程式經常使用單頁架構。其中,用戶端 JavaScript 會配合使用者動作修改 HTML。這個模型會在使用者與網頁應用程式互動時,使用 History API 修改目前的網址,藉此建立「模擬」導覽作業的有效性。雖然後續導覽可能是「假的」,但初始導覽實際上沒有樣子,而您仍需確保其未受到網路封鎖。

如果您採用單頁架構,則有從快取提供初始導覽的簡單模式:應用程式殼層。在此模型中,無論要求的網址為何,您的服務工作站都會傳回已友善載入的相同 HTML 檔案來回應導航要求。這段 HTML 程式碼應該很簡單,可能包含一般載入指標或骨架內容。瀏覽器從快取載入這個 HTML 後,現有的用戶端 JavaScript 就會接管,然後轉譯原始導覽要求中網址的正確 HTML 內容。

Workbox 提供實作這個方法所需的工具;navigateFallback option 可讓您指定要使用哪個 HTML 文件做為應用程式殼層,以及選用的允許和拒絕清單,將此行為限制在網址子集。

多頁面應用程式

如果您的網路伺服器會動態產生網站的 HTML,或是擁有超過十個專屬網頁,則在處理導覽要求時,就會更難避免網路。「其他所有項目」的建議可能適用您。

不過,對於一部分的多頁面應用程式,您或許可以實作服務工作站,完整複製網路伺服器使用的邏輯以產生 HTML。如果您可以在伺服器和 Service Worker 環境之間共用轉送和範本資訊,尤其是如果您的網路伺服器使用 JavaScript (而不需要依賴 Node.js 特定功能,如檔案系統存取),則最適合使用此方法。

如果您的網路伺服器屬於該類別,並您想要探索將 HTML 產生作業從網路移到服務工作處理程序的一種方法,不妨參閱「除 SPA:PWA 的替代架構」中的指南,瞭解如何踏出第一步。

其他

如果您無法使用快取 HTML 回應導覽要求,請務必採取相關步驟,確保在網站上新增 Service Worker (處理其他非 HTML 要求) 不會導致瀏覽速度變慢。如果啟動 Service Worker,但並未使用該工具回應導航要求,會產生少量延遲 (詳情請參閱透過服務工作站建構更快、更彈性的應用程式)。如要減輕這類負擔,您可以啟用名為導覽預先載入的功能,然後使用已預先載入 fetch 事件處理常式內的網路回應

Workbox 提供輔助程式庫,可偵測功能是否支援導覽預先載入。如果支援,可以簡化流程,讓服務工作站使用網路回應。

相片由 Aaron BurdenUnsplash 提供