先に要点
- Nuxt は、Vue.js を土台に、ルーティング、SSR、SSG、API まわりまでまとめて扱いやすくしたフレームワークです。
- Vue.js 単体は画面づくりの本体、Nuxt はその画面をサイトやアプリとして組み立てる枠組み、と考えると違いがつかみやすいです。
- Vue 単体で始めて後から Nuxt へ移す場合、
vue-routerの手書き設定やmain.jsのエントリ、Vite 設定の引き継ぎ方で詰まりやすく、移行前に対象を切り分けておくと安全です。 - SSR と SSG はページ単位で混在でき、
routeRulesで公開ページは事前生成、ログイン後は CSR、と分けるのが実務的です。
「Nuxt って Vue と何が違うの」「Vue を知っていればそのまま使えるの」という疑問はかなり多いです。 名前だけ見ると Vue の仲間っぽいもので終わりがちですが、実際には役割がかなり違います。
Vue.js は UI を作るためのフレームワーク、Nuxt はその Vue を土台にして、ルーティング、データ取得、SSR、SSG、API まで一式をまとめる枠組みです。 ここが分からないまま選ぶと、「Vue だけで十分だった」か「最初から Nuxt にしておけばよかった」のどちらかで迷いやすくなります。
この記事では、Nuxt の立ち位置を、Vue.js との違い、向いているサイトやアプリ、実務での判断軸まで含めて整理します。さらに「Vue 単体から後で Nuxt へ移すときの詰まりどころ」「Nuxt 2 から Nuxt 3・4 への移行の注意」「SSR と SSG をページ単位で混在させる構成」を、コード例とつまずきの対処まで含めて整理します。2026年10月時点で Nuxt 公式ドキュメントと Vue 公式ドキュメントを確認してまとめています(最新は Nuxt 4 系・Vue 3 系)。
そもそも Nuxt とは何か
Nuxt は、Vue をベースにしたフルスタック寄りの Web フレームワークです。 公式ドキュメントでも、フロントエンド開発を直感的にしつつ、型安全、パフォーマンス、実運用に必要な機能をまとめて扱える枠組みとして案内されています。
初心者向けに言い換えると、Vue でサイトや Web アプリを作るときに、最初から必要になりやすいものを一式そろえてくれる土台です。
Nuxt が引き受けてくれる主なものを、Vue との関係で図にしました。
- ファイルベースルーティング(
pages/ディレクトリ) - SSR と SSG
- レイアウト分割(
layouts/) - データ取得のしやすい仕組み(
useFetch/useAsyncData) - サーバー API(
server/api/) - ビルドと配信まわりの整理
ここで大事なのは、Nuxt は Vue を置き換えるものではなく、Vue を土台にその外側を整えるものだということです。
Vue.js と Nuxt の違い
いちばん大きい違いは、どこまで面倒を見てくれるかです。
| 観点 | Vue.js 単体 | Nuxt |
|---|---|---|
| 役割 | UI を作る本体 | UI + ルーティング + 配信構成まで含む枠組み |
| ルーティング | Vue Router を自分で選んで組む | ファイルベースでまとまりやすい |
| SSR / SSG | 別途構成が必要 | 最初から選択肢に入る |
| API | 別バックエンドが前提になりやすい | Nitro で同居しやすい |
| プロジェクト構成 | 自由度が高い | 作法が整理されている |
| 向いている場面 | 小さめの UI、既存サイトの一部改修 | 公開サイト、会員機能つきサイト、Vue 主体の Web アプリ |
つまり、Vue.js 単体は部品を作るための中心、Nuxt はその部品をどう並べてサイトやアプリとして動かすかまで含めた仕組みです。
実務では、次のように考えると分かりやすいです。
→ Vue.js 単体でも十分
画面の一部分だけ Vue で動かしたい
→ Nuxt が有力
サイト全体やアプリ全体を Vue で組みたい
→ Nuxt の方が整理しやすい
SEO や初期表示速度も意識したい
Vue 単体で始めて、後から Nuxt へ移すときの詰まりどころ
「まず Vite + Vue で小さく作り、規模が出てきたら Nuxt へ移す」という流れは現場でよくあります。ただし Nuxt は単なる Vue の上位プラグインではなく、ルーティングとビルドの主導権を握る枠組みなので、Vue 単体のプロジェクトをそのまま npm install nuxt しても動きません。移行は「載せ替え」ではなく「枠への差し込み直し」になります。代表的な詰まりどころを整理します。
エントリポイントが消える
Vue 単体の main.js にある createApp(App).use(router).mount('#app') は Nuxt では書きません。アプリ起動は Nuxt が握り、追加処理は plugins/ の defineNuxtPlugin に移します。
ルーティングの主導権が変わる
手書きの vue-router の routes 配列は捨て、pages/ 配下のファイル名でルートを表現し直します。動的ルートは pages/posts/[id].vue の形です。
window 参照が SSR で落ちる
Vue 単体は常にブラウザ前提なので window や localStorage を直に触れますが、Nuxt は既定が SSR でサーバー側に window が無く、初回実行で例外になります。
とくに最後の SSR 起因のエラーは、移行直後に最も多く出ます。失敗例を現象から回避まで並べておきます。
- 1現象
移行後に画面が真っ白になり、サーバーログに 500 と ReferenceError: window is not defined / document is not defined が出る。
- 2
- 3確認手順
npm run dev で再現させ、ターミナル側(サーバー)のスタックトレースを読む。ブラウザ console ではなくサーバーログに出るのが目印。該当行を grep で window や localStorage で探す。
- 4回避
ブラウザ専用処理は onMounted の中へ移すか、import.meta.client で分岐する。どうしても SSR したくないコンポーネントは <ClientOnly> で囲む。グローバルに不要なら nuxt.config の ssr:false、ページ単位なら routeRules で該当パスだけ ssr:false にする。
その他、移行前にチェックしておきたい点です。
- 環境変数:
VITE_接頭辞でのimport.meta.env参照は、Nuxt ではruntimeConfigとuseRuntimeConfig()に置き換える。秘匿値をクライアントへ漏らさない区分けがここで明確になる。 - ビルド設定:
vite.config.jsの独自設定(エイリアス、プラグイン)はnuxt.config.tsのviteキー配下へ移す。丸ごとコピーは効かない。 - ライブラリの初期化: グローバル登録していた UI ライブラリやアイコンは、プラグインとして
nuxtApp.vueApp.use(...)で登録し直す。
まず pages/index.vue 1枚だけ通して SSR の挙動を確認してから残りを移すと、原因の切り分けがしやすいです。
Nuxt 2 から Nuxt 3・4 への移行で気をつけること
既存資産が Nuxt 2 の場合、Nuxt 3 への移行は「ほぼ別物への作り直し」に近い規模です。内部エンジンが Nitro に変わり、Vue 自体も 2 系から 3 系へ上がり、ディレクトリ構造とデータ取得 API が刷新されています。公式も小さなプロジェクトは直接移行、規模が大きいものは互換レイヤの Nuxt Bridge で段階移行することを案内しています。
なお、2026年10月時点の安定版は Nuxt 4 系です。公式ロードマップでは、Nuxt 2 は2024年6月30日、Nuxt 3 も2026年7月31日にサポートを終えており(バグ修正・セキュリティ修正なし)、これから移すなら移行先は Nuxt 4 です。3 から 4 への更新は 2 から 3 ほどの作り直しではありませんが、既定のソースディレクトリが app/ になる(古い構成も自動で認識される)、useFetch の data の既定値が undefined になるなどの変更があるため、公式のアップグレードガイドを確認します。
主な非互換ポイントを表にまとめます。
| 項目 | Nuxt 2 | Nuxt 3 以降(4 系を含む) |
|---|---|---|
| Vue 本体 | Vue 2 / Options API 中心 | Vue 3 / Composition API 中心 |
| データ取得 | asyncData / fetch |
useAsyncData / useFetch |
| サーバーエンジン | Connect ベース | Nitro |
| 設定ファイル | nuxt.config.js(CommonJS 可) |
nuxt.config.ts(ESM のみ) |
| state 管理 | Vuex 前提 | Pinia 推奨 / useState |
| ストア取得 | this.$store |
composable で取得 |
ここでつまずきやすいのは、見た目が似ているのに挙動が違う asyncData から useFetch への移行です。失敗例で示します。
- 1現象
移行後、ページ遷移のたびに API が叩かれる、あるいは同じデータが二重取得される。Nuxt 2 では起きていなかった。
- 2原因
useFetch / useAsyncData はキー(URL や指定キー)単位でキャッシュと重複排除を行う。Nuxt 2 の asyncData 感覚で毎回呼ぶつもりで書くと、キャッシュの有無やキー設計を意識していないため挙動が食い違う。
- 3確認手順
ブラウザの Network タブで遷移ごとのリクエスト回数を見る。意図せず重複する場合は useFetch の第2引数の key と watch を確認する。
- 4回避
一覧→詳細のような動的取得では key を明示し、再取得したい条件だけ watch に渡す。サーバーで一度だけ取れば十分なものは server:true(既定)のまま、クライアントで都度取りたいものだけ明示的に分ける。
移行を始める前のチェックリストです。
nuxt.configからmodule.exportsやrequireを排し、export default defineNuxtConfig({})の ESM へ書き換える。CommonJS は非対応です。- 使っている全モジュールとプラグインの Nuxt 4 対応状況を先に棚卸しする。更新されたもの、放置されたもの、別物に置き換わったものが混在します。
- Vuex を使っているなら Pinia への移行計画を併せて立てる。
Nuxt 2 は2024年6月30日、Nuxt 3 は2026年7月31日にサポートを終えています。土台の Vue 2 も2023年12月31日にサポートを終えています。
SSR と SSG をページ単位で混在させる構成
Nuxt の実務で効くのが、サイト全体を一律 SSR か一律 SSG に倒すのではなく、ページ(ルート)ごとにレンダリング方式を変えられる点です。Nuxt 3 以降では nuxt.config.ts の routeRules でパス単位に指定します。たとえば「トップとブログは事前生成、商品一覧は短時間キャッシュ、管理画面は CSR」を一括で表現できます。
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// トップは事前生成(SSG 相当・最速)
'/': { prerender: true },
// ブログ詳細は ISR で 1時間ごとに裏で再生成
'/blog/**': { isr: 3600 },
// 商品一覧は SWR(配信しつつ裏で更新)
'/products/**': { swr: 600 },
// 管理画面はサーバー描画を切って CSR にする
'/admin/**': { ssr: false },
// 旧 URL はサーバー側でリダイレクト
'/old-page': { redirect: '/new-page' },
},
})
各キーの意味を整理します。
| キー | 挙動 | 向く場面 |
|---|---|---|
prerender: true |
ビルド時に HTML を生成し静的配信 | ほぼ変わらない公開ページ |
isr: 3600 |
初回アクセス後に CDN へ生成・キャッシュし、指定秒で再生成 | 更新はあるが毎分は変わらない記事 |
swr: 600 |
キャッシュを返しつつ裏で更新 | 在庫や一覧など準リアルタイム |
ssr: false |
サーバー描画せずブラウザ側で描画 | ログイン後の管理画面・ダッシュボード |
運用上の注意点を押さえておきます。
ホスティング
ISR と SWR はホスティングに依存する
これらの裏側更新は Vercel や Netlify、Cloudflare など対応プラットフォームの機能に乗ります。自前サーバーやプラットフォーム非対応の構成では SWR が単なる毎回 SSR に近い動きになることがあるため、デプロイ先の仕様を先に確認してください。
動的ルート
prerender は動的ルートを自動で全網羅しない
/blog/[slug] のような動的ページを prerender したい場合、Nuxt はクロールで辿れたリンクしか生成しません。どこからもリンクされていない URL は出力されないので、nuxt.config の prerender.routes(Nuxt 4 系の公式ドキュメントの書き方)に明示するか、一覧ページから確実にリンクを張ります。
SEO
SSR を切ったページは SEO とメタ情報が弱くなる
ssr:false のパスは初回 HTML が空に近く、クローラーが内容を読みにくくなります。検索流入を狙うページには使わず、管理画面など非公開系に限定します。
混在時はキャッシュ起因の不具合が出やすい
「更新したのに古い内容が出る」という現象は、SWR/ISR のキャッシュが残っているのが原因のことが多いです。再現したら、まずブラウザではなく CDN 側のキャッシュ TTL とデプロイ後のパージ動作を確認します。
Nuxt が便利と言われる理由
Nuxt の便利さは、機能が多いことより、最初から筋のよい構成に寄せやすいことにあります。
理由1
1. ルーティングを整理しやすい
ページ単位の構成が見えやすく、どこが公開ページで、どこが管理画面なのかを把握しやすいです。小さなチームや、途中参加のメンバーが多い案件ではここが地味に効きます。
理由2
2. SSR と SSG を最初から考えやすい
公開サイトや採用サイト、オウンドメディアのように、検索流入や初期表示を意識したい場面では、SSR や SSG を自然に選べるのが強みです。前章のとおりページ単位で混在できるため、サイト全体を一方式に縛らずに済みます。Vue 単体でも実現はできますが、最初から Nuxt の流れに乗った方が、後で構成を組み直す手間が減ります。
理由3
3. サーバー側の役割も同じプロジェクトで持ちやすい
Nuxt では、Nitro によってサーバー処理や API を同じプロジェクトで扱えます。もちろん大規模な業務ロジックは別バックエンドへ分けた方がよいこともありますが、問い合わせ送信、一覧取得、軽い認証補助のような処理なら同じ枠の中で持ちやすいです。
理由4
4. Vue チームなら立ち上がりが早い
React 系で Next.js が自然なように、Vue 系では Nuxt を土台にした方が、ルーティングや配信の話までまとめて判断しやすくなります。
どんなサイトやアプリに向いているか
Nuxt が向いている場面は、画面が主役で、かつサイト全体の構成も整理したい案件です。
向いている場面
公開側
公開サイト
コーポレートサイト、採用サイト、オウンドメディア。
ログイン後
会員・管理系
会員機能つきサイト、管理画面やダッシュボード。
アプリ
Vue 主体の Web アプリ
Vue を中心にしたフロントエンド主導の Web アプリ。
公開側は SSR / SSG、ログイン後は CSR 寄り、のように routeRules で分けて考えやすいからです。
相性がよい例
公開サイト + 問い合わせ導線
SEO と表示速度を意識したいページが多いなら、Nuxt の SSR / SSG が活きやすいです。
会員ページつきサービス
Vue が得意なチームの業務アプリ
管理画面やダッシュボード中心でも、構成やルーティングを揃えやすいのが強みです。
向いていない、または慎重に考えたい場面
Nuxt は便利ですが、何にでもベストというわけではありません。
慎重に1
1. 画面が少なく、ちょっとした UI だけを足したい
既存のサーバーサイドレンダリング環境に、インタラクティブな部品を少し足すだけなら、Vue.js 単体の方が軽いことがあります。
慎重に2
2. バックエンドの業務ロジックがかなり重い
認証、ワークフロー、複雑な権限、帳票、監査ログなど、バックエンドの役割が大きい業務システムでは、Laravel や Spring Boot など別のサーバー側基盤を中心に据えた方が整理しやすいことがあります。
慎重に3
3. チームに Vue の知見がほとんどない
Nuxt が便利でも、Vue の書き方や考え方に慣れていないと立ち上がりに時間がかかります。その場合は Nuxt がよいかではなく、チームに合うフレームワークは何かから見た方が失敗しにくいです。
Next.js との違いはどう見るべきか
Nuxt と Next.js は、立ち位置がかなり近いです。 違いを一言でまとめるなら、Vue 派なら Nuxt、React 派なら Next.js がいちばん現実的です。
| 観点 | Nuxt | Next.js |
|---|---|---|
| ベース | Vue.js | React ベース |
| 向いているチーム | Vue に慣れている | React に慣れている |
| サーバー処理 | Nitro | Route Handlers / Server Components |
| 立ち位置 | Vue 系のフルスタック枠 | React 系のフルスタック枠 |
機能面だけで無理に差を作るより、チームの経験や既存資産を見た方が実務ではうまくいきます。
Next.js 側から見た比較を読みたいなら、Next.jsは他のフレームワークと何が違う?|React単体・Nuxt・バックエンド系との比較で整理 もあわせて読むとつながりやすいです。
実務ではどう選ぶと失敗しにくいか
迷ったときは、次の順で考えると判断しやすいです。
| 確認したいこと | Nuxt が向きやすい答え |
|---|---|
| チームは Vue に慣れているか? | はい |
| SEO や初期表示速度を気にする公開ページがあるか? | はい |
| 画面とルーティングを整理したいか? | はい |
| API や軽いサーバー処理も一緒に持ちたいか? | はい |
| 重い業務ロジックは別バックエンドへ分けられるか? | はい |
逆に、公開ページはほぼない、既存のバックエンドが主役、Vue への慣れがない、なら別の構成の方が合うこともあります。
よくある誤解
誤解1
Nuxt は Vue の完全上位互換?
そうではありません。Nuxt は Vue を土台にしたフレームワークで、Vue の代わりではなく Vue の外側を整える枠です。
誤解2
Nuxt を使えばバックエンドはいらない?
軽い API や SSR まわりは Nuxt 側でも持てますが、複雑な業務ロジックまで全部 Nuxt に寄せると重くなりやすいです。どこまでを Nuxt で持ち、どこからを別バックエンドに分けるかは早めに決めた方が安全です。
誤解3
Vue.js を覚えていれば Nuxt はほぼそのまま?
Vue の知識はそのまま活きますが、Nuxt にはプロジェクト構成、配信、レンダリング、サーバー処理の考え方が追加されます。そのため、Vue が分かる イコール Nuxt もすぐ全部分かる、ではありません。
NuxtとVue.jsに関するよくある質問
Q. Vue.js だけで作るのと Nuxt を使うのはどちらが学びやすいですか?
A. 学習目的なら Vue.js 単体の方が概念がすっきりして覚えやすいです。実務では SSR、ルーティング、サーバー処理を自分で組むのは大変なので、Nuxt を使う方が早いことが多いです。
Q. Vue 単体で作った既存プロジェクトを Nuxt へ移すのは大変ですか?
A. 規模はファイル数や使っているライブラリで大きく変わりますが、難所は決まっています。main.js のエントリ廃止、vue-router の手書き設定の pages/ 化、そして既定 SSR による window is not defined 系のエラーです。まず1ページだけ通して SSR 挙動を確認してから残りを移すと安全です。
Q. Nuxt 2 と Nuxt 3 は別物ですか?
A. ほぼ別物と考えた方が安全です。内部エンジン(Nitro)、Composition API への切り替え、ディレクトリ構造、asyncData から useFetch へのデータ取得 API、設定ファイルの ESM 化まで大きく変わっています。規模が大きければ Nuxt Bridge で段階移行します。新規なら、2026年10月時点の安定版である Nuxt 4 系を選びます(Nuxt 3 も2026年7月31日にサポート終了)。
Q. SSR と SSG はどちらを選べば良いですか?
A. 内容が頻繁に変わるサイトは SSR、ほぼ静的でビルド時に HTML 化できるサイトは SSG が向きます。Nuxt は両方サポートしており、routeRules でページ単位に切り替えられます。
Q. ページごとに SSR と SSG を混在させるとき注意点はありますか?
A. isr や swr の裏側更新は Vercel や Netlify などホスティング機能に依存します。また ssr:false にしたページは初回 HTML がほぼ空で SEO に弱いので、検索流入を狙うページには使わないでください。
Q. Nuxt の API ルートは本格的なバックエンドの代わりになりますか?
A. 軽い API や BFF(フロント専用バックエンド)としては使えますが、本格的な業務ロジック、ORM、認証、ジョブキューなどを Nuxt 内に押し込むのは重くなります。Laravel や Rails と併用する構成も普通です。
Q. Nuxt は静的サイトジェネレータとして単体で使えますか?
A. 使えます。npx nuxt generate で完全静的な HTML を書き出せます。ただし動的ルートはクロールで辿れた URL しか出力されないため、リンクされていないページは nuxt.config の prerender.routes に明示します。出力先を Netlify、Vercel、Cloudflare Pages にデプロイすればサーバー不要で運用できます。
まとめ
Nuxt は、Vue.js を土台に、ルーティング、SSR、SSG、サーバー処理までまとめて扱いやすくしたフレームワークです。 Vue.js 単体よりサイトやアプリとしての形を整えやすく、公開サイト、会員機能つきサイト、管理画面、Vue 主体の Web アプリで特に力を出しやすいです。
一方で、すべての案件で最初から Nuxt が正解というわけではありません。Vue 単体で十分か、SSR や配信まで含めて整えたいか、バックエンドをどこまで持つかを見て決めるのが実務ではかなり大事です。Vue 単体からの移行や Nuxt 2 からの移行を見込むなら、SSR 起因のエラーやデータ取得 API の差を移行前に把握しておくと、つまずきをかなり減らせます。
フレームワーク全体の比較から見たい場合は、代表的なフレームワーク7選|向いている用途・特徴・選び方をわかりやすく解説 もあわせて読むと整理しやすいです。
参考リンク
- Nuxt 公式 Introduction: https://nuxt.com/docs/getting-started/introduction
- Nuxt 公式 Rendering(routeRules): https://nuxt.com/docs/guide/concepts/rendering
- Nuxt 公式 Server Engine(Nitro): https://nuxt.com/docs/guide/concepts/server-engine
- Nuxt 公式 Bridge / Migration: https://nuxt.com/docs/bridge/overview
- Nuxt 公式 Roadmap(各版のサポート期限): https://nuxt.com/docs/4.x/community/roadmap
- Nuxt 公式 Upgrade Guide: https://nuxt.com/docs/4.x/getting-started/upgrade
- Nuxt 公式 Prerendering: https://nuxt.com/docs/4.x/getting-started/prerendering
- Vue 公式 Vue 2 End of Life: https://v2.vuejs.org/lts/
- Vue 公式 What is Vue?: https://vuejs.org/guide/introduction.html