個人開発者よ、Honoを使え

複雑さを前払いしないWebアプリ設計

それ、最初からReactが必要ですか?

今日話すこと

  1. 個人開発が重くなりがちな理由
  2. 小説投稿サイトで感じた違和感
  3. Honoで小さく始める設計
  4. React / Next.jsを呼ぶ判断基準

01. 個人開発、重くなりがち

作りたいものは小さいのに

作りたいもの

  • 作品を投稿したい
  • 記事を読ませたい
  • フォームを受けたい
  • メッセージを送受信したい

なぜか考え始めるもの

  • Client State
  • fetch / cache / hydration
  • API分離
  • Server / Client境界

個人開発の敵は
技術的負債だけではなく
完成前に燃え尽きること

今日の主張

Honoで始める
→
必要なJSを足す
→
理由ができたらReact
Reactを使わないのではなく、使う理由が生まれるまで使わない

02. 小説投稿サイトで感じたこと

題材: 個人開発の小説投稿サイト

一覧
詳細
投稿
編集
コメント
管理画面
主役は「クライアント状態」より、サーバーにある作品データでした

Next.jsで自然に伸びた経路

Browser
↓
JavaScript起動
↓
fetch
↓
API
↓
DB
↓
JSON
↓
state更新
↓
render

Hono SSRで短くできた経路

Browser
→
Hono
→
DB
→
HTML
読む・投稿する・編集するだけなら、この経路で十分なことが多い

投稿処理はこれで成立します

HTML Form
↓
POST
↓
DB更新
↓
Redirect
↓
GET
フォーム状態管理やJSON APIを、最初から全画面に持ち込まなくてもいいです

03. 例で考える技術選定

ポートフォリオで考える

作りたい体験 選択
アニメーションごりごり React、わかる
アニメーションごりごりなだけ Next.js、本当に要る?
少し動く Hono + 必要なJSでもよさそう
ほぼ動かない Honoでよくない?

チャットで考える

ただのチャット

  • WebSocketをつなぐ
  • sendする
  • messageでDOMに足す

Slackっぽいチャット

  • スレッド
  • 未読管理
  • リッチエディタ
  • 複数ペイン

ブログ・投稿サービスで考える

一覧
→
詳細
→
投稿
→
編集
CRUD中心なら、サーバー状態をHTMLにするだけで強い

管理画面で考える

UI Hono SSR React
テーブル / 検索 / フォーム 合いやすい もちろん可能
CSV出力 / 権限 / 承認 合いやすい もちろん可能
DnD / 複雑なグラフ操作 つらくなる 合いやすい
画面全体の状態同期 つらくなる 合いやすい

04. Honoで始める設計

Server First / JavaScript on Demand

Level 1

Hono + SSR + HTML Form

Level 2

必要なところだけVanilla JS

Level 3

複雑な島だけReact

Level 4

必要ならAPI化・分離

Routeに全部書かない

Route
→
Service
→
Repository / DB
HTMLを返すRouteとJSONを返すRouteで、同じServiceを使えるようにします

HTMLから始めて、必要ならAPIへ

app.get('/novels/:id', async (c) => {
  const novel = await novelService.find(c.req.param('id'))
  return c.html(<NovelPage novel={novel} />)
})

app.get('/api/novels/:id', async (c) => {
  const novel = await novelService.find(c.req.param('id'))
  return c.json(novel)
})

判断表

まずHonoでよさそう Reactが欲しい Next.jsが欲しい
静的ページ 複雑なClient State React前提の大きめアプリ
フォーム中心 リッチな操作UI SSG / ISR
CRUD中心 DnD / リッチエディタ App Router / RSC
管理画面 リアルタイム同期UI 画像最適化

Honoで始めることは
将来のReactを捨てることではない

持ち帰ってほしいこと

小さく始める

まずHono + HTMLで画面を返します

必要分だけ足す

JavaScriptは体験が必要とする場所へ置きます

理由で選ぶ

React / Next.jsは必要になった時に呼びます

個人開発者よ、Honoを使え

複雑さは、必要になってから導入しましょう!