モダンな技術スタックで構築されたフルスタックReactアプリケーション。Cloudflare Workersでエッジ実行され、認証機能を備えています。
アプリURL: https://haiku.gensito1121.workers.dev/
- React 19 + TypeScript - モダンなUI構築
- Vite - 高速な開発サーバーとビルドツール
- TanStack Router - ファイルベースルーティング
- TanStack Query - データフェッチング
- shadcn/ui - UIコンポーネント
- Tailwind CSS 4 - ユーティリティファーストCSS
- Hono - 軽量高速なAPIフレームワーク
- better-auth - 認証システム
- Drizzle ORM - TypeScript製のORM
- Cloudflare D1 - エッジで動くSQLiteデータベース
- Cloudflare AI - AIモデルへのアクセス
- Cloudflare Workers - エッジコンピューティングプラットフォーム
- Cloudflare D1 - グローバルに分散されたSQLiteデータベース
- Node.js (推奨: 最新のLTS版)
- npm
git clone <repository-url>
cd haiku
npm installローカル開発用のデータベースを初期化:
npm run db:migratenpm run devアプリケーションが http://localhost:3000 で起動します。
- ローカル開発:
.wrangler/state/にSQLiteファイルが作成されます - スキーマ変更:
src/worker/db/schema.tsを編集後、npm run db:genでマイグレーションを生成 - マイグレーション適用:
npm run db:migrate(ローカル) またはnpm run db:migrate:remote(本番) - データベースGUI:
npm run db:studioでDrizzle Studioが起動
- better-authを使用したメール/パスワード認証
- 認証エンドポイント:
/api/auth/* - フロントエンド:
src/react-app/lib/betterAuth.ts - バックエンド:
src/worker/lib/auth.ts
バックエンドはクリーンアーキテクチャとDDDの原則に従って設計されています:
src/worker/
├── domain/ # ドメイン層(ビジネスロジックの中核)
│ ├── entities/ # エンティティ (Verse, Haiku, Senryu, User)
│ ├── value-object/ # 値オブジェクト (VerseForm)
│ ├── factories/ # ファクトリ (VerseFactory)
│ ├── service/ # ドメインサービス (KigoDetectionService)
│ └── interface/ # インターフェース定義
│ ├── repositories/ # リポジトリインターフェース
│ ├── usecase/ # ユースケースインターフェース
│ ├── service/ # サービスインターフェース
│ └── providers/ # プロバイダーインターフェース
├── usecase/ # ユースケース層(アプリケーションロジック)
│ ├── verses/ # 句に関するユースケース
│ └── dangos/ # Dangoに関するユースケース
├── infrastructure/ # インフラ層(外部システムとの接続)
│ ├── VersesRepository.ts
│ ├── DangosRepository.ts
│ ├── UsersRepository.ts
│ └── providers/ # 各種プロバイダー実装
├── controllers/ # コントローラー層(HTTPハンドラ)
│ ├── verses.ts
│ ├── dangos.ts
│ └── users.ts
├── db/ # データベーススキーマ
├── containers.ts # DIコンテナ (tsyringe)
└── index.ts # エントリーポイント
src/
├── react-app/ # フロントエンドアプリケーション
│ ├── routes/ # TanStack Router のルート定義
│ ├── components/ui/ # shadcn/ui コンポーネント
│ └── lib/ # ユーティリティ (router, auth, API client)
└── worker/ # バックエンド (Cloudflare Worker)
npm run dev # 開発サーバーを起動 (http://localhost:3000)
npm run build # 本番用ビルド
npm run preview # ビルドしたアプリをローカルでプレビュー
npm run lint # ESLintを実行
npm run check # 型チェック + ビルド + デプロイのドライランnpm run db:gen # スキーマ変更からマイグレーションファイルを生成
npm run db:migrate # ローカルDBにマイグレーションを適用
npm run db:migrate:remote # 本番DBにマイグレーションを適用
npm run db:studio # ローカルDB用のDrizzle Studioを起動
npm run db:studio:prod # 本番DB用のDrizzle Studioを起動npm run deploy # Cloudflare Workersにデプロイ
npx wrangler tail # デプロイされたWorkerのログを監視npm run cf-typegen # Cloudflareバインディングの型定義を生成本番環境のデータベース操作には、.env ファイルに以下の環境変数が必要です:
CLOUDFLARE_ACCOUNT_ID=your_account_id
CLOUDFLARE_DATABASE_ID=your_database_id
CLOUDFLARE_D1_TOKEN=your_d1_token- シングルWorkerアーキテクチャ: フロントエンドとバックエンドを1つのCloudflare Workerで実行
- エッジファースト: グローバルに分散されたエッジネットワークで高速なレスポンス
- 型安全なAPI: HonoのRPCクライアントでフロントエンド/バックエンド間の型共有
- ファイルベースルーティング: TanStack Routerによる直感的なルート管理
- モダンなReact: React 19の最新機能を活用
- DDD設計: クリーンアーキテクチャに基づいた保守性の高いコード構造
- ライブラリ: tsyringe
- 設定ファイル: src/worker/containers.ts
- 使用例: コントローラーやユースケースで
@injectable()と@inject()を使用
src/worker/domain/entities/ にドメインエンティティを作成
- src/worker/domain/interface/repositories/ にインターフェースを定義
- src/worker/infrastructure/ に実装を作成
- src/worker/containers.ts にDI登録
- src/worker/domain/interface/usecase/ にインターフェースを定義
- src/worker/usecase/ に実装を作成
- src/worker/containers.ts にDI登録
- src/worker/controllers/ にコントローラーを作成
- src/worker/index.ts にルートを追加
- src/worker/db/schema.ts または関連スキーマファイルを編集
npm run db:genでマイグレーションファイルを生成npm run db:migrateでローカルDBに適用- 本番環境には
npm run db:migrate:remoteで適用