處理導航要求

使用服務工作站,不必等待網路回應導覽要求。

導覽要求是指瀏覽器在您在導覽列中輸入新網址,或點選網頁上的連結前往新網址時,所提出的 HTML 文件要求。這就是服務工作者對效能造成最大影響的地方:如果您使用服務工作者回應導覽要求,而不需要等待網路,就能確保導覽速度穩定且快速,並在網路無法使用時保持彈性。相較於 HTTP 快取,這是 Service Worker 帶來的最大效能優勢。

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

在服務工作者的 fetch 事件處理常式中,您可以檢查 FetchEvent 上的 request.mode 屬性,判斷要求是否為導覽。如果設為 'navigate',則表示是導航要求。

一般來說,請勿使用長效 Cache-Control headers 快取導覽要求的 HTML 回應。通常,您應透過網路和 Cache-Control: no-cache 滿足這些要求,確保 HTML 和後續網路要求鏈結 (合理) 保持新鮮。每次使用者前往新頁面時,都會與網路連線,因此每個導覽動作「可能」會變慢。至少表示速度不會穩定

架構的不同方法

如何在避免使用網路的情況下回應導覽要求,可能會相當棘手。適當的方法取決於網站的架構,以及使用者可能前往的獨特網址數量。

雖然沒有一體適用的解決方案,但下列一般規則可協助您決定最可行的方法。

小型靜態網站

如果您的網頁應用程式包含相對較少 (例如幾十個) 的獨特網址,且每個網址都對應至不同的靜態 HTML 檔案,那麼一個可行的方法就是將所有 HTML 檔案快取,並使用適當的快取 HTML 回應導覽要求。

使用預先快取功能,您可以在服務工作站安裝後立即快取 HTML,並在每次重建網站和重新部署服務工作站時更新快取的 HTML。

或者,如果您不想預先快取所有 HTML (可能是因為使用者傾向於只前往網站上的部分網址),可以使用「stale-while-revalidate」執行階段快取策略。不過,請小心使用這種做法,因為每個 HTML 文件都會個別快取及更新。如果有少數網址會由同一組使用者「經常」重新造訪,且您認為這些網址可以獨立重新驗證,那麼使用 HTML 的執行階段快取功能最適合。

單頁面應用程式

單頁架構經常用於新一代的網路應用程式。在這個過程中,用戶端 JavaScript 會根據使用者動作修改 HTML。這個模型會在使用者與網頁應用程式互動時,使用 History API 修改目前的網址,進而產生「模擬」導覽。雖然後續導覽可能為「假導覽」,但初始導覽是真實的,因此仍須確保網路不會封鎖這項導覽。

幸好,如果您使用單頁架構,則有一個簡單的模式可遵循,從快取提供初始導覽:應用程式殼層。在這個模型中,服務工作者會傳回已預先快取的單一 HTML 檔案,藉此回應導覽要求,無論要求的網址為何皆然。這個 HTML 應為簡單的 HTML,可能包含一般載入指標或骨架內容。瀏覽器從快取載入這段 HTML 後,現有的用戶端 JavaScript 就會接手,並根據原始導覽要求,為網址算繪正確的 HTML 內容。

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

多頁應用程式

如果您的網頁伺服器會動態產生網站的 HTML,或是您有數十個以上的獨立網頁,那麼在處理導覽要求時,要避免使用網路就更加困難。其他部分的建議可能適用於您。

不過,針對某些特定的多頁應用程式,您可以實作 Service Worker,完全複製網頁伺服器用於產生 HTML 的邏輯。如果您可以在伺服器和服務工作者環境之間共用路由和範本資訊,這項做法最為理想,特別是如果您的網頁伺服器使用 JavaScript (不依賴 Node.js 專屬功能,例如檔案系統存取功能),更是如此。

如果您的網頁伺服器屬於這個類別,且您想瞭解如何將 HTML 產生作業從網路移至服務工作者,請參閱「除了 SPA:PWA 的其他架構」一文中的指引,瞭解如何開始這項作業。

其他

如果您無法使用快取的 HTML 回應導覽要求,請採取必要步驟,確保在網站中加入服務工作者 (以便處理其他非 HTML 要求) 不會導致導覽速度變慢。啟動 Service Worker 時,如果未使用 Service Worker 回應導覽要求,就會造成少許延遲 (如「使用 Service Worker 建構更快速、更具彈性的應用程式」一文所述)。您可以啟用名為「導覽預先載入」的功能,然後使用在 fetch 事件處理常式中預先載入的網路回應,藉此降低這項開銷。

Workbox 提供輔助程式庫,可偵測是否支援導覽預先載入功能,如果支援,則可簡化告知服務工作者使用網路回應的程序。

相片來源:Aaron BurdenUnsplash 網站上提供