Angular Service Worker を使用した事前キャッシュ

Angular Service Worker を使用すると、接続が不安定なネットワークでもアプリの速度と信頼性を高めることができます。

ユーザーのネットワーク アクセスが制限されている場合や、まったくアクセスできない場合、ウェブアプリの機能が大幅に低下し、多くの場合機能しなくなります。Service Worker を使用してプリキャッシュ機能を提供すると、ネットワーク リクエストをインターセプトし、ネットワークから取得するのではなく、ローカル キャッシュから直接レスポンスを配信できます。アプリのアセットがキャッシュに保存されると、この方法でアプリの速度を大幅に向上させ、ユーザーがオフラインの場合でもアプリを動作させることができます。

この投稿では、Angular アプリでのプリキャッシュのセットアップ方法について説明します。読者がプリキャッシュと Service Worker に関する一般的な知識をすでに身に付けていることを前提としています。復習が必要な場合は、Service Worker と Cache Storage API の投稿をご覧ください。

Angular サービス ワーカーの導入

Angular チームは、事前キャッシュ機能が組み込まれた Service Worker モジュールを提供しています。このモジュールは、フレームワークと Angular コマンドライン インターフェース(CLI)と完全に統合されています。

Service Worker を追加するには、CLI で次のコマンドを実行します。

ng add @angular/pwa

これで、@angular/service-worker@angular/pwa がアプリにインストールされ、package.json に表示されます。ng-add スキマティックでは、ngsw-config.json というファイルもプロジェクトに追加されます。このファイルは、サービス ワーカーの構成に使用できます。(このファイルにはデフォルト設定が含まれていますが、後でカスタマイズします)。

次に、本番環境用にプロジェクトをビルドします。

ng build --prod

dist/service-worker-web-dev ディレクトリ内に ngsw.json という名前のファイルがあります。このファイルは、アプリのアセットをキャッシュに保存する方法について Angular サービス ワーカーに指示します。このファイルは、構成(ngsw-config.json)とビルド時に生成されたアセットに基づいて、ビルドプロセス中に生成されます。

アプリの本番環境アセットを含むディレクトリで HTTP サーバーを起動し、パブリック URL を開いて、Chrome DevTools でネットワーク リクエストを確認します。

  1. `Ctrl+Shift+J` キー(Mac の場合は `Command+Option+J`)を押して、DevTools を開きます。
  2. [ネットワーク] タブをクリックします。

[Network] タブには、ngsw-worker.js スクリプトによってバックグラウンドで直接ダウンロードされる多数の静的アセットがあります。

サンプルアプリ

これは、生成された ngsw.json マニフェスト ファイルで指定された静的アセットをプリキャッシュする Angular サービス ワーカーです。

ただし、重要なアセットが 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 リソース アセット グループに追加されます。このアセット グループの installModeprefetch に設定されているため、Service Worker は指定されたすべてのアセット(PNG 画像を含む)をプリキャッシュします。

プリキャッシュする他のアセットを指定するのは簡単です。app リソース アセット グループのパターンを更新します。

まとめ

プレキャッシュに Service Worker を使用すると、アセットをローカル キャッシュに保存してアプリのパフォーマンスを向上させることができます。これにより、低品質のネットワークにおけるアプリの信頼性が向上します。Angular と Angular CLI で事前キャッシュを使用するには:

  1. @angular/pwa パッケージをプロジェクトに追加します。
  2. ngsw-config.json を編集して、サービス ワーカーがキャッシュに保存する内容を制御します。