本文へ移動
技術を、自社の仕事に。
判断と実行を助けるメディア

記事を検索

vinext 1.0でNext.jsをVercel外へ移す前の判断

目次 · 6項目

制作会社に作ってもらったNext.jsのコーポレートサイトやWebアプリがVercelで動いている。ほかのサイトやDNSはCloudflareにまとめているので、ホスティングもそちらへ寄せられないか。そう考えたときの候補に、Cloudflareが開発する「vinext」が加わりました。npmの記録では、1.0.0が2026年9月28日、1.0.1が10月1日に公開されています。

一方で、vinextのREADMEは冒頭で「まだすべてのアプリケーションや本番ワークロードの置き換えにはならない」と書き、より成熟した選択肢としてOpenNextを挙げています。1.0という番号だけで乗り換えを決めず、READMEと変更履歴、Next.js 16の検証用アプリで動かした結果から、判断の材料を整理します。

vinextは「Next.jsのAPIをViteで作り直したもの」

READMEによると、vinextは next build の出力を使わず、Next.jsのAPI(ルーティング、サーバーレンダリング、next/* のモジュールなど)をビルドツールのVite上で実装し直したものです。App RouterとPages Router、React Server Components、Server Actions、ミドルウェア、ルートハンドラー、ISR、静的書き出しに対応するとしています。対象はNext.js 16.xで、古い版で非推奨になったAPIは扱いません。

主な配置先はCloudflare Workersで、それ以外(Vercel、Netlify、AWS Amplify、Deno Deploy、Node.jsサーバーなど)にはNitroというViteプラグインを足して配置します。Next.jsのフォークではありません。

npmの公開記録では、2026年7月4日のbeta.0から14のベータ版を経て1.0.0になりました。1.0.0の変更履歴には、Next.jsが静的と扱うページだけをキャッシュする、vinext check が無視・反映する next.config の項目を報告する、Cloudflare向けの初期設定を新しいCLI「cf」に切り替える、といった変更が並びます。

READMEが挙げる「まだ足りない部分」

READMEの「Known gaps」には、取り組み中の項目として次が書かれています。

  • Cache ComponentsとPartial Prerendering:"use cache" は部分的な実装で、cacheComponents の挙動はNext.jsと一致しない場合がある
  • ビルド時の画像・フォント最適化:Cloudflareではリクエスト時に画像を最適化できるが、Next.jsのビルド時の画像処理は再現していない
  • App Routerの開発時のネイティブモジュール:sharp・resvg・satori などが開発サーバーで失敗することがある
  • 配置先に関わる設定:preferredRegion は無視され、runtime は実行場所を選ばない

これとは別に、Vercel固有の機能(edge runtimeの @vercel/og、Vercel Analytics、Vercel KV/Blob/Postgres)は今後も対応しないと明記されています。本番利用については「Can I use this in production?」に「You can, with caution.」(使えるが慎重に)と答えています。

Vercel外へ出す4つの道

選択肢の説明は、vinextのREADMEの記述によります。OpenNextとNext.jsの公式ドキュメントは本記事では開いていないため、それぞれの詳細は各公式資料で確かめてください。

選択肢仕組みvinextのREADMEでの位置づけ
Vercelを続ける現状のまま記述なし(本記事では比較の基準として置く)
Next.jsのセルフホストNode.jsサーバー、Docker、静的書き出し「Next.jsのまま別の場所で動かしたいなら最も簡単」
OpenNextnext build の出力を各基盤向けに変換「より成熟し、より多くのAPIを扱う」「安全で実績のある選択肢」
vinextNext.jsのAPIをVite上で再実装ビルドが速く成果物が小さい一方、Next.jsの機能の端までは扱わない

編集部の整理では、vinextを選ぶ意味があるのは、Viteのツール群へ寄せたい、Cloudflare Workersのバインディングを直接使いたいなど、ツールチェーンそのものを変える理由がある場合です。Viteを土台にした開発環境の動きはVite+の記事でも整理しました。

Next.js 16の検証用アプリで動かした

2026年10月2日、編集部の検証環境(Linux、Node v22.22.0、npm 10.9.4)で、create-next-app が作るApp Routerのひな形(Next.js 16.3.8、next/image と next/font/google を使用)に、JSONを返すルートハンドラーを1つ足して試しました。vinextは1.0.1です。

checkは何も書き換えない

npx vinext@1.0.1 check は約13秒で終わり、ファイルの変更はありませんでした(gitの差分なし)。結果は「100% compatible (6 supported, 0 partial, 0 issues)」です。

そこで、READMEが足りない部分に挙げる2つを足して再実行しました。next.config.ts に cacheComponents: true、新しいページに preferredRegion = "hnd1" と "use cache" です。結果は「94% compatible」に下がり、cacheComponents — experimental support; behavior is incomplete が表示されました。一方、preferredRegion については何も表示されませんでした。checkの合格は、READMEのKnown gapsを読む代わりにはなりません。

initはReactの版で止まった

続く vinext init --platform=node は、依存関係の追加で止まりました。npmのエラーは ERESOLVE could not resolve で、追加しようとした react-server-dom-webpack@19.3.0 がReact 19.3.0以上を求める一方、ひな形のReactは19.2.8でした。止まった時点で、package.json へのスクリプトと "type": "module" の追加、vite.config.ts の作成、.gitignore の追記はすでに済んでいました。途中で止まっても変更は残るため、gitのブランチ上で試します。

ReactとReact DOMを19.3.0へ上げてやり直すと、initは完了しました。

vinext init(Node向け)を実行したあとのgit差分。package.jsonへのスクリプト3つとtype: moduleと依存の追加、vite.config.tsの新規作成、.gitignoreの追記があり、next.config.ts・tsconfig.json・app配下には変更がなかったことと、ビルドと起動の確認結果を示した図

READMEの説明どおり、next.config.ts・tsconfig.json・app/ 配下は変わらず、npm run dev などの既存のNext.jsのスクリプトもそのまま残りました。追加されたのは dev:vinext・build:vinext・start:vinext の3つです。CSS Modulesを検出して vite-css-modules も入りました。

ビルドと起動

npm run build:vinext(Vite 8.3.2)は完了し、npm run start:vinext で起動したサーバーは、ページとルートハンドラーにどちらもHTTP 200を返しました。ただし、ビルドの最後のルート一覧では / が「? Unknown」と表示され、「headers()やcookies()などの動的APIの使用はビルド時に検出できない」という注記が出ました。同じアプリを next build すると / は「○ (Static)」です。READMEのベンチマークの節も、Next.jsはビルド時にページを静的に作り、vinextは既定でリクエストごとにサーバーで描画すると説明しています。

Cloudflare向けはキャッシュの方式を先に決める

--platform=cloudflare を付けたinitは、キャッシュと画像最適化の選択を求めて止まりました。CDNキャッシュ(response-store、workers-cache、static-assets、data-cache)、データキャッシュ(kvかなし)、画像最適化(cloudflare-imagesかなし)を指定してから再実行するよう表示されます。static-assets・データキャッシュなし・画像最適化なしで再実行すると、cloudflare.config.ts が作られ、/ はビルド時に事前描画されて「○ Static」になりました。ローカルのプレビューでもページとルートハンドラーは200を返しました。

追加された依存には、cf@1.0.0-beta.10 と @cloudflare/vite-plugin の2.0.0のベータ版が含まれていました。vinext本体は1.0でも、Cloudflareへの配置に使う道具はベータ段階です。cfの扱いはCloudflareのcfベータとWranglerの記事にまとめています。Cloudflareへの実際のデプロイは試していません。

乗り換えを決める前に確かめること(編集部の提案)

  1. Next.jsの版:vinextの対象は16.xです。15以前のサイトは、まずNext.js側の更新が必要かを確かめます
  2. 使っている機能とKnown gapsの照合:"use cache"、next/image のビルド時最適化、sharp や satori を使ったOG画像の生成、Vercel固有のサービスを使っていないか。OG画像の生成はNext.jsの9月の脆弱性の記事でも触れた箇所です
  3. ブランチで vinext check と vinext init を通す:差分をgitで見て、何が増えたかを制作会社と共有します
  4. ページが静的か動的か:ビルドのルート一覧で、静的に配りたいページが「Static」になっているかを見ます。Cloudflare向けではキャッシュの方式の選択がこれを左右します
  5. 保守の担い手:vinextはNext.jsとは別の実装です。不具合が出たとき、制作会社が調査と回避まで受けられるかを確認します

どれを選ぶか

ここまでの資料と検証をもとにした、編集部の整理です。

状況編集部の提案
Vercelの費用や運用に大きな不満がない続ける。Vercel外へ出ること自体を目的にしない
Next.jsのまま自社管理のサーバーで動かしたいNext.jsのセルフホストを先に検討する
Cloudflareへ寄せたい。機能を落としたくないOpenNextを先に検討する
Cloudflare Workersの機能やViteを積極的に使いたい。Next.js 16で、Known gapsに当たらないブランチでvinextを試し、静的ページの扱いと依存の版を確認してから判断する

落とし穴

  • checkの「100%」を合格証として扱う。 preferredRegion のように、READMEで無視すると書かれている設定でも表示されませんでした
  • 静的だったページが、配置後に毎回サーバー描画になる。 表示速度や実行回数に関わります
  • 1.0を「Next.jsと同じ挙動」と読む。 READMEは、Next.jsの文書にない挙動までは再現しないとしています

2026年10月2日に、cloudflare/vinextのREADMEとpackages/vinextのCHANGELOG(mainブランチ)、npmレジストリのvinextの公開記録を直接開いて確認しました。check・init・build・起動は、編集部の検証環境(Linux、Node v22.22.0、npm 10.9.4)で、create-next-appのひな形(Next.js 16.3.8)にルートハンドラーを1つ足した検証用アプリに対して1回ずつ実行した結果です。実際の業務サイトの移行、Cloudflareへのデプロイ、OpenNextとNext.jsのセルフホストの動作、表示速度や費用の比較は確認していません。

Next.jsで作ったサイトのホスティングの見直しや、リニューアルに合わせた構成の検討は、グリームハブへご相談ください。

Sources

この記事を共有XFacebook
鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

この記事のテーマを、自社の次の一歩へ

Webサイトで、実現したいことから。

使う人の目的、必要な機能、更新の体制を整理し、制作・改善で最初に取り組むことを考えます。

  • サイトの目的
  • 機能と使いやすさ
  • 公開後の運用
Web制作・改善を相談する

構想段階からご相談いただけます。この記事の情報を相談フォームに引き継ぎます。

最新記事をメールで受け取る・Web制作ガイドを読む
無料ダウンロード

Web制作 費用・発注・集客 完全ガイド【2026年版】

費用相場・制作会社の選び方・集客戦略をPDFにまとめました。

The PDF and newsletter emails are currently in Japanese.

メルマガにも登録されます。いつでも解除可能です。