Hono + Inertia + React 環境構築完全手順
Bun / Vite / TypeScript で30分で動かす最小スタートアップ【2026年版】
Hono + Inertia + React の最小環境を Bun + Vite + TypeScript で30分以内に立ち上げる完全手順。プロジェクト構成、Hono サーバ+Inertia アダプタ、React + Vite クライアント、ホットリロード、初回ページ表示までを実コマンドでガイドします。
ゴール — 30分で何ができている状態か
本記事のゴールは、以下を達成した状態です:
- Bun ランタイム上で Hono サーバが動く
- Inertia アダプタ経由で React コンポーネントが描画される
- Vite で TypeScript + React のホットリロードが効く
- ブラウザで初回ページに「Hello, Inertia」が表示される
ここから先(CRUD、認証、デプロイ)は本シリーズの別コラムで扱います。
前提・必要なもの
- Node.js 20+ もしくは Bun 1.0+(本記事は Bun を採用)
- パッケージマネージャ: Bun(bun コマンド)
- エディタ: VS Code + TypeScript / ESLint / Tailwind 拡張を推奨
- 動作確認用のブラウザ
Bun は curl -fsSL https://bun.sh/install | bash で入ります。
ディレクトリ構成
シンプルなモノリポ風の構成が扱いやすいです。
my-app/
├─ server/ ← Hono アプリ
│ ├─ index.ts ← エントリポイント
│ ├─ routes/ ← ルート定義
│ └─ inertia.ts ← Inertia アダプタ初期化
├─ client/ ← React アプリ
│ ├─ main.tsx ← createInertiaApp
│ └─ pages/ ← Inertia がページとして解決する React コンポーネント
├─ vite.config.ts
├─ tsconfig.json
└─ package.json大規模化したら Turborepo / pnpm workspaces で apps/server と apps/web に分けるのが定石です。
Step 1: プロジェクト初期化
ターミナルで:
mkdir my-app && cd my-app
bun init -y
bun add hono @hono/vite-build @hono/vite-dev-server
bun add @inertiajs/react @inertiajs/server
bun add react react-dom
bun add -d typescript @types/react @types/react-dom @vitejs/plugin-react viteこれで Hono / Inertia / React と開発ツール一式が揃います。
Step 2: Vite 設定
vite.config.ts で React プラグインを有効にし、開発時は Hono dev server を使います。詳細な書き方は Hono 公式の Vite 連携ドキュメント と Inertia.js 公式の React アダプタ を参考に、自プロジェクトの構成に合わせて設定してください。Tailwind CSS を併用する場合は @tailwindcss/vite プラグインを足すのが2026年の標準です。
Step 3: Hono サーバ + Inertia アダプタ
server/index.ts の役割は次の通りです。
1. Hono インスタンスを作る
2. Inertia アダプタをミドルウェアとして登録(共有プロパティ・ルートヘルパーを束ねる)
3. ルート(例: / → ページ Home を Inertia レスポンスとして返す)を定義
4. 起動(Bun なら Bun.serve、Node なら @hono/node-server、Workers なら export default app)
Inertia レスポンスは c.inertia('Home', { title: 'Hello' }) のような形でページ名 + 共有プロパティを返すのがイメージしやすい書き方です。実際の関数名やAPIは利用するアダプタライブラリのバージョンを公式ドキュメントで確認してください。
Step 4: React 側 — createInertiaApp
client/main.tsx で Inertia の createInertiaApp を呼び出します。
- resolve: ページ名を pages/{name}.tsx に解決する関数
- setup: ReactDOM.createRoot でマウントする関数
- progress: ナビゲーション進捗バーの設定client/pages/Home.tsx には素直な React コンポーネントを置き、usePage() フックで Hono 側から渡された props を受け取ります。最初の1ページでは <h1>{props.title}</h1> を返すだけで充分です。
Step 5: 動作確認
bun run dev でサーバを起動し、ブラウザで http://localhost:3000 を開きます。
- 初回 GET ではサーバが完全な HTML を返す(Inertia の SSR or CSR 構成による)
- 以降のリンク遷移は XHR + JSON ベースに切り替わり、SPA ライクに動く
- React コンポーネントを編集すると Vite のHMRで即時反映
ここまで動けば、シリーズ第3回以降で扱う CRUD / 認証 / デプロイの土台が整っています。
詰まりがちなポイント
- pages/ 解決のミスマッチ: resolve の glob と実ファイル配置が一致していないと Page not found になる
- 共有プロパティの過大化: Inertia の共有プロパティは全ページに渡されるため、重いデータを共有 props に積むと初期表示が遅くなる。本当に共有すべきもの(ユーザー情報、フラッシュメッセージ等)に限定する
- CSRF / セッションCookie: Inertia のリクエストにはCSRFトークンを通す必要があるため、ミドルウェアで設定しておく
- TypeScript の型を厳格に: usePage<{ title: string }>() のように page props を型付けしておくと、後の章で詰まらない
次回 — フォームとCRUD
次回は フォーム&CRUD 実装パターン で、Drizzle ORM・Zod バリデーション・Inertia の useForm を組み合わせた実装パターンを扱います。本シリーズの全体像は Part 1: スタック概要 を参照ください。
FAQ
Q1: Bun ではなく Node を使いたい場合は?
A: @hono/node-server をインストールして起動方法を serve(app) に置き換えるだけです。コード本体は同じです。
Q2: Cloudflare Workers でローカル開発するには?
A: wrangler dev を使います。Hono は Workers ネイティブに動くため特別な設定は不要です。
Q3: Vite を使わない構成はありえますか?
A: 可能ですが、React + TypeScript のHMR体験で Vite を超える選択肢は今のところほぼありません。Vite を使うのが現代的です。
Q4: モノレポ化はいつすべき?
A: サーバ・クライアントで共通の型・バリデーション・ユーティリティが3つ以上出てきたタイミングが目安です。
参考文献
お気軽にご相談ください
お問い合わせ