Open13

React Router Cloudflare Boilerplate | 構築メモ

atmanatman

プロジェクト作成

プロジェクト名はreact-router-cloudflare-boilerplateに設定した。

npx create-react-router@latest react-router-cloudflare-boilerplate --template remix-run/react-router-templates/cloudflare-d1
atmanatman

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に設定する。

wrangler.jsonc
  ...
  "d1_databases": [
    {
      "binding": "DB",
+     "database_name": "d1-app-test-db",
+     "database_id": "***************",
      "migrations_dir": "drizzle"
    }
  ]
}

.env作成

.env
CLOUDFLARE_D1_ID="******"
CLOUDFLARE_ACCOUNT_ID="******"
CLOUDFLARE_TOKEN="******"

.gitignore.envを追加しておく。

  • CLOUDFLARE_D1_ID:
    • 上記で作成したD1のDBのid(database_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 をクリックして、以下の画像を参考にトークン作成
      image

drizzle.config.ts修正

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;
atmanatman

DBマイグレーション&本番デプロイ

DBマイグレーション

本番DB

npm run db:migrate-production

本番デプロイ

npm run deploy

デプロイ先のURLにアクセスしてデータ登録
image

  • Cloudflareダッシュボード > Storage & Databases > D1 SQL Database
  • DB Name(d1-app-test-db) をクリック > 右上の Explore Data をクリック
  • SQL実行

image

atmanatman

開発環境の起動

DBマイグレーション

開発DB

npm run db:migrate

ローカルDBの生成先: .wrangler/state/v3/d1/…/*.sqlite
image

dev起動

npm run dev
atmanatman

Biome

インストール

npm install --save-dev --save-exact @biomejs/biome

設定ファイル作成

npx @biomejs/biome init

一部の設定を変更しておく。

biome.json
{
  "$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"
      }
    }
  }
}
atmanatman

Vitest

インストール

npm i -D vitest

vitestのglobal設定(テストファイルのimport省略)

vite.config.tsを変更する。

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を変更する。

tsconfig.cloudflare.json
{
  ...
  "compilerOptions": {
    "composite": true,
    "strict": true,
    "lib": [
      "DOM",
      "DOM.Iterable",
      "ES2022"
    ],
    "types": [
      "node",
      "vite/client",
+     "vitest/globals"
    ],
}

テスト初期化のファイル準備

test/setup.tsを作成しておく。中身は空にしておいて、必要に応じて追記する。

atmanatman

ファイルベースルーティング(flatRoutes)

インストール

npm i @react-router/fs-routes

app/routes.tsにファイルベースルーティングの設定を追加

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;
atmanatman

shadcn/ui

tsconfig.jsonpathsのエイリアスを追加

tsconfig.json
{
  ...
  "compilerOptions": {
    "checkJs": true,
    "verbatimModuleSyntax": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
+   "paths": {
+     "~/database/*": [
+       "./database/*"
+     ],
+     "~/*": [
+       "./app/*"
+     ]
+   }
  }
}

shadcn/ui初期化

npx shadcn@latest init
atmanatman

Husky

インストール

npm i -D husky

初期化

npx husky init

pre-commitに実行したい処理を追加

.husky/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 のステージ(インデックス)に再反映する
    • これにより自動修正後の内容でコミットできるようにする
atmanatman

TaskMaster AI

https://www.task-master.dev/

グローバルインストール

npm install -g task-master-ai

公式ドキュメント通りに下記を実施する。
e.g. Cline 利用の場合(公式はCursor推奨)

cline_mcp_settings.jsonに taskmaster-ai のMCPサーバーを追加

cline_mcp_settings.json
{
  "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作成、タスク作成を進める。詳細は公式ドキュメントを参照すること。

atmanatman

GitHub

各種テンプレートとGitHub Flowを追加

  • ISSUE_TEMPLATEを追加
  • PULL_REQUEST_TEMPLATE.mdを追加
  • workflows/or-pr.ymlを追加
atmanatman

デプロイ後

HTTP→HTTPSへのリダイレクト設定

方法:Cloudflareダッシュボードで「Always Use HTTPS」を有効にする

  1. Cloudflareにログインし、対象ドメインを選択。
  2. 左メニューの「SSL/TLS」 → 「Edge Certificates」を開く。
  3. 「Always Use HTTPS(常にHTTPSを使用)」を オン にする。