Skip to content

技術スタック

概要

TREK の構成を参考に、マイル旅行計画に最適化した技術スタックを選定する。

選定結果

レイヤー技術選定理由
FrontendReact 18 + Vite + Tailwind CSSTREK同構成、エコシステム豊富、PWA対応容易
BackendNode.js + ExpressJS統一、TREK同構成
DatabaseSQLite (better-sqlite3)セルフホスト向き、シンプル、ゼロ設定
State管理Zustand軽量、ボイラープレート少ない
地図Leaflet + react-leaflet無料、日本地図対応、OSS
PWAvite-plugin-pwa + Workboxオフライン対応
AuthJWTシンプルな認証
アイコンlucide-react豊富なアイコンセット
デプロイDockerセルフホスト可能

フロントエンド詳細

React + Vite

フロントエンド構成:
├── React 18          # UI ライブラリ
├── Vite              # ビルドツール(HMR高速)
├── Tailwind CSS      # ユーティリティファースト CSS
├── Zustand           # 状態管理
├── React Router      # ルーティング
├── react-leaflet     # 地図コンポーネント
└── lucide-react      # アイコン

主要ライブラリ

パッケージ用途
react-leafletLeaflet の React ラッパー
react-leaflet-clusterマーカーのクラスタリング
@tanstack/react-queryサーバーステート管理・キャッシュ
react-dndドラッグ&ドロップ(日程管理)
rechartsチャート(予算・マイル効率グラフ)
date-fns日付操作

バックエンド詳細

Node.js + Express

バックエンド構成:
├── Express           # HTTP サーバー
├── better-sqlite3    # SQLite ドライバ
├── jsonwebtoken      # JWT 認証
├── node-cron         # 定期実行(データ更新)
└── ws                # WebSocket(将来のリアルタイム同期用)

API構成

/api/v1/
├── /auth              # 認証
│   ├── POST /register
│   ├── POST /login
│   └── GET  /me
├── /miles             # マイル管理
│   ├── GET  /balance
│   ├── PUT  /balance
│   └── GET  /chart
├── /search            # 検索
│   ├── GET  /destinations
│   └── GET  /recommend
├── /accommodation     # 宿泊検索
│   └── GET  /search
└── /trips             # 旅行プラン
    ├── GET    /
    ├── POST   /
    ├── GET    /:id
    ├── PUT    /:id
    └── DELETE /:id

データベース

SQLite を選んだ理由

項目SQLitePostgreSQL
セットアップゼロ設定サーバー必要
バックアップファイルコピーpg_dump
パフォーマンス読み取り高速書き込み高速
同時接続制限あり高並行性
セルフホスト最適やや手間

Phase 1〜3 のユースケースでは SQLite で十分。将来的にマルチユーザー対応が必要になった場合は PostgreSQL に移行を検討。

ディレクトリ構造(案)

selfTravelPlanning/
├── client/                    # フロントエンド
│   ├── public/
│   ├── src/
│   │   ├── components/        # UIコンポーネント
│   │   │   ├── common/        # 共通コンポーネント
│   │   │   ├── map/           # 地図関連
│   │   │   ├── search/        # 検索UI
│   │   │   └── trip/          # 旅行プラン
│   │   ├── hooks/             # カスタムフック
│   │   ├── stores/            # Zustand ストア
│   │   ├── pages/             # ページコンポーネント
│   │   ├── utils/             # ユーティリティ
│   │   └── App.jsx
│   ├── index.html
│   └── vite.config.js
├── server/                    # バックエンド
│   ├── src/
│   │   ├── routes/            # Express ルート
│   │   ├── services/          # ビジネスロジック
│   │   ├── models/            # DB モデル
│   │   ├── middleware/        # ミドルウェア
│   │   └── index.js
│   └── data/                  # SQLite DB ファイル
├── docs/                      # 設計書(VitePress)
├── docker-compose.yml
├── Dockerfile
└── package.json