React Router Cloudflare Boilerplate | 構築メモ
プロジェクト作成
プロジェクト名はreact-router-cloudflare-boilerplate
に設定した。
npx create-react-router@latest react-router-cloudflare-boilerplate --template remix-run/react-router-templates/cloudflare-d1
Cloudflare D1作成およびセットアップ
D1作成
以下のコマンドを実行してD1を作成する。
npx wrangler d1 create d1-app-test-db
✅ Successfully created DB 'd1-app-test-db' in region APAC
Created your new D1 database.
{
"d1_databases": [
{
"binding": "DB",
"database_name": "d1-app-test-db",
"database_id": "***************"
}
]
}
D1作成ときに表示されたbinding情報を、wrangler.jsonc
に設定する。
...
"d1_databases": [
{
"binding": "DB",
+ "database_name": "d1-app-test-db",
+ "database_id": "***************",
"migrations_dir": "drizzle"
}
]
}
.env作成
CLOUDFLARE_D1_ID="******"
CLOUDFLARE_ACCOUNT_ID="******"
CLOUDFLARE_TOKEN="******"
.gitignore
に.env
を追加しておく。
- CLOUDFLARE_D1_ID:
- 上記で作成したD1のDBのid(
database_id
)
- 上記で作成したD1のDBのid(
- CLOUDFLARE_ACCOUNT_ID:
- Cloudflareダッシュボード > Compute(Workers) > Workers & Pages
- 右下に記載されている Account ID
- CLOUDFLARE_TOKEN:
- Cloudflareダッシュボード > Manage Account > Account API Tokens > Create Token
- Create Custom Token > Get started をクリックして、以下の画像を参考にトークン作成
drizzle.config.ts修正
import type { Config } from "drizzle-kit";
export default {
out: "./drizzle",
schema: "./database/schema.ts",
dialect: "sqlite",
driver: "d1-http",
dbCredentials: {
+ databaseId: process.env.CLOUDFLARE_D1_ID!,
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
token: process.env.CLOUDFLARE_TOKEN!,
},
} satisfies Config;
DBマイグレーション&本番デプロイ
DBマイグレーション
本番DB
npm run db:migrate-production
本番デプロイ
npm run deploy
デプロイ先のURLにアクセスしてデータ登録
- Cloudflareダッシュボード > Storage & Databases > D1 SQL Database
- DB Name(
d1-app-test-db
) をクリック > 右上の Explore Data をクリック - SQL実行
開発環境の起動
DBマイグレーション
開発DB
npm run db:migrate
ローカルDBの生成先: .wrangler/state/v3/d1/…/*.sqlite
dev起動
npm run dev
Biome
インストール
npm install --save-dev --save-exact @biomejs/biome
設定ファイル作成
npx @biomejs/biome init
一部の設定を変更しておく。
{
"$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"includes": [
"app/**/*.ts",
"!worker-configuration.d.ts",
"!.react-router/**/*"
],
"ignoreUnknown": false
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"javascript": {
"formatter": {
"quoteStyle": "double"
}
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
Vitest
インストール
npm i -D vitest
vitestのglobal設定(テストファイルのimport省略)
vite.config.ts
を変更する。
import { cloudflare } from "@cloudflare/vite-plugin";
import { reactRouter } from "@react-router/dev/vite";
import tailwindcss from "@tailwindcss/vite";
import tsconfigPaths from "vite-tsconfig-paths";
import { defineConfig } from "vitest/config";
export default defineConfig(({ mode }) => ({
plugins: [
cloudflare({ viteEnvironment: { name: 'ssr' } }),
tailwindcss(),
...(mode === 'test' ? [] : [reactRouter()]),
tsconfigPaths(),
],
test: {
globals: true,
setupFiles: ['./test/setup.ts'],
},
}));
tsconfig.cloudflare.json
を変更する。
{
...
"compilerOptions": {
"composite": true,
"strict": true,
"lib": [
"DOM",
"DOM.Iterable",
"ES2022"
],
"types": [
"node",
"vite/client",
+ "vitest/globals"
],
}
テスト初期化のファイル準備
test/setup.ts
を作成しておく。中身は空にしておいて、必要に応じて追記する。
ファイルベースルーティング(flatRoutes)
インストール
npm i @react-router/fs-routes
app/routes.ts
にファイルベースルーティングの設定を追加
import type { RouteConfig } from "@react-router/dev/routes";
import { flatRoutes } from "@react-router/fs-routes";
const routes: RouteConfig = flatRoutes();
export default routes;
shadcn/ui
tsconfig.json
にpaths
のエイリアスを追加
{
...
"compilerOptions": {
"checkJs": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
+ "paths": {
+ "~/database/*": [
+ "./database/*"
+ ],
+ "~/*": [
+ "./app/*"
+ ]
+ }
}
}
shadcn/ui初期化
npx shadcn@latest init
Husky
インストール
npm i -D husky
初期化
npx husky init
pre-commit
に実行したい処理を追加
npx biome check --staged --fix --no-errors-on-unmatched
git update-index --again
-
npx biome check --staged --fix --no-errors-on-unmatched
- ステージされているファイルだけを対象にコードのチェックと自動修正を行う
- 対象ファイルがない場合でもエラーを出さずに処理を終了する
-
git update-index --again
- 修正されたファイルの最新状態を Git のステージ(インデックス)に再反映する
- これにより自動修正後の内容でコミットできるようにする
TaskMaster AI
グローバルインストール
npm install -g task-master-ai
公式ドキュメント通りに下記を実施する。
e.g. Cline 利用の場合(公式はCursor推奨)
cline_mcp_settings.json
に taskmaster-ai のMCPサーバーを追加
{
"mcpServers": {
"taskmaster-ai": {
"command": "npx",
"args": [
"-y",
"--package=task-master-ai",
"task-master-ai"
],
"env": {
"ANTHROPIC_API_KEY": "YOUR_ANTHROPIC_API_KEY_HERE",
"PERPLEXITY_API_KEY": "YOUR_PERPLEXITY_API_KEY_HERE",
"OPENAI_API_KEY": "YOUR_OPENAI_KEY_HERE",
"GOOGLE_API_KEY": "YOUR_GOOGLE_KEY_HERE",
"MISTRAL_API_KEY": "YOUR_MISTRAL_KEY_HERE",
"OPENROUTER_API_KEY": "YOUR_OPENROUTER_KEY_HERE",
"XAI_API_KEY": "YOUR_XAI_KEY_HERE",
"AZURE_OPENAI_API_KEY": "YOUR_AZURE_KEY_HERE"
},
"type": "stdio"
}
}
}
利用するモデルのAPIキーを設定しておく。
Clineに下記メッセージを送り、taskmaster を初期化する。
Can you please initialize taskmaster-ai into my project?
後はPRD作成、タスク作成を進める。詳細は公式ドキュメントを参照すること。
GitHub
各種テンプレートとGitHub Flowを追加
-
ISSUE_TEMPLATE
を追加 -
PULL_REQUEST_TEMPLATE.md
を追加 -
workflows/or-pr.yml
を追加
デプロイ後
HTTP→HTTPSへのリダイレクト設定
方法:Cloudflareダッシュボードで「Always Use HTTPS」を有効にする
- Cloudflareにログインし、対象ドメインを選択。
- 左メニューの「SSL/TLS」 → 「Edge Certificates」を開く。
- 「Always Use HTTPS(常にHTTPSを使用)」を オン にする。