React Native + Expo で構築されたTodo管理アプリケーションです。カレンダー機能と連携し、ローカルSQLiteデータベースを使用してデータを管理します。
このプロジェクトは、Expo SDK 54をベースに、React 19.1.0とReact Native 0.81.5を採用した最新の技術スタックを使用しています。Expo Routerを使用したファイルベースルーティング、Drizzle ORMによる型安全なデータベース操作、NativeWindによるスタイリングを採用したモダンなReact Nativeアプリケーションです。
- Todo管理: 作成、編集、削除機能
- カレンダー連携: Todo作成日をカレンダーに表示
- 日付フィルタリング: カレンダーから日付を選択してTodoを表示
- ローカルデータベース: Expo SQLiteを使用したオフライン対応
- リアルタイム更新: データベースの変更を自動反映
- フォームバリデーション: React Hook Form + Zodによる入力検証
- React (19.1.0)
- React Native (0.81.5)
- Expo (54.0.32)
- TypeScript (5.9.2)
- Expo Router (6.0.22) - ファイルベースルーティング
- NativeWind (4.2.1) - Tailwind CSS for React Native
- React Native Calendars (1.1313.0) - カレンダーUIコンポーネント
- Expo SQLite (16.0.10) - ローカルSQLiteデータベース
- Drizzle ORM (0.44.7) - 型安全なORM
- React Hook Form (7.71.1) - フォーム管理
- Zod (4.3.6) - スキーマバリデーション
- @hookform/resolvers (5.2.2) - React Hook FormとZodの統合
- Bun - パッケージマネージャー
- Biome - フォーマッター兼リンター
- Drizzle Kit (0.31.6) - マイグレーション管理
- Node.js 18以上
- Bun(推奨)またはnpm/yarn
- Expo CLI(グローバルインストール推奨)
- リポジトリのクローン
git clone <repository-url>
cd expo-sqlite-nativewind-template- 依存関係のインストール
bun installまたは
npm install- 開発サーバーの起動
bun run startまたは
npm start- アプリの実行
開発サーバー起動後、以下の方法でアプリを実行できます:
- iOS Simulator:
iキーを押す、またはbun run ios - Android Emulator:
aキーを押す、またはbun run android - Web:
wキーを押す、またはbun run web - Expo Go: スマートフォンでQRコードをスキャン
src/
├── app/ # Expo Router ページ
│ ├── _layout.tsx # ルートレイアウト(タブナビゲーション)
│ ├── index.tsx # Todo一覧ページ
│ ├── calendar.tsx # カレンダーページ
│ └── global.css # グローバルスタイル
├── components/ # コンポーネント
│ ├── todo/ # Todo関連コンポーネント
│ │ ├── TodoForm.tsx # Todo作成フォーム
│ │ └── TodoItem.tsx # Todoアイテム表示・編集
│ └── ui/ # 汎用UIコンポーネント
│ ├── Button.tsx
│ ├── Calendar.tsx # 汎用カレンダーコンポーネント
│ └── TextInput.tsx
├── drizzle/ # Drizzle ORM設定
│ ├── db.ts # データベース接続
│ ├── schema/ # スキーマ定義
│ │ └── todoSchema.ts # Todoテーブルスキーマ
│ └── migrations/ # マイグレーションファイル
├── hooks/ # カスタムフック
│ └── useCalendarTodos.ts # カレンダー用Todo処理
├── lib/ # ビジネスロジック
│ ├── todo.ts # Todo CRUD操作
│ └── date.ts # 日付ユーティリティ
├── types/ # TypeScript型定義
│ ├── todo.ts # Todo型(Zodから生成)
│ └── calendar.ts # カレンダー型
└── zod/ # Zodバリデーションスキーマ
└── todo.schema.ts # Todoスキーマ定義
- ホーム画面(Todoタブ)で「新規作成」ボタンをタップ
- モーダルが開いたら、タイトルと説明を入力
- 「登録」ボタンをタップして保存
- Todoアイテムの「編集」ボタンをタップ
- インライン編集モードで内容を変更
- 「保存」ボタンをタップして変更を保存
- Todoアイテムの「削除」ボタンをタップ
- 確認ダイアログで「削除」を選択
- 「カレンダー」タブに切り替え
- Todoが作成された日付がマーキングされています
- 日付をタップすると、その日のTodoのみが表示されます
- 「選択解除」ボタンでフィルターを解除
カレンダーコンポーネントを他のプロジェクトに移植する方法については、カレンダーコンポーネント移行ガイドを参照してください。
スキーマを変更した後、マイグレーションファイルを生成します:
bun run db:generateマイグレーションはアプリ起動時に自動的に実行されます(useMigrationsフックを使用)。
- ファイルサイズ: 1ファイルは500行以下に保つ(400行を超えたら分割を検討)
- 関数サイズ: 関数は30-40行以下に保つ
- クラスサイズ: クラスは200行以下に保つ
- 命名規則:
- コンポーネント: PascalCase(例:
TodoForm.tsx) - フック: camelCase +
useプレフィックス(例:useCalendarTodos.ts) - ユーティリティ: camelCase(例:
todo.ts) - Zodスキーマ: camelCase +
.schema.ts(例:todo.schema.ts)
- コンポーネント: PascalCase(例:
- 単一責任の原則: 各ファイル、クラス、関数は1つの責任のみを持つ
- モジュール設計: 再利用可能でテスト可能なコードを心がける
- 責務の分離:
app/: ルーティングとページコンポーネントcomponents/: UIコンポーネントlib/: ビジネスロジックhooks/: カスタムロジックproviders/: 状態管理
- Zodスキーマを型定義の単一の情報源として使用
z.infer<typeof schema>を使用して型を生成- 型定義は
src/types/に配置
詳細はプロジェクトルール(.cursor/rules)を参照してください。
このプロジェクトには、以下の詳細なドキュメントが含まれています:
-
Expo SQLite + Drizzle ORM セットアップ手順
- Expo SQLiteとDrizzle ORMのセットアップ方法
- マイグレーションの生成と実行方法
- データベース操作の例
-
- 汎用的なカレンダーコンポーネントの設計思想
- 他のプロジェクトへの移植手順
- カスタマイズ方法とAPIリファレンス
# 開発サーバーを起動
bun run start
# iOSシミュレーターで起動
bun run ios
# Androidエミュレーターで起動
bun run android
# Webブラウザで起動
bun run web
# データベースマイグレーションを生成
bun run db:generate
# コード品質チェック
bun run lint
# コード整形
bun run formatapp.json- Expo設定drizzle.config.ts- Drizzle ORM設定tailwind.config.js- NativeWind設定tsconfig.json- TypeScript設定
このプロジェクトへの貢献を歓迎します。以下の点にご注意ください:
- コードは日本語のコメントで記述してください
- コミットメッセージは日本語で記述してください
- プロジェクトのコーディング規約に従ってください
このプロジェクトは以下のオープンソースライブラリを使用しています:
- Expo
- React Native
- Drizzle ORM
- NativeWind
- React Hook Form
- Zod
- その他、多くの素晴らしいオープンソースプロジェクト
注意: このプロジェクトは開発中です。プロダクション環境で使用する前に、十分なテストを行ってください。