Next.jsでプログレッシブウェブアプリケーション (PWA) を構築する方法
プログレッシブウェブアプリケーション (PWA) は、ウェブアプリケーションの到達性とアクセシビリティに、ネイティブモバイルアプリの機能とユーザー体験を組み合わせたものです。Next.jsを使用すれば、複数のコードベースやアプリストアの承認を必要とせず、すべてのプラットフォームでシームレスなアプリのような体験を提供するPWAを作成できます。
PWAを使用すると次のことが可能です:
- アプリストアの承認を待たずに即座に更新をデプロイ
- 単一のコードベースでクロスプラットフォームアプリケーションを作成
- ホーム画面へのインストールやプッシュ通知などのネイティブのような機能を提供
Next.jsでPWAを作成する
1. Webアプリマニフェストの作成
Next.jsはApp Routerを使用したウェブアプリマニフェストの作成を組み込みでサポートしています。静的または動的なマニフェストファイルを作成できます:
例えば、app/manifest.ts
または app/manifest.json
ファイルを作成します:
このファイルには、アプリの名前、アイコン、ユーザーのデバイス上でアイコンとして表示される方法に関する情報が含まれている必要があります。これにより、ユーザーはPWAをホーム画面にインストールでき、ネイティブアプリのような体験を得られます。
ファビコンジェネレーターなどのツールを使用してさまざまなアイコンセットを作成し、生成されたファイルをpublic/
フォルダに配置できます。
2. Webプッシュ通知の実装
Webプッシュ通知は、以下のすべての最新ブラウザでサポートされています:
- ホーム画面にインストールされたアプリ用のiOS 16.4+
- macOS 13以降のSafari 16
- Chromiumベースのブラウザ
- Firefox
これにより、PWAはネイティブアプリの代替として有効です。特に、オフラインサポートがなくてもインストールプロンプトをトリガーできます。
Webプッシュ通知を使用すると、ユーザーがアプリを積極的に使用していない場合でも再エンゲージメントが可能です。Next.jsアプリケーションで実装する方法は次のとおりです:
まず、app/page.tsx
にメインページコンポーネントを作成しましょう。理解しやすいように小さな部分に分割します。まず、必要なインポートとユーティリティを追加します。参照されているServer Actionがまだ存在しなくても問題ありません:
次に、プッシュ通知の購読、購読解除、送信を管理するコンポーネントを追加しましょう。
最後に、iOSデバイス向けにホーム画面にインストールする方法を指示するメッセージを表示するコンポーネントを作成し、アプリがまだインストールされていない場合にのみ表示します。
次に、このファイルが呼び出すServer Actionを作成しましょう。
3. Server Actionの実装
app/actions.ts
に新しいファイルを作成して、購読の作成、削除、通知の送信を処理します。
通知の送信は、ステップ5で作成するサービスワーカーによって処理されます。
本番環境では、サーバーの再起動をまたいで永続化し、複数のユーザーの購読を管理するために、購読情報をデータベースに保存する必要があります。
4. VAPIDキーの生成
Web Push APIを使用するには、VAPIDキーを生成する必要があります。最も簡単な方法は、web-push CLIを直接使用することです:
まず、web-pushをグローバルにインストールします:
次のコマンドを実行してVAPIDキーを生成します:
出力をコピーして、.env
ファイルにキーを貼り付けます:
5. サービスワーカーの作成
サービスワーカー用にpublic/sw.js
ファイルを作成します:
このサービスワーカーは、カスタム画像と通知をサポートしています。受信したプッシュイベントと通知クリックを処理します。
icon
とbadge
プロパティを使用して通知用のカスタムアイコンを設定できますvibrate
パターンを調整して、サポートされているデバイスでカスタム振動アラートを作成できますdata
プロパティを使用して通知に追加データを添付できます
サービスワーカーがさまざまなデバイスやブラウザで期待どおりに動作することを確認するために、十分にテストしてください。また、notificationclick
イベントリスナーの'https://your-website.com'
リンクをアプリケーションの適切なURLに更新することを忘れないでください。
6. ホーム画面への追加
ステップ2で定義したInstallPrompt
コンポーネントは、iOSデバイス向けにホーム画面へのインストール方法を指示するメッセージを表示します。
モバイルホーム画面にアプリケーションをインストール可能にするためには、以下が必要です:
- 有効なウェブアプリマニフェスト(ステップ1で作成)
- HTTPSで提供されるウェブサイト
現代のブラウザはこれらの条件を満たすと、自動的にインストールプロンプトをユーザーに表示します。beforeinstallprompt
を使用してカスタムインストールボタンを提供することも可能ですが、クロスブラウザ・クロスプラットフォームで動作しない(Safari iOSでは機能しない)ため推奨しません。
7. ローカルでのテスト
ローカル環境で通知を確認するには、以下を確認してください:
- HTTPSを使用したローカル実行を行っていること
- テストには
next dev --experimental-https
を使用
- テストには
- ブラウザ(Chrome、Safari、Firefox)で通知が有効になっていること
- ローカルでプロンプトが表示されたら、通知の使用許可を与えてください
- ブラウザ全体で通知が無効化されていないことを確認
- それでも通知が表示されない場合は、別のブラウザでデバッグを試みてください
8. アプリケーションのセキュリティ保護
セキュリティは、特にPWAにおいて重要な側面です。Next.jsではnext.config.js
ファイルを使用してセキュリティヘッダーを設定できます。例:
各オプションの説明:
- グローバルヘッダー(全ルートに適用):
X-Content-Type-Options: nosniff
:MIMEタイプスニッフィングを防止し、悪意のあるファイルアップロードのリスクを低減X-Frame-Options: DENY
:クリックジャッキング攻撃から保護するため、サイトがiframeに埋め込まれるのを防止Referrer-Policy: strict-origin-when-cross-origin
:リクエストに含まれるリファラー情報を制御し、セキュリティと機能性のバランスを取る
- サービスワーカー固有のヘッダー:
Content-Type: application/javascript; charset=utf-8
:サービスワーカーがJavaScriptとして正しく解釈されることを保証Cache-Control: no-cache, no-store, must-revalidate
:サービスワーカーのキャッシュを防止し、ユーザーが常に最新版を取得できるようにするContent-Security-Policy: default-src 'self'; script-src 'self'
:サービスワーカーに対して厳格なコンテンツセキュリティポリシーを実装し、同一オリジンのみスクリプトを許可
Next.jsでのコンテンツセキュリティポリシー定義についてさらに学びましょう。
次のステップ
- PWA機能の探索:PWAはさまざまなWeb APIを活用して高度な機能を提供できます。バックグラウンド同期、定期的なバックグラウンド同期、File System Access APIなどの機能を探索してアプリケーションを強化することを検討してください。最新のPWA機能についてはWhat PWA Can Do Todayなどのリソースを参照。
- 静的エクスポート:サーバーを実行せずに静的ファイルのエクスポートを使用する必要がある場合、Next.js設定を更新してこの変更を有効にできます。Next.js静的エクスポートドキュメントで詳細を確認。ただし、Server Actionsから外部APIの呼び出しに移行し、定義したヘッダーをプロキシに移動する必要があります。
- オフラインサポート:オフライン機能を提供するには、Next.jsでSerwistを使用する方法があります。Next.jsとSerwistの統合例はドキュメントで確認できます。注:現在このプラグインにはwebpack設定が必要です。
- セキュリティ考慮事項:サービスワーカーが適切に保護されていることを確認してください。HTTPSの使用、プッシュメッセージのソース検証、適切なエラーハンドリングの実装が含まれます。
- ユーザーエクスペリエンス:プログレッシブエンハンスメント技術を実装し、ユーザーのブラウザが特定のPWA機能をサポートしていない場合でもアプリが適切に動作するように考慮してください。