0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nuxt3 + VuetifyのSSR表示崩れ解決方法|AI実務ノート 編集部

0
Last updated at Posted at 2026-01-03

1. 結論(この記事で得られること)

Nuxt3でVuetifyを使うと、初回ロード時だけレイアウトが一瞬崩れる問題に遭遇します。これ、私も最初のプロジェクトで丸一日潰しました。

この記事では以下が得られます:

  • SSRハイドレーションミスマッチの原因と解決法(3パターン)
  • Vuetify特有のCSSインライン化設定
  • AI(Claude/GPT)を使った切り分け手順(10分→2分に短縮)
  • 本番環境で安全に検証するテスト戦略
  • 運用監視で見るべきメトリクス

結論から言うと、「vuetify-nuxt-module」の正しい設定と、SSRContextの適切な扱いで99%解決します。

2. 前提(環境・読者層)

想定環境

{
  "nuxt": "^3.10.0",
  "vuetify": "^3.5.0",
  "vuetify-nuxt-module": "^0.14.0",
  "node": ">=18.0.0"
}

想定読者

  • Nuxt3 + Vuetifyで表示崩れに悩んでいる方
  • SSRの仕組みは何となく分かるが実装で詰まっている方
  • 本番リリース前に確実に潰しておきたいエンジニア

3. Before:よくあるつまずきポイント

症状A:初回ロード時だけボタンがズレる

<template>
  <v-btn color="primary">送信</v-btn>
</template>

現象:

  • サーバー側HTML:スタイル未適用
  • クライアント側JS読み込み後:正しく表示
  • → 一瞬ガクッとレイアウトがズレる(FOUC: Flash of Unstyled Content)

症状B:グリッドが崩壊する

<v-container>
  <v-row>
    <v-col cols="12" md="6">左</v-col>
    <v-col cols="12" md="6">右</v-col>
  </v-row>
</v-container>

現象:

  • 初回だけ縦並びになる
  • ハイドレーション後に横並びに修正される

症状C:Dark mode がチラつく

// plugins/vuetify.ts
theme: {
  defaultTheme: 'dark'
}

現象:

  • 一瞬ライトテーマで表示 → ダークに切り替わる
  • ユーザー体験が最悪

私も最初、「Vuetifyのバグでは?」と疑いましたが、99%は設定不足です。

4. After:基本的な解決パターン

パターン①:vuetify-nuxt-module の正しいインストール

npm install vuetify-nuxt-module
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    'vuetify-nuxt-module'
  ],
  vuetify: {
    moduleOptions: {
      /* module specific options */
    },
    vuetifyOptions: {
      ssr: true,  // ←これ重要
    }
  }
})

重要ポイント:

  • 「ssr: true」 でサーバー側でもスタイル生成
  • 「vuetify-nuxt-module」 が自動で最適化してくれる

パターン②:CSSインライン化の有効化

// nuxt.config.ts
export default defineNuxtConfig({
  vuetify: {
    vuetifyOptions: {
      ssr: {
        clientSideNav: true  // クライアント側ナビゲーション最適化
      }
    }
  },
  app: {
    head: {
      link: [
        {
          rel: 'stylesheet',
          href: 'https://cdn.jsdelivr.net/npm/vuetify@3.5.0/dist/vuetify.min.css'
        }
      ]
    }
  }
})

注意:

  • CDN使用は開発時のみ推奨
  • 本番ではビルド時にバンドルすべき

パターン③:プラグイン側の設定

// plugins/vuetify.ts
import { createVuetify } from 'vuetify'
import * as components from 'vuetify/components'
import * as directives from 'vuetify/directives'
 
export default defineNuxtPlugin((nuxtApp) => {
  const vuetify = createVuetify({
    ssr: true,
    components,
    directives,
  })
 
  nuxtApp.vueApp.use(vuetify)
})

この3つで基本的な表示崩れは解消します。でも、実務だとこれだけじゃ足りないんですよね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?