Hono + Cloudflare Pages で挑む最速ポートフォリオ構築:なぜNext.jsではないのか

|
Hono Cloudflare Pages TypeScript Next.js Edge ポートフォリオ

ポートフォリオにNext.jsではなくHono + Cloudflare Pagesを選んだ理由。バンドルサイズ・コールドスタート・デプロイ単純性の観点から技術選定の根拠を解説する。

はじめに:「ポートフォリオを作るなら Next.js」という空気

エンジニアのポートフォリオサイトといえば「Next.js + Vercel」が定番だ。
Reactの学習コストを払ってまで、この構成がポートフォリオに必要かを、私は疑った。

クラウドインフラエンジニアである私がポートフォリオサイトに求めたのは、速さ・軽さ・シンプルな運用だ。記事を増やすたびにビルドを待ち、Reactコンポーネントの設計に頭を使う必要はない。

その問いに答えてくれたのが Hono + Cloudflare Pages だった。


Section 1: 技術比較 ── Next.js vs Hono の実態

バンドルサイズの差

項目 Next.js (App Router) Hono (このサイト)
初期JSペイロード ~400KB〜1MB+ 0KB(クライアントJS不要)
Worker bundle全体 N/A 262KB(全ページ含む)
Reactランタイム 必須 不要

Next.jsはReact runtime・ルーターのチャンク・ハイドレーション用コードが必ず乗る。静的コンテンツを表示するだけでも「Reactが動く」ためのオーバーヘッドが発生する。

HonoはサーバーサイドでそのままHTMLを生成して返す。クライアント側にJSランタイムは不要で、CDNのエッジノードで直接処理される。

コールドスタートの問題

Vercel Functions(Node.js runtime)はコールドスタートが存在し、初回リクエストで数百ms〜1秒超の遅延が発生することがある。
Cloudflare WorkersはコールドスタートがV8 Isolateアーキテクチャによりほぼゼロだ。全世界300+のPoP(接続点)でエッジ実行される。

# Cloudflare Workers の起動モデル
V8 Isolate(同プロセス内の独立した実行コンテキスト)
→ JIT済みコードを再利用
→ コールドスタートなし
→ リクエストレイテンシ = ネットワーク往復のみ

ポイント: Node.js/Deno/Bun はOSプロセスを起動するモデル。WorkersはV8 Isolateをプール管理しており、起動コストが桁違いに小さい。これがポートフォリオのような「たまにアクセスされるサイト」で特に有効に働く。


Section 2: Hono の設計哲学とポートフォリオへの適合性

Hono とは何か

Hono(炎)は、Cloudflare Workers・Deno・Bun・Node.jsなど複数のランタイムで動作する超軽量 Web フレームワークだ。

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => {
  return c.html(`<h1>Hello from the Edge</h1>`)
})

export default app

Expressに似たルーティングAPIを持ちながら、依存関係がほぼゼロ。ビルド結果もWorkers環境に最適化されたシングルファイルになる。

テンプレートエンジンとしての活用

このポートフォリオでは、HonoのJSXサポートを使ってHTMLをTypeScript関数として記述している。ReactのVirtual DOMとは異なり、サーバーサイドで直接HTML文字列に変換されるため、クライアントJS一切なしでリッチなマークアップが書ける。

// src/routes/about.ts
import { Layout } from '../components/layout'

export const AboutPage = () => {
  return Layout({
    title: 'About | Tono',
    children: `
      <h1>About Me</h1>
      <p>クラウドエンジニアのプロフィール</p>
    `
  })
}

型補完が効き、テンプレートリテラルでHTMLを書くシンプルさがある。Reactのstate管理・effect・hooksの複雑さは一切不要だ。


Section 3: Cloudflare Pages のデプロイ体験

デプロイフロー

git push → Vite build → wrangler deploy → 世界300+ PoP へ反映
# ビルド結果
vite v6.4.1 building SSR bundle for production...
✓ 42 modules transformed.
dist/_worker.js  262.71 kB   ← 全ページ含めてこのサイズ
✓ built in 722ms

プッシュからグローバル反映まで約30秒。Vercelも高速だが、Cloudflare PagesはWorkersの実行モデルそのものが異なるため、レスポンスの均一性が高い。

コスト構造

項目 Cloudflare Pages (Free) Vercel (Hobby)
帯域 無制限 100GB/月
ビルド回数 500回/月 100回/月
Functions 100,000req/日 100GB-hrs
カスタムドメイン 無制限 1件
価格 $0 $0(制限あり)

ポートフォリオ用途ではCloudflare Pagesの無料枠が明らかに余裕がある。


Section 4: Next.js が適切な場面とそうでない場面

Next.jsを否定するつもりはない。適材適所だ。

ユースケース Hono + CF Pages Next.js + Vercel
ポートフォリオ・ブログ 最適 過剰
静的マーケティングサイト 最適
React Componentが必要なUI
ISR / Server Components
大規模SaaS 要検討

今回のポートフォリオにはインタラクティブなReact Componentが不要だった。必要なのは「情報を速く・正確に届けること」だけ。その要件に対して、Next.jsはオーバースペックだと判断した。


Conclusion: 「最速の配信」はツールではなく設計から来る

フレームワークは目的ではなく手段。要件から逆算した選択が、最終的なパフォーマンスを決める。

Hono + Cloudflare Pagesという選択は、「Next.jsが嫌いだから」ではない。ポートフォリオに求める要件(速度・軽量・シンプルな運用)を満たす最小のスタックがこれだったという結論だ。

クラウドインフラの仕事でも同じ思考が使える。「とりあえずEC2」ではなく、トラフィック特性・コスト・運用負荷を比較してLambdaにする・S3+CloudFrontにする——という判断が価値を生む。技術選定は常に、要件の分析から始まる。

この記事をシェア

Twitter / X LinkedIn
記事一覧に戻る
🤖
Cloud Assistant
IBM Watson powered

こんにちは!クラウドエンジニアのポートフォリオサイトへようこそ。AWS構成・副業サービス・お仕事のご相談など、何でも聞いてください 👋