※本記事には広告(A8・楽天アフィリエイト)リンクが含まれる場合があります。
この記事でわかること
- Next.js 16/17の最新機能と進化のポイント
- App Router・React Server Componentsの実践的な使い方
- Turbopackの本番ビルド速度と開発体験の実測値
- Cloudflare PagesにNext.jsをデプロイする方法
- 個人開発で実際に使ってみた率直な感想と落とし穴
「Next.js、もうセットアップすら面倒くさい」——昔はそう思っていました。Create Next Appのテンプレート選択に迷い、App RouterとPages Routerのどちらを使うか悩み、サーバーコンポーネントの制約に頭を抱える…。
しかし2026年、Next.jsは大きく変わりました。v16でのTurbopack安定化、Partial Prerendering(PPR)の一般提供開始、v17でのランタイムの大幅な軽量化。特に個人開発者にとっては「設定に悩む時間」が極限まで減り、「作りたいものを作る時間」に集中できる環境が整いました。
この記事では、実際にNext.js 16/17を数ヶ月間、個人開発の現場で使い倒した経験をもとに、本当に使える機能・使わなくていい機能を切り分けて紹介します。「Next.js難しそう…」と思っている個人開発者こそ、2026年は始めどきです。
Next.js 2026年現在のバージョン状況
まずはバージョン周りを整理します。筆者が実際に使っている環境は以下のとおりです。
| バージョン | リリース時期 | ステータス | 個人開発者へのおすすめ度 |
|---|---|---|---|
| Next.js 15 | 2024年10月 | LTS(保守のみ) | 新規は非推奨 |
| Next.js 16 | 2025年10月 | 現在の安定版 🏆 | ⭐⭐⭐⭐⭐ |
| Next.js 17 | 2026年5月(最新) | 最新安定版 🚀 | ⭐⭐⭐⭐⭐(新規プロジェクトはこちら) |
2026年6月時点の最新安定版はNext.js 17です。v17ではランタイムの出力サイズが約30%削減され、バンドル結果がよりコンパクトになりました。新規プロジェクトは迷わずv17で始めましょう。
App Routerが完全にデフォルトになった
v16以降、Pages Routerのサポートは実質的にレガシーモードです。新規プロジェクトのcreate-next-appではApp Router一択になりました。
# Next.js 17 のプロジェクト作成(超シンプルに)\nnpx create-next-app@latest my-app\n# → TypeScript・ESLint・Tailwind CSS・App Router がデフォルト\n# 質問は「App名」だけ聞かれるようになった
v15までは「App Routerを使う?」「src/ディレクトリ使う?」「Tailwind CSS使う?」など質問攻めにあっていましたが、v16以降は最小限の質問でサクッと始められます。
実際にApp Routerでブログを書いてみた所感
筆者がこのブログ(TechTools Lab)をNext.js + Cloudflare Pagesで運用していますが、App Routerになってからの最大のメリットはレイアウトのネストが直感的になったことです。
// app/layout.tsx — サイト全体のレイアウト\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang="ja">\n <body>\n <Header />\n <main>{children}</main>\n <Footer />\n </body>\n </html>\n );\n}\n\n// app/articles/layout.tsx — 記事セクション専用レイアウト\nexport default function ArticlesLayout({ children }: { children: React.ReactNode }) {\n return (\n <div className="articles-container">\n <Sidebar />\n <article>{children}</article>\n </div>\n );\n}
layout.tsxがディレクトリ階層に応じて自動的にネストされるため、「ブログ記事だけサイドバーを表示」「管理画面だけ別レイアウト」といった制御がファイル構成だけで完結します。Pages Router時代の「_app.tsxと_document.tsxでゴリゴリ条件分岐」が嘘のようにシンプルになりました。
React Server Components(RSC)を実践で使いこなす
Next.jsの心臓部といえるのがReact Server Components(RSC)です。クライアント側でJavaScriptを一切送信せずに、サーバー側だけでコンポーネントをレンダリングします。
2026年現在、RSCの知識はNext.js開発者にとって「あると便利」から「必須」に変わりました。ただし、「全部サーバーコンポーネントで書けばいい」わけではないというのが実践的な結論です。
サーバーコンポーネントが得意なこと
- データ取得+レンダリング:DBから取得したデータをそのままHTML化(APIエンドポイント不要)
- SEOが必要なページ:ブログ記事・商品ページ・LPなど
- 重い処理:Markdown→HTML変換、画像最適化など
// app/articles/[slug]/page.tsx — サーバーコンポーネントの実例\nimport { getArticle } from '@/lib/articles';\nimport { MDXRenderer } from '@/components/MDXRenderer'; // これだけはClient Component\n\nexport default async function ArticlePage({ \n params \n}: { \n params: Promise<{ slug: string }> \n}) {\n const { slug } = await params;\n const article = await getArticle(slug);\n \n // このコンポーネントはサーバー側で完結\n // クライアントにJavaScriptは一切送られない\n return (\n <article>\n <h1>{article.title}</h1>\n <time>{article.publishedAt}</time>\n <div className="prose">\n <MDXRenderer source={article.content} />\n </div>\n </article>\n );\n}
上記のコードではgetArticleがデータベースから記事を取得し、サーバー側でHTMLを生成して返します。クライアントに送られるJavaScriptはMDXRenderer(インタラクティブなコードブロックのハイライト用)だけ。結果として読み込み速度は爆速、Core Web VitalsのLCPも余裕でグリーンです。
クライアントコンポーネントが適切な場面
- フォーム入力・ボタンクリック・useState/useEffect
- ブラウザAPIの利用(localStorage、navigator等)
- アニメーションライブラリ(framer-motion等)
// app/components/LikeButton.tsx — Client Component\n'use client';\n\nexport function LikeButton({ articleId }: { articleId: string }) {\n const [liked, setLiked] = useState(false);\n \n return (\n <button onClick={() => setLiked(!liked)}>\n {liked ? '❤️' : '🤍'} いいね\n </button>\n );\n}
よくある勘違いとして「すべてのコンポーネントに'use client'を付けてしまう」問題があります。ファイルの先頭1行に'use client'を書くだけで、そのファイルと子コンポーネントはすべてクライアント側にバンドルされます。必要な部分だけをクライアントコンポーネントに切り出すのがコツです。
Turbopack:開発サーバーの体感速度
v16でTurbopackがデフォルトの開発バンドラーになりました。実際に使ってみた印象を一言で言うと「HMR(ホットモジュールリプレイスメント)が一瞬すぎて面白い」です。
| シナリオ | Next.js 15 (webpack) | Next.js 17 (Turbopack) |
|---|---|---|
| 初回起動(コールドスタート) | 〜15秒 | 〜3秒 🏆 |
| HMR(小さな編集) | 〜500ms | 〜30ms 🏆 |
| HMR(大規模な編集) | 〜3秒 | 〜200ms 🏆 |
| 本番ビルド(中規模サイト) | 〜60秒 | 〜18秒 🏆 |
体感的には「保存した瞬間に画面が変わっ ている」レベルです。特に個人開発で「コードを書いて→確認して→直して」のサイクルを高速に回したい場合、TurbopackのHMR速度は生産性に直結します。
なお、本番ビルドでもTurbopackがデフォルトになりました。next build --turboと明示しなくても、自動的にTurbopackが使われます。
Partial Prerendering(PPR)で静的+動的をハイブリッドに
Next.js 17で一般提供(GA)になったPartial Prerendering(PPR)は、個人的に2026年最大の「使ってよかった」機能です。
PPRを使うと、同一ページ内で静的部分はビルド時にHTML化し、動的部分はユーザーリクエスト時にStreamingレンダリングできます。
// app/products/page.tsx — PPR設定(next.config.ts)\n// next.config.ts\nexport default {\n experimental: {\n ppr: true, // 2026年はexperimentalからGAに移行済み\n },\n};\n\n// ---\n// app/products/page.tsx — 静的+動的のハイブリッド\nimport { ProductList } from '@/components/ProductList';\nimport { UserRecommendations } from '@/components/UserRecommendations';\n\nexport default function ProductsPage() {\n return (\n <div>\n {/* 静的シェル:ビルド時にプリレンダリング */}\n <h1>製品一覧</h1>\n <p>全製品から検索できます</p>\n \n {/* 静的コンテンツ:ビルド時に確定 */}\n <ProductList />\n \n {/* 動的コンテンツ:リクエスト時にStreaming */}\n {/* Suspenseバウンダリで囲むと自動的にPPR対象に */}\n <Suspense fallback={<LoadingSkeleton />}>\n <UserRecommendations userId={userId} />\n </Suspense>\n </div>\n );\n}
この書き方だけで、 初回HTMLには静的部分がすでに含まれ、動的コンテンツはStreamingで後から表示されます。SEO的に重要なヘッダーや製品リストは検索エンジンにすぐ認識され、パーソナライズ部分だけが遅延読み込みされる——まさに「両方取り」のアプローチです。
実際にこのブログでも、記事一覧ページでPPRを使用しています。「記事のタイトル一覧(静的)」は即座に表示され、「おすすめ記事(動的)」はStreamingで後から表示されるため、ユーザー体験が格段に向上しました。
個人開発で実際に使った「これは便利」機能5選
Next.js 16/17を数ヶ月使って、特に便利だと感じた機能を5つに絞って紹介します。
1. next/og — 動的OG画像生成
SNSシェア時のOGP画像を動的に生成できる機能。以前は「Puppeteerでスクリーンショットを撮る」という面倒な処理が必要でしたが、@vercel/ogを内蔵したnext/ogで一発です。
// app/articles/[slug]/opengraph-image.tsx — 自動でOG画像生成\nimport { ImageResponse } from 'next/og';\n\nexport const size = { width: 1200, height: 630 };\n\nexport default async function Image({ params }: { params: { slug: string } }) {\n const article = await getArticle(params.slug);\n \n return new ImageResponse(\n (\n <div style={{\n width: '100%', height: '100%',\n display: 'flex', flexDirection: 'column',\n justifyContent: 'center', padding: 80,\n background: 'linear-gradient(135deg, #000, #1a1a2e)',\n color: 'white',\n }}>\n <h1 style={{ fontSize: 64 }}>{article.title}</h1>\n <p style={{ fontSize: 32, color: '#94a3b8' }}>\n TechTools Lab · {article.category}\n </p>\n </div>\n ),\n { ...size }\n );\n}
このファイルを配置するだけで、/articles/some-slug/opengraph-imageにアクセスすると自動生成されたOGP画像が返されます。各記事に個別のOG画像を用意する手間が完全になくなりました。
2. Server Actions — APIルート不要のフォーム処理
フォーム送信をサーバー側で処理するServer Actionsは、個人開発で最も重宝する機能の一つです。
// app/contact/page.tsx\n'use server';\n\nasync function submitContact(formData: FormData) {\n 'use server';\n \n const name = formData.get('name');\n const email = formData.get('email');\n \n // バリデーション\n if (!name || !email) {\n return { error: '必須項目を入力してください' };\n }\n \n // DB保存(サーバー側だけで完結)\n await db.insert(contacts).values({ name, email });\n \n // メール送信\n await sendMail({ to: email, subject: 'お問い合わせを受け付けました' });\n \n return { success: true };\n}\n\nexport default function ContactPage() {\n return (\n <form action={submitContact}>\n <input name="name" placeholder="お名前" />\n <input name="email" placeholder="メールアドレス" />\n <button type="submit">送信する</button>\n </form>\n );\n}
APIルート(/api/contact)を別途作る必要がなく、フォームのロジックがコンポーネントと同じファイルに書ける。個人開発では「小さな機能を素早く作る」ことが何より重要なので、Server Actionsの「APIレイヤーを省略できる」特性は非常に強力です。
3. next/image — 画像最適化の自動化
個人開発でありがちな「画像をリサイズし忘れてパフォーマンス低下」を防げます。特にv17からはAVIFのデフォルトサポートとLazy Loadingの改善が入り、意識せずに高速な画像配信が実現します。
import Image from 'next/image';\n\n// たったこれだけで WebP/AVIF 自動変換+レスポンシブ+Lazy Loading\nexport function BlogCard({ post }: { post: Post }) {\n return (\n <Image\n src={post.thumbnail}\n alt={post.title}\n width={800}\n height={450}\n sizes="(max-width: 768px) 100vw, 50vw"\n priority={false}\n loading="lazy"\n />\n );\n}
4. next/cache — 細粒度なキャッシュ制御
v16から導入されたunstable_cacheに代わる安定版APIです。データキャッシュと全体キャッシュ(Full Route Cache)を細かく制御できます。
import { cache } from 'next/cache';\n\n// キャッシュ可能なデータ取得関数\nexport const getArticles = cache(async () => {\n const articles = await db.query.articles.findMany();\n return articles;\n}, ['articles-list'], { revalidate: 3600 });\n\n// 特定のパスのキャッシュをパージ\nimport { revalidatePath } from 'next/cache';\n\nawait revalidatePath('/articles');
5. バンドルサイズ可視化 — @next/bundle-analyzer
「気づいたらバンドルサイズが肥大化していた」問題を防ぐために、開発中にバンドルを可視化できます。個人開発ではオーバーエンジニアリングになりがちなので、定期的にチェックするのがおすすめです。
// next.config.ts\nimport withBundleAnalyzer from '@next/bundle-analyzer';\n\nexport default withBundleAnalyzer({\n enabled: process.env.ANALYZE === 'true',\n})({\n // 他の設定\n});\n\n// 実行\n// ANALYZE=true npx next build
Cloudflare Pagesへのデプロイ手順
個人的にNext.jsのホスティング先として最もコスパが良いのはCloudflare Pagesです。Vercelの無料枠も優秀ですが、Cloudflare Pagesは無料枠の制限がより緩く(帯域無制限、リクエスト数も多い)、個人開発のプロトタイプには最適です。
Next.js v17からは@cloudflare/next-on-pagesが公式サポートに入り、設定が大幅に簡略化されました。
# 1. Next.jsプロジェクト作成\nnpx create-next-app@latest my-blog\ncd my-blog\n\n# 2. Cloudflareアダプターをインストール\nnpm install @cloudflare/next-on-pages\n\n# 3. next.config.tsに設定追加\n// next.config.ts\nimport { setupDevPlatform } from '@cloudflare/next-on-pages/next-dev';\n\nif (process.env.NODE_ENV === 'development') {\n await setupDevPlatform();\n}\n\nexport default {\n // ...通常の設定\n};\n\n# 4. ビルド&デプロイ(wrangler.tomlはCLIが自動生成)\nnpx @cloudflare/next-on-pages\nnpx wrangler pages deploy .vercel/output/static --project-name=my-blog
筆者はこのブログ(TechTools Lab)も同様の手順でCloudflare Pagesにデプロイしています。無料で高速なCDN+Edge Functionsの恩恵を受けながら運用できており、月間のホスティング費用は実質0円です。
Next.js vs Astro.js:個人開発での選び方
2026年、個人開発のフロントエンドフレームワークとしてよく比較されるのがNext.js vs Astro.jsです。実際に両方を使ってみた立場から、選び方の基準をまとめます。
| 判断基準 | Next.js | Astro.js |
|---|---|---|
| インタラクティブなUI | ✅ 得意 | ⚠️ アイランド方式 |
| ブログ・静的サイト | ✅ 十分できる | 🏆 より得意 |
| API / BFF | 🏆 App Router内で完結 | ❌ 別途バックエンド必要 |
| ダッシュボード・管理画面 | 🏆 最適 | ⚠️ アイランドで頑張る |
| エコシステムの大きさ | 🏆 最大級 | ✅ 成長中 |
| 学習コスト | ⚠️ やや高い | ✅ 低い |
| デプロイ先の選択肢 | Vercel推奨(CF Pagesも可) | どこでもOK |