AngularにおけるProgressive Web Apps
AngularアプリをPWAにする
PWAの2つの主要な要件は、サービスワーカーとWebマニフェストです。これらを手動でアプリに追加することもできますが、Angularチームはこれを自動化するために使用できる@angular/pwa
パッケージを提供しています。
@angular/pwa
パッケージは、サービスワーカーとアプリマニフェストをアプリに自動的に追加します。このパッケージをアプリに追加するには、以下のコマンドを実行します。
ng add @angular/pwa
このパッケージの追加後、ionic build --prod
を実行すると、www
ディレクトリがPWAとしてデプロイできるようになります。
デフォルトでは、@angular/pwa
パッケージにはアプリアイコンとしてAngularロゴが付属しています。アプリ名を使用するようにマニフェストを更新し、アイコンも置き換えるようにしてください。
サービスワーカーや多くのJavaScript API(位置情報など)のような機能は、アプリがセキュアなコンテキストでホストされている必要があります。ホスティングサービスを通じてアプリをデプロイする場合は、サービスワーカーを最大限に活用するためにHTTPSが必要であることに注意してください。
サービスワーカーの設定
@angular/pwa
を追加した後、プロジェクトのルートに新しいngsw-config.json
ファイルが作成されます。このファイルは、Angularのサービスワーカーメカニズムがアセットのキャッシュをどのように処理するかを設定する役割を果たします。デフォルトでは、以下が提供されます。
{
"$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"]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": ["/assets/**", "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)"]
}
}
]
}
ここに2つのセクションがあります。1つはアプリ固有のリソース(JS、CSS、HTML)用で、もう1つはアプリがオンデマンドでロードするアセット用です。アプリに応じて、これらのオプションをカスタマイズできます。詳細なガイドについては、Angularチームの公式ガイドを参照してください。
デプロイ
Firebase
Firebaseホスティングは、CDNによる高速な応答時間、デフォルトで有効になっているHTTPS、HTTP/2プッシュのサポートなど、Progressive Web Appsに多くのメリットをもたらします。
まず、まだない場合は、Firebaseでプロジェクトを作成します。
次に、ターミナルでFirebase CLIをインストールします。
npm install -g firebase-tools
firebase-toolsを初めて使用する場合は、firebase login
コマンドでGoogleアカウントにログインしてください。
Firebase CLIがインストールされたら、Ionicプロジェクト内でfirebase init
を実行します。CLIは以下のようにプロンプトを表示します。
「このフォルダに設定するFirebase CLI機能を選択してください。」 「ホスティング:Firebaseホスティングのファイルを設定し(オプションで)GitHub Actionsデプロイを設定します」を選択します。
新しいFirebaseプロジェクトを作成するか、既存のプロジェクトを選択します。
「このディレクトリのデフォルトのFirebaseプロジェクトを選択してください。」 Firebaseウェブサイトで作成したプロジェクトを選択します。
「公開ディレクトリとして何を使用しますか?」 「www」と入力します。
次の質問に答えることで、アプリでのルーティング、ハードリロード、ディープリンクが機能するようになります。
「シングルページアプリとして設定しますか(すべてのURLを/index.htmlに書き換えますか)?」 「はい」と入力します。
「ファイルbuild/index.htmlは既に存在します。上書きしますか?」 「いいえ」と入力します。
GitHubで自動ビルドとデプロイを設定しますか? 「はい」と入力します。
どのGitHubリポジトリにGitHubワークフローを設定しますか? プロジェクト名を入力します。
すべてのデプロイの前にビルドスクリプトを実行するワークフローを設定しますか? 「はい」と入力します。
すべてのデプロイの前に実行するスクリプトは? npm ci && npm run build
と入力します。
PRがマージされたときにサイトのライブチャンネルに自動的にデプロイを設定しますか? 「はい」と入力します。
サイトのライブチャンネルに関連付けられたget hookedブランチの名前は何ですか? プロジェクトのメインブランチ名を入力します。
firebase.json
設定ファイルが生成され、アプリのデプロイが設定されます。
最後に、キャッシュヘッダーが正しく設定されていることを確認する必要があります。これを行うには、firebase.json
ファイルにheaders
スニペットを追加します。完全なfirebase.json
は次のようになります。
{
"hosting": {
"public": "www",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
],
"headers": [
{
"source": "/build/app/**",
"headers": [
{
"key": "Cache-Control",
"value": "public, max-age=31536000"
}
]
},
{
"source": "ngsw-worker.js",
"headers": [
{
"key": "Cache-Control",
"value": "no-cache"
}
]
}
]
}
}
firebase.json
のプロパティの詳細については、Firebaseドキュメントを参照してください。
次に、以下のコマンドを実行して、最適化されたバージョンのアプリをビルドします。
ionic build --prod
最後に、以下のコマンドを実行してアプリをデプロイします。
firebase deploy
これが完了すると、アプリがライブになります。