WeatherToRun

Next.js Edge Functions、マルチレイヤーキャッシュ、独自の天候スコアリングで、高速な PWA を構築し、ランナーのトレーニング計画を支援。

Next.jsTypeScriptPWAEdge Functionsパフォーマンス
WeatherToRun

課題

ランナーにとって毎日の悩みは同じです。

  • 今日は走るべきか
  • 何を着るべきか

多くの天気アプリは気温や湿度、風速を表示するだけで、意思決定そのものはユーザー任せです。私自身、毎朝頭の中で計算して判断していましたが、外すことも多く、服装ミスや急な雨に悩まされていました。

どう作ったか

WeatherToRun の方針はシンプルです。

「生データを並べる」のではなく、「走る判断を返す」。

複数の気象要素を 1〜100 のスコアに統合し、色付きの評価("悪い" / "普通" / "良い")で即判断できるようにしました。

主な実装ポイント:

  • 根拠あるスコアリング:温度・風・露点・降水・UV の重みを、ランニングへの影響に基づいて設計。
  • Edge 実行:API を Vercel Edge Runtime で動かし、起動遅延を最小化。
  • 多層キャッシュ:Edge キャッシュ + クライアントキャッシュ + 座標丸めでヒット率改善。
  • 服装の個別最適化:「厚着寄り / 薄着寄り」の好み設定。
  • PWA 対応:インストール可能、オフライン時も利用可能。

UI 設計

実装前に手書きで情報設計を行い、最優先情報を明確化しました。

  1. 走行スコア
  2. 服装提案
  3. 補足情報

この順序で、短時間で意思決定できる体験を作りました。

WeatherToRun スケッチ 1 - メイン画面WeatherToRun スケッチ 2 - コンポーネント構造WeatherToRun スケッチ 3 - ユーザーフロー

初期ワイヤーフレーム(メインビュー、構造、ユーザーフロー)。

オフライン対応

PWA では「全部キャッシュ」ではなく、リソースに応じた戦略が重要です。

  • CacheFirst:静的アセット
  • NetworkFirst:manifest
  • NetworkOnly:ナビゲーションと RSC payload(整合性重視)

オフライン時には専用ページを表示し、ブラウザ標準エラーを避けました。

本番運用での工夫

障害対策

  • 429 や一時的なネットワーク不調に バックオフ付きリトライ
  • 天気と AQI でタイムアウトを分け、AQI 失敗時は機能を継続

データ鮮度

低トラフィック時に ISR だけでは更新が遅れるため、30 分ごとに再検証エンドポイントを叩く運用を追加。

  • revalidateTag('weather') で関連キャッシュを一括更新
  • stale-while-revalidate で初回表示速度を維持

学び

  • ユーザー価値は「情報量」より「判断の速さ」にある
  • 信頼性は目に見えないが UX に直結する
  • Edge と正しいキャッシュ戦略の組み合わせは強力