使用 Angular Service Worker 進行預先快取

利用 Angular 服務工作站,即使網路連線速度不佳,您的應用程式也能更快速可靠。

處理連線受限的問題

當使用者的網路存取權受限 (或是根本沒有存取) 時,網頁應用程式的功能可能會大幅降低,且經常無法使用。使用 Service Worker 提供預先快取功能,即可攔截網路要求,並直接從本機快取傳送回應,不必從網路擷取要求。快取應用程式的資產後,這種方法可確實加快應用程式執行速度,並在使用者離線時運作。

本文會逐步說明如何在 Angular 應用程式中設定預先快取。本文假設您已熟悉預先快取和服務工作站。如果需要複習,請參閱 Service Worker 和 Cache Storage API 相關文章。

Angular Service Worker 簡介

Angular 團隊提供預先快取功能,與架構和 Angular 指令列介面 (CLI) 妥善整合。

如要新增 Service Worker,請在 CLI 中執行下列指令:

ng add @angular/pwa
敬上

@angular/service-worker@angular/pwa 現在應安裝在應用程式中,且應顯示在 package.json 中。ng-add schematic 也會將名為 ngsw-config.json 的檔案新增至專案,您可以透過該檔案設定 Service Worker。(這個檔案包含預設設定,您稍後會加以自訂)。

現在建構用於正式環境的專案:

ng build --prod

dist/service-worker-web-dev 目錄中,可以找到名為 ngsw.json 的檔案。這個檔案會告知 Angular 服務工作人員如何快取應用程式中的資產。系統會在建構程序期間根據設定 (ngsw-config.json) 和建構期間產生的資產產生檔案。

現在,在包含應用程式正式版資產的目錄中啟動 HTTP 伺服器,開啟公開網址,然後在 Chrome 開發人員工具中查看網路要求:

  1. 按下 Control+Shift+J 鍵 (或在 Mac 上為 Command+Option+J 鍵) 開啟開發人員工具。
  2. 按一下 [網路] 分頁標籤。

請注意,「Network」分頁由 ngsw-worker.js 指令碼直接在背景下載多個靜態資產:

範例應用程式

這是 Angular Service Worker,用來預先快取產生的 ngsw.json 資訊清單檔案中指定的靜態資產。

但缺少 1 個重要素材資源:nyan.png。如要友善快取這張圖片,您需要在工作區根目錄的 ngsw-config.json 中新增包含該映像檔的模式:

{
  "$schema": "./node_modules/@angular/service-worker/config/schema.json",
  "index": "/index.html",
  "assetGroups": [
    {
      "name": "app",
      "installMode": "prefetch",
      "resources": {
      "files": [
        "/favicon.ico",
        "/index.html",
        "/*.css",
        "/*.js",
        "/assets/*.png"
        ]
      }
    },
    ...
}

這項變更會將 /assets 資料夾中的所有 PNG 圖片加入 app 資源素材資源群組。由於這個素材資源群組的 installMode 設為 prefetch,因此服務工作處理程序會預先快取所有指定素材資源 (現在包含 PNG 圖片)。

指定要預先快取的其他資產也非常簡單:更新 app 資源素材資源群組中的模式。

結論

使用 Service Worker 進行預先快取,可以將資產儲存至本機快取,提高應用程式效能,在網路連線品質不佳的網路時更穩定。如要搭配 Angular 和 Angular CLI 使用預先快取:

  1. 在專案中新增 @angular/pwa 套件。
  2. 編輯 ngsw-config.json,控管 Service Worker 快取的內容。