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

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属性の混同といった一般的なミスを防止できます。
<!-- 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を実行しないため、クライアントサイドでのメタタグ更新はクローラーからは見えません。
<!-- 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>useSeoMetaをimport.meta.serverでラップすることで、コンポーザブルがSSR時のみ実行されるようになります。メタタグはクローラーに送信されるHTMLに含まれますが、クライアント側ではリアクティブウォッチャーが作成されません。これによりバンドルサイズが削減され、ハイドレーションのパフォーマンスが向上します。
useHead:スクリプト、リンク、Canonical URLの管理
useSeoMetaがSEOメタデータをカバーする一方、useHeadはそれ以外すべてを処理します。外部スクリプト、スタイルシート、canonical URL、HTML/body属性などです。
<!-- 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(アプリ全体のデフォルト)、レイアウト、そしてページです。ページレベルのタグはレイアウトレベルを上書きし、レイアウトレベルはアプリレベルを上書きします。
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' },
],
},
},
})<!-- layouts/default.vue -->
<script setup lang="ts">
useSeoMeta({
ogSiteName: 'SharpSkill',
twitterSite: '@sharpskill',
})
</script><!-- 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データを積極的にキャッシュします。画像サイズが指定されていない場合、プラットフォームがサムネイルを正しく表示しないか、まったく表示しない可能性があります。
<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>ogImageWidth、ogImageHeight、ogImageAltを含めることで、レンダリングの問題を防ぎ、アクセシビリティスコアを向上させます。
useHeadSafe:ユーザー生成コンテンツの安全な処理
メタタグにユーザー入力が含まれる場合、XSS脆弱性が懸念されます。useHeadSafeコンポーザブルは、注入前に値をサニタイズします。
<!-- 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ツールが必要なプロジェクトでは、このモジュールがボイラープレートを削減します。
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でラップし、クライアントサイドのリアクティビティオーバーヘッドを排除する - ソーシャルシェアプレビューのために
ogImageWidth、ogImageHeight、ogImageAltを含める - XSS攻撃を防ぐため、ユーザー生成コンテンツには
useHeadSafeを使用する - アプリレベルのデフォルトは
nuxt.config.tsで設定し、必要な場合のみページレベルでオーバーライドする - Google Rich Results Testで構造化データを検証する
- JavaScriptを無効にしたブラウザDevToolsのネットワークタブでレンダリングを確認し、クローラーの動作をシミュレートする
Vue.js / Nuxt.js のバグを見つけられますか
実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

執筆
Anthony Fillion-MailletSharpSkill 創業者
10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。
2026年9月12日 更新
共有
関連記事

Vue 3 Script Setup と defineModel 2026年版:モダン構文とインタビュー対策
Vue 3のscript setup構文とdefineModelによる双方向バインディングを徹底解説。リアクティブprops分割代入、TypeScriptパターン、Vueインタビュー頻出質問をカバーします。

Vue 3 Reactivity Transform 2026:$ref、$computed とインタビュー対策
Vue 3のReactivity Transform($ref、$computed)について深く解説します。2026年の最新動向、廃止の背景、現在の代替手段、そして技術面接で頻出する質問を詳しく取り上げます。

Vue 3 TeleportとSuspense: 2026年版高度なパターンと面接質問
Vue 3のTeleportとSuspenseコンポーネントの高度な使用パターンを解説します。defer prop、ネストされたSuspense、エラーハンドリング、そして実際の面接で問われる質問まで網羅的にカバーします。