以下のように 「機能・概念別」+「よく聞かれる切り口」 に分けて整理しておくと、スッと出せるようになるよ!
🚀 Nuxt3の基本構成・設計
Nuxt3とは? → SSR・SSG・SPAを統一的に扱えるVue3ベースのフレームワーク
Appディレクトリ構成(
pages/
,components/
,layouts/
,composables/
,plugins/
,middleware/
)ファイルベースルーティングの仕組み
Layoutの使い方(default, error, custom layouts)
✅ Nuxt3とは?
Nuxt3は、Vue3をベースにしたフレームワークで、SSR(サーバーサイドレンダリング)、SSG(静的サイト生成)、SPA(クライアントサイド描画)を柔軟に切り替えて使えるのが特徴です。
Vue3 + Viteベースで高速開発可能
TypeScript・Composition API・Piniaが標準サポート
APIエンドポイントも
server/api/
内で完結(Nitroサーバー搭載)モジュールシステムが強力(例えば認証やi18nの導入が簡単)
👉 ポイント
単なるVueアプリではなく、「フルスタックVueアプリケーション」を構築できる
SSRやSSGなどの描画方式をプロジェクトごと、ページごとに最適に選べるのが強み
📁 Appディレクトリ構成
👉 よくある質問:「Vueと何が違うの?」
→ Nuxtはこの構成が「ルールとして決まっている」ことで、ルーティングや状態管理、API連携まで全部統一された設計になる。
📌 ファイルベースルーティング
pages/
ディレクトリにファイルを置くだけでルーティングが自動生成されます。
例:
特徴:
definePageMeta()
でページごとのメタ情報や認証要件を設定可能middleware
をdefinePageMeta({ middleware: 'auth' })
で適用も可
🧩 Layoutの使い方
layouts/
ディレクトリでページ全体のレイアウト構造を定義します。
基本の流れ:
layouts/default.vue
:全ページに適用されるデフォルトレイアウトlayouts/error.vue
:エラー時に表示されるレイアウトlayouts/admin.vue
:特定ページだけ別レイアウトを使いたい場合
ページ側で指定:
Layout内では <slot /> でページ内容を差し込む
👉 面談での言い方例:
「Nuxt3ではレイアウトをファイルで分けて、例えば管理画面とユーザー画面で異なる見た目にする時に使っています。デフォルトレイアウトと、必要に応じてcustom layoutを定義して、ページごとに切り替えられるのが便利です。」
✅ 補足ポイント(まとめ)
機能 | 役割・用途 |
---|---|
pages/ | ルーティングを定義、ファイル名がURLになる |
layouts/ | 共通のページ枠組み(header/footerなど)を定義 |
components/ | 再利用可能なVueパーツを定義 |
composables/ | ロジックを再利用する(API処理やデータ操作など) |
plugins/ | 外部ライブラリの初期化・グローバル登録など |
middleware/ | ページ遷移時のガード処理(例:認証チェック) |
💡 状態管理(Pinia・useState)
pinia
を使う理由と使い方(defineStore
,state
,getters
,actions
)useState
との違い(ローカル vs グローバル、永続性)SSR環境での
pinia
の扱い(状態保持の工夫)
✅ 状態管理とは?
コンポーネント間で 共通して使う「データ」 を一元管理する仕組み。
例えば:
ログインユーザー情報
カート内商品情報
言語設定
など、どこからでもアクセス・変更したい状態が対象。
🧩 Pinia を使う理由と使い方
🔹 Piniaとは?
Vue3公式の状態管理ライブラリで、Vuexの後継として推奨されてるもの。
Nuxt3では@pinia/nuxt
が標準で組み込まれてるから、すぐ使える。
なぜPiniaを使うの?
グローバルな状態を扱える(どのコンポーネントからでも使える)
Composition APIベースで書きやすい
devtools対応、型サポート、SSR対応もバッチリ
storeをファイル単位で分離できてスケーラブル(例:useUserStore, useCartStore)
🔧 Piniaの使い方(構成要素)
使う側(ページやコンポーネント)で:
🔁 useStateとの違い(ローカル vs グローバル)
特徴 | useState | Pinia |
---|---|---|
対象 | 単一コンポーネント or ページ内 | アプリ全体で共有する状態 |
永続性 | ページ遷移やリロードでリセット | リロード時も維持(※localStorage併用など) |
構文 | Composition API | defineStore() でストア作成 |
分離・再利用 | あまりしない | ストアファイルに分けて再利用・整理しやすい |
SSR対応 | 自動でされる | 少し工夫が必要(次で解説) |
🌐 SSR環境でのPiniaの扱い(状態保持の工夫)
SSRではサーバーで一度描画した状態をクライアントにシリアライズして引き継ぐ必要がある。
Nuxt3ではどうしてる?
→ NuxtがPiniaとNitroサーバーを統合してるため、基本的には自動で動く
(※ただし一部のケースで状態リセットが発生しやすい)
🛡️ 状態を永続化したい場合
そして、ストア側で:
これで状態が localStorageに保存されて、SSRやリロード後も保持 できる!
✅ 面談で話す例(まとめ)
「Nuxt3ではコンポーネントローカルな状態にはuseState、アプリ全体に共有するグローバルな状態にはPiniaを使います。PiniaはVue公式の状態管理ライブラリで、SSRや永続化にも対応していて、ログイン情報や共通設定の管理に向いています。Nuxtでは最初から使える状態なので、使い分けも簡単にできます。」
🔄 データ取得とAPI連携
useFetch
(SSR対応、キャッシュ、状態管理つき)$fetch
(軽量、単発通信向き、Composableやstoreでも使用可)useAsyncData
との違いと使い分けクライアント専用API(
onMounted
内での処理など)middlewareやserver/apiディレクトリとの連携
🧠 SSR・SSG・CSRの違いと使いどころ
SSR(
useFetch
, SEO, 初期描画)SSG(静的化、再利用性、ビルド時取得)
CSR(完全にクライアントだけで動くケース)
defineNuxtConfig
のssr: true/false
の違い
🧩 Composables と Plugins
composables/
に置くことで自動インポートされるAPI分離・共通ロジック(例:useUser, useAuth など)
plugins/
を使った外部ライブラリの登録・実行タイミング
🔐 認証・認可
Middlewareの使い方(
defineNuxtRouteMiddleware
)認証トークンの管理(cookie, localStorage, SSRでの注意点)
認可チェックとルーティングガード
🎨 UI周り(Vuetifyなど)
Vuetify3との統合(SSGとの相性、カスタマイズ)
スロット・コンポーネント設計のベストプラクティス
スケーラブルなデザイン実装(Atomic Designなど)
🧱 TypeScript
Typeの書き方(Props, storeの型付け, composablesの戻り値など)
APIレスポンスの型管理(型ファイルの分割など)
🔧 開発・構築・デプロイ関連
Nuxt3の
nitro
サーバの特徴(サーバーレス、Edge対応)buildコマンド(
nuxi
,nuxt dev
,nuxt build
,nuxt preview
)AWSなどへのデプロイ経験(S3+CloudFront、Amplify、Lambdaとの連携)
サーバー側API作成(
server/api/xxx.ts
)
📊 Core Web Vitals / パフォーマンス対応(最近よく聞かれる)
LCP、FID、CLSなどの指標と改善経験
Lazy Load、SplitChunks、画像最適化
Nuxt3のパフォーマンス最適化Tips(
definePageMeta
,nuxt-img
, etc)
📌 その他
ESLint, Prettier などコードスタイル管理
バックエンドとの連携(認証、REST/GraphQL、S3連携など)
テスト(unit, e2e: vitest, Cypressなど)
🎯 面談での答え方のコツ
「概要」→「具体的にやったこと」→「成果 or 工夫」 という流れで話すと説得力UP
質問が広くても「僕が実際やったケースだと…」で話すと自然
どう忘れても「調べながら最適解を見つけてきた経験」が伝えられればOK!
🌍 SSR・SSG・CSRの違いと使いどころ
🔁 SSR(サーバーサイドレンダリング)
サーバーでHTMLを生成 → クライアントに配信
クライアントはHTMLを受け取って、JSを後からバインド(Hydration)
✅ メリット
SEOに強い(GoogleがHTMLを読める)
初回表示が速く感じやすい(HTML先に届く)
🧠 Nuxt3での実装例
useFetch()
(サーバーでデータ取得 → クライアントに引き継がれる)
📦 SSG(静的サイト生成)
ビルド時にページをHTMLとして書き出す(CDNで高速配信)
✅ メリット
超高速表示(LCP良し)
負荷がサーバーにかからない(スケールしやすい)
🧠 Nuxt3でのやり方
defineNuxtConfig
でprerender: true
にするページ単位で
useStatic()
やuseAsyncData()
で静的取得もOK
🖥️ CSR(クライアントサイドレンダリング)
初期表示は空のHTML(Loading…)、JSが全部動いてから描画
✅ メリット
サーバー関与なし=自由(API設計や動作が柔軟)
SPA的な体験(ページ遷移も滑らか)
🧠 Nuxt3での使い方
defineNuxtConfig
でssr: false
にすると 完全CSRフォーム送信画面や、認証後の管理画面などに向いてる
⚙️ defineNuxtConfig の ssr: true / false の違い
設定 | 意味 |
---|---|
ssr: true (デフォ) | SSR + SSGモード。SEOや速度が必要な画面に適する |
ssr: false | 完全SPAモード。NuxtをVue SPAとして使いたいとき |
🛠️ Composables と Plugins の違いと役割
📦 composables/ ディレクトリ
共通ロジックを再利用するための関数群
自動インポートされる(
useXXX()
でどこでも使える)
使いどころ:
API取得ロジック →
usePosts.ts
,useAuth.ts
入力バリデーション →
useFormValidation.ts
状態保持・ユーティリティ的な処理
例:
🔌 plugins/ ディレクトリ
外部ライブラリの導入や、Nuxtの起動時に実行したい処理を記述する場所
自動で登録される(
.client.ts
,.server.ts
で実行環境も指定可)
使いどころ:
axios, firebase, dayjs などライブラリのインスタンス設定
カスタムディレクティブやユーティリティの登録
ピニアのプラグイン追加
例:
✅ まとめ(面談で語れるポイント)
Nuxt3では SSR/SSG/CSR を柔軟に切り替えられ、ページや要件に応じて最適化できる
状態管理は
useState
(ローカル)とPinia
(グローバル)で整理共通処理は
composables/
に、外部連携や初期処理はplugins/
に配置する
🔐 認証・認可(Auth)
✅ Middlewareの使い方(defineNuxtRouteMiddleware)
ページ遷移時に毎回呼ばれる関数
認証チェックやリダイレクト処理に使える
.global.ts
→ すべてのルートに適用.ts
→ ページ側でdefinePageMeta({ middleware: 'auth' })
で適用
✅ 認証トークンの管理(cookie, localStorage, SSRの注意点)
方法 | 特徴 |
---|---|
cookie | SSRでも読める。セキュリティ◎(httpOnly 推奨) |
localStorage | クライアントのみで使用可能。簡単だがSSR非対応 |
SSR対応なら cookie を推奨
httpOnly
のcookieはJSからはアクセスできない(XSS対策になる)
✅ 認可チェックとルーティングガード
管理者ページなどで権限に応じたチェックが必要な場合
🎨 UI周り(Vuetifyなど)
✅ Vuetify3との統合
SSR・SSGでの注意点
CSSバンドルの設定に注意(
nuxt.config.ts
のcss: ['vuetify/styles']
)SSRでレイアウト崩れが起きやすい → サーバー/クライアント両対応の設定が必要
✅ スロット・コンポーネント設計
slot
の活用で拡張性と再利用性を両立
✅ スケーラブルなUI設計:Atomic Design
レイヤー | 役割 | 例 |
---|---|---|
Atoms | 最小要素 | Button , Input , Text |
Molecules | 複合要素 | SearchBar , CardHeader |
Organisms | 意味あるUIの塊 | UserCard , PostList |
Templates | ページのレイアウト | BlogLayout.vue |
Pages | 実ページ | pages/index.vue |
🧱 TypeScript活用
✅ Typeの書き方(Props, store, composables)
Propsの型
Piniaの型付き
Composablesの型
✅ APIレスポンスの型定義と分割
型ファイルを
/types/
にまとめておくと管理がラク
🎯 まとめ:このあたり面談で語れるとGOOD!
認証では
middleware + cookie
の使い分けが鍵UIは Vuetify + Atomic Design で拡張性高く
型の分離管理や
types/
ディレクトリでの整理が実務感を出す
🔧 開発・構築・デプロイ関連
✅ Nuxt3のNitroサーバの特徴
軽量なバックエンドランタイム
API・SSR処理をNodeだけでなく Edge functions(Vercel/Cloudflare)でも動作可能
デフォルトでサーバーレス構成向き(
server/api/*.ts
はLambdaライクに動作)
Nitro
の特徴:
ノンブロッキングで高速
デプロイ先に応じた出力(
output.public
,output.server
など)preset: 'aws-lambda'
などプリセットあり
✅ build・開発関連コマンド
コマンド | 内容 |
---|---|
nuxi dev | 開発サーバー起動(ホットリロード) |
nuxi build | 本番用ビルド |
nuxi preview | ビルド後の本番プレビュー起動 |
nuxi generate | SSG(静的サイト)出力 |
nuxi
= NuxtのCLIツール(v3系から標準)
✅ AWSへのデプロイ経験(例:S3 + CloudFront)
✅ 静的ホスティング(SSGの場合)
nuxi generate
で静的ファイル出力 → S3にアップロードCloudFrontでCDN配信 + HTTPS
✅ SSR(動的)なら…
nuxi build
で出力 →Lambda
+API Gateway
output: { preset: 'aws-lambda' }
設定でOK
✅ Amplify でもデプロイ可
amplify init
→amplify add hosting
→amplify publish
✅ サーバー側API作成(server/api/xxx.ts)
/api/hello
にアクセスするとJSONが返るサーバーレス的に使えるのでバックエンドなしでAPI構築可能
📊 Core Web Vitals / パフォーマンス対応
✅ 代表的な指標と改善策
指標 | 意味 | 対策例 |
---|---|---|
LCP(Largest Contentful Paint) | メイン要素の描画速度 | nuxt-img で画像最適化、SSR活用 |
FID(First Input Delay) | 初回操作への応答時間 | JSの最小化、不要なクライアント処理削減 |
CLS(Cumulative Layout Shift) | レイアウトの揺れ | 高さ指定、フォント遅延防止、画像比率指定 |
✅ Nuxt3の最適化Tips
nuxt-img
コンポーネントで画像最適化(遅延読込・サイズ調整)definePageMeta({ keepalive: true })
でページの状態維持nuxt.config.ts
で以下の最適化も設定可能:
📌 その他:実務でよく聞かれるやつ
✅ ESLint / Prettier(コードスタイル統一)
CIに組み込んで PR単位で自動チェックすることも多い
✅ バックエンドとの連携
認証:Cookieベース、JWT、OAuthなど(APIでtoken発行&保持)
REST API:
useFetch
,$fetch
で呼び出しGraphQL:Apollo Client連携も可能(plugin化)
S3連携:プリサインURLをAPIで取得してアップロード
✅ テスト(unit / e2e)
Unit Test:Vitest(Vue3に相性◎)
E2E:Cypress
実ブラウザでの操作確認に◎
ログイン処理や遷移などをシナリオテスト
コメント