テーマ
PWA
目的
- インストール可能なアプリ体験
- 不安定回線下でもクラッシュしない(オフライン耐性)
- リマインダー / LINE 着信を Web Push で通知
採用方針
- Nuxt の PWA モジュール(
@vite-pwa/nuxt)を採用 - Service Worker は Workbox ベースで生成
- マニフェスト / アイコンは
public/に配置
キャッシュ戦略
| リソース種別 | 戦略 | 説明 |
|---|---|---|
| 静的アセット (JS/CSS/Image/Font) | Cache First | ハッシュ付きで版管理されているため安全 |
| アプリシェル / ページHTML | Stale-While-Revalidate | 初動を高速化、バックグラウンドで最新化 |
| API GET (顧客 / スケジュール) | Network First → Cache fallback | オンライン優先、落ちたら直近キャッシュ |
| API POST/PUT/DELETE | オフラインキュー | Background Sync で再送 |
オフライン書き込み(Background Sync)
- 書き込みは
idempotencyKeyを付けてサーバ側で重複検出。 - 競合時は最後勝ち / マージのどちらにするかリソース別に決める(顧客メモは追記、契約データは衝突表示)。
Push 通知
- Web Push 標準(VAPID)。
- 用途:
- スケジュールリマインダ(更新近接、訪問予定)
- LINE 1:1 メッセージ着信
- 重要システム通知(請求失敗等、OWNER向け)
- iOS 16.4+ の Web Push に対応するため、ホーム画面追加を促すフローを用意。
インストール体験
- iOS / Android の差異を吸収するインストールガイド画面(初回ログイン後)
beforeinstallpromptを握って独自ボタンから誘発(Android)- iOS は「ホーム画面に追加」の手順を画像付きで案内
データ保持(IndexedDB)
- 顧客 / スケジュール / 直近のLINEトーク は IndexedDB に短期キャッシュ
- 容量制御: テナント別に LRU で削除、上限 50–100MB を目安
- 機微情報の取り扱い: 端末紛失リスクに備えて、ログアウトで全削除する
バージョン更新
- 新しい SW がインストールされたら、ユーザーに「更新があります」トーストで明示更新を促す(自動 reload しない)
- 強制更新が必要な場合のみ、サーバから「最低クライアントバージョン」を返す機構を用意
設計上の注意
- SSR との整合: Nuxt のSSR出力がそのままキャッシュ対象になるため、認証必須ページのキャッシュ可否を慎重に設計。
- Workers 環境特有の制限: SSR 時にユーザー固有データを差し込む場合、SW のキャッシュキーから cookie 由来分を除く / 別キャッシュにする。
- PII: オフラインキャッシュは個人情報を含む。デバイスロック前提、長期保管しない設計。