Nuxt 4 SEOとメタタグ完全ガイド2026年版:useHead、useSeoMetaと面接対策

Nuxt 4のuseHeadとuseSeoMetaコンポーザブルでSEOを最適化する方法を解説。型安全なメタタグ管理、パフォーマンス最適化、Vue開発者向け面接質問まで網羅。

Nuxt 4 SEOとメタタグ完全ガイド2026年版:useHead、useSeoMetaと面接対策

Nuxt 4では、SEOメタタグを管理するために2つのコンポーザブルが提供されています。useHeadは汎用的なhead要素の管理に、useSeoMetaは型安全なSEOメタデータの設定に使用します。Nuxt 3が2026年7月31日にサポート終了を迎えることから、Nuxt 4.5でのこれらのコンポーザブルの理解は、技術面接に臨むVue開発者にとって必須となっています。

重要な違い

useSeoMetaはSEO専用タグ(title、description、Open Graph、Twitter Cards)をTypeScript完全対応で管理します。useHeadはスクリプト、スタイルシート、canonical URL、カスタムメタタグなど、それ以外すべてを処理します。完全なhead管理には両方を組み合わせて使用してください。

useSeoMeta:Nuxt 4における型安全なSEOメタデータ

useSeoMetaコンポーザブルは、100以上の型付きプロパティを持つフラットなオブジェクトを受け取ります。このアプローチにより、Open Graphタグにおけるname属性とproperty属性の混同といった一般的なミスを防止できます。

vue
<!-- pages/product/[id].vue -->
<script setup lang="ts">
const product = await useFetch(`/api/products/${route.params.id}`)

useSeoMeta({
  title: () => product.data.value?.name,
  description: () => product.data.value?.description,
  ogTitle: () => product.data.value?.name,
  ogDescription: () => product.data.value?.description,
  ogImage: () => product.data.value?.imageUrl,
  ogType: 'product',
  twitterCard: 'summary_large_image',
  twitterTitle: () => product.data.value?.name,
  twitterDescription: () => product.data.value?.description,
  twitterImage: () => product.data.value?.imageUrl,
})
</script>

アロー関数構文() => valueはリアクティブなゲッターを作成します。product.dataが変更されると、メタタグは自動的に更新されます。初期レンダリング後にSEOタグが変更されない静的ページでは、このリアクティビティは不要なオーバーヘッドとなります。

サーバーサイド限定メタタグによるパフォーマンス向上

検索エンジンのクローラーやGPTBot、ClaudeBotなどのAIボットは、最初のHTMLレスポンスのみを読み取ります。JavaScriptを実行しないため、クライアントサイドでのメタタグ更新はクローラーからは見えません。

vue
<!-- pages/about.vue -->
<script setup lang="ts">
if (import.meta.server) {
  useSeoMeta({
    title: 'About SharpSkill',
    description: 'Technical interview preparation platform for developers',
    ogTitle: 'About SharpSkill',
    ogDescription: 'Technical interview preparation platform for developers',
    ogImage: 'https://sharpskill.dev/og-about.png',
    robots: 'index, follow',
  })
}
</script>

useSeoMetaimport.meta.serverでラップすることで、コンポーザブルがSSR時のみ実行されるようになります。メタタグはクローラーに送信されるHTMLに含まれますが、クライアント側ではリアクティブウォッチャーが作成されません。これによりバンドルサイズが削減され、ハイドレーションのパフォーマンスが向上します。

useHead:スクリプト、リンク、Canonical URLの管理

useSeoMetaがSEOメタデータをカバーする一方、useHeadはそれ以外すべてを処理します。外部スクリプト、スタイルシート、canonical URL、HTML/body属性などです。

vue
<!-- pages/blog/[slug].vue -->
<script setup lang="ts">
const route = useRoute()
const config = useRuntimeConfig()

useHead({
  link: [
    {
      rel: 'canonical',
      href: `${config.public.siteUrl}/blog/${route.params.slug}`,
    },
    {
      rel: 'alternate',
      hreflang: 'fr',
      href: `${config.public.siteUrl}/fr/blog/${route.params.slug}`,
    },
  ],
  script: [
    {
      type: 'application/ld+json',
      innerHTML: JSON.stringify({
        '@context': 'https://schema.org',
        '@type': 'Article',
        headline: article.value?.title,
        author: { '@type': 'Person', name: 'Anthony Fillion-Maillet' },
        datePublished: article.value?.publishedAt,
      }),
    },
  ],
})
</script>

link配列はcanonical URLと国際化対応のhreflangタグを処理します。script配列はリッチ検索結果のための構造化データを注入します。どちらもSEOにとって重要ですが、useSeoMetaの対象外となります。

Vue.js / Nuxt.jsの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

メタタグの階層:アプリ、レイアウト、ページレベル

Nuxt 4は3つのレベルからメタタグをマージします。nuxt.config.ts(アプリ全体のデフォルト)、レイアウト、そしてページです。ページレベルのタグはレイアウトレベルを上書きし、レイアウトレベルはアプリレベルを上書きします。

nuxt.config.tstypescript
export default defineNuxtConfig({
  app: {
    head: {
      titleTemplate: '%s | SharpSkill',
      meta: [
        { charset: 'utf-8' },
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      ],
      link: [
        { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
      ],
    },
  },
})
vue
<!-- layouts/default.vue -->
<script setup lang="ts">
useSeoMeta({
  ogSiteName: 'SharpSkill',
  twitterSite: '@sharpskill',
})
</script>
vue
<!-- pages/index.vue -->
<script setup lang="ts">
useSeoMeta({
  title: 'Technical Interview Preparation',
  description: 'Prepare for your next technical interview with practice questions and mock interviews',
})
</script>

最終的にレンダリングされるタイトルは「Technical Interview Preparation | SharpSkill」となります。ページが%sプレースホルダーの値を提供し、設定がテンプレートを提供するためです。この階層により、ページ固有のオーバーライドを可能にしながら、繰り返しを回避できます。

Nuxt SEO面接でよく聞かれる質問

Vue/Nuxtポジションの技術面接では、SSRとSEO最適化に関する質問がよく出題されます。以下は面接官が期待するパターンです。

useSeoMetaでリアクティブゲッターと静的値のどちらを使用すべきですか?

静的値は、ランディングページ、アバウトページ、法的ページなど、固定コンテンツのページに適しています。リアクティブゲッターは、メタタグがフェッチされたデータやルートパラメータに依存する場合に必要です。パフォーマンスの違いは規模が大きくなると顕著になります。不要なウォッチャーを持つ50ページはメモリを無駄にし、ハイドレーションを遅くします。

AIクローラーはGooglebotとどう違いますか?

GooglebotはJavaScriptを実行し、クライアントサイドレンダリングを待機します。GPTBotやClaudeBotなどのAIクローラーは、スクリプトを実行せずに生のHTMLを取得します。サーバーレンダリングされたメタタグは両方に到達します。クライアント専用のメタタグは、AIボットにも古い検索エンジンにも到達しません。

Open Graphタグで最もよく壊れる原因は何ですか?

og:imageのサイズ指定の欠落です。FacebookとLinkedInはOGデータを積極的にキャッシュします。画像サイズが指定されていない場合、プラットフォームがサムネイルを正しく表示しないか、まったく表示しない可能性があります。

vue
<script setup lang="ts">
useSeoMeta({
  ogImage: 'https://example.com/og-image.png',
  ogImageWidth: 1200,
  ogImageHeight: 630,
  ogImageAlt: 'Article preview showing code editor with Vue syntax',
})
</script>

ogImageWidthogImageHeightogImageAltを含めることで、レンダリングの問題を防ぎ、アクセシビリティスコアを向上させます。

useHeadSafe:ユーザー生成コンテンツの安全な処理

メタタグにユーザー入力が含まれる場合、XSS脆弱性が懸念されます。useHeadSafeコンポーザブルは、注入前に値をサニタイズします。

vue
<!-- pages/profile/[username].vue -->
<script setup lang="ts">
const user = await useFetch(`/api/users/${route.params.username}`)

useHeadSafe({
  title: user.data.value?.displayName,
  meta: [
    { name: 'description', content: user.data.value?.bio },
  ],
})
</script>

<script>alert('xss')</script>のような悪意のあるユーザー名は、実行されるのではなくエスケープされます。標準のuseHeadはサニタイズを行わないため、信頼できないコンテンツにはuseHeadSafeが必須です。

高度な要件に対応するNuxt SEOモジュール

Nuxt SEOモジュールは、サイトマップ生成、robots.txt管理、schema.orgマークアップ、OG画像生成をバンドルしています。組み込みコンポーザブルを超えた包括的なSEOツールが必要なプロジェクトでは、このモジュールがボイラープレートを削減します。

nuxt.config.tstypescript
export default defineNuxtConfig({
  modules: ['@nuxtjs/seo'],
  site: {
    url: 'https://sharpskill.dev',
    name: 'SharpSkill',
  },
})

このモジュールはルートからサイトマップを自動生成し、末尾スラッシュの正規化を処理し、構造化データ用のコンポーザブルを提供します。大規模サイトを管理するチームは、集中型の設定から恩恵を受けます。

今すぐ練習を始めましょう!

面接シミュレーターと技術テストで知識をテストしましょう。

本番環境向けNuxt 4 SEOベストプラクティス

  • すべてのSEOタグ(title、description、Open Graph、Twitter Cards)にはuseSeoMetaを使用し、TypeScriptの自動補完を活用する
  • canonical URL、hreflangタグ、構造化データ、外部スクリプトにはuseHeadを使用する
  • 静的メタタグはimport.meta.serverでラップし、クライアントサイドのリアクティビティオーバーヘッドを排除する
  • ソーシャルシェアプレビューのためにogImageWidthogImageHeightogImageAltを含める
  • XSS攻撃を防ぐため、ユーザー生成コンテンツにはuseHeadSafeを使用する
  • アプリレベルのデフォルトはnuxt.config.tsで設定し、必要な場合のみページレベルでオーバーライドする
  • Google Rich Results Testで構造化データを検証する
  • JavaScriptを無効にしたブラウザDevToolsのネットワークタブでレンダリングを確認し、クローラーの動作をシミュレートする
今日のチャレンジ

Vue.js / Nuxt.js のバグを見つけられますか

実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

Anthony Fillion-Maillet

執筆

Anthony Fillion-Maillet

SharpSkill 創業者

10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。

2026年9月12日 更新

共有

関連記事