Skip to content

PWA

目的

  • インストール可能なアプリ体験
  • 不安定回線下でもクラッシュしない(オフライン耐性)
  • リマインダー / LINE 着信を Web Push で通知

採用方針

  • Nuxt の PWA モジュール(@vite-pwa/nuxt)を採用
  • Service Worker は Workbox ベースで生成
  • マニフェスト / アイコンは public/ に配置

キャッシュ戦略

リソース種別戦略説明
静的アセット (JS/CSS/Image/Font)Cache Firstハッシュ付きで版管理されているため安全
アプリシェル / ページHTMLStale-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: オフラインキャッシュは個人情報を含む。デバイスロック前提、長期保管しない設計。

未確定