useHead
useHead は Nuxt アプリの個々のページの head プロパティをカスタマイズします。
useHead コンポーザブル関数は、Unhead によってプログラム的かつリアクティブに head タグを管理することを可能にします。データがユーザーや他の信頼できないソースから来る場合は、useHeadSafe を確認することをお勧めします。
型
useHead(meta: MaybeComputedRef<MetaObject>): void
以下は useHead の非リアクティブな型です。
interface MetaObject {
title?: string
titleTemplate?: string | ((title?: string) => string)
base?: Base
link?: Link[]
meta?: Meta[]
style?: Style[]
script?: Script[]
noscript?: Noscript[]
htmlAttrs?: HtmlAttributes
bodyAttrs?: BodyAttributes
}
より詳細な型については、@unhead/vue を参照してください。
useHead のプロパティは動的であり、ref、computed、reactive プロパティを受け入れることができます。meta パラメータは、オブジェクトを返す関数を受け入れることもでき、オブジェクト全体をリアクティブにします。
パラメータ
meta
型: MetaObject
以下の head メタデータを受け入れるオブジェクトです:
meta: 配列内の各要素は新しく作成された<meta>タグにマッピングされ、オブジェクトのプロパティは対応する属性にマッピングされます。- 型:
Array<Record<string, any>>
- 型:
link: 配列内の各要素は新しく作成された<link>タグにマッピングされ、オブジェクトのプロパティは対応する属性にマッピングされます。- 型:
Array<Record<string, any>>
- 型:
style: 配列内の各要素は新しく作成された<style>タグにマッピングされ、オブジェクトのプロパティは対応する属性にマッピングされます。- 型:
Array<Record<string, any>>
- 型:
script: 配列内の各要素は新しく作成された<script>タグにマッピングされ、オブジェクトのプロパティは対応する属性にマッピングされます。- 型:
Array<Record<string, any>>
- 型:
noscript: 配列内の各要素は新しく作成された<noscript>タグにマッピングされ、オブジェクトのプロパティは対応する属性にマッピングされます。- 型:
Array<Record<string, any>>
- 型:
titleTemplate: 個々のページのタイトルをカスタマイズするための動的テンプレートを設定します。- 型:
string|((title: string) => string)
- 型:
title: 個々のページの静的なページタイトルを設定します。- 型:
string
- 型:
bodyAttrs:<body>タグの属性を設定します。各オブジェクトプロパティは対応する属性にマッピングされます。- 型:
Record<string,>
- 型:
htmlAttrs:<html>タグの属性を設定します。各オブジェクトプロパティは対応する属性にマッピングされます。- 型:
Record<string,>
- 型:
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
NuxtのuseHeadとは?〜SEOやメタ情報管理の強力な味方〜
Nuxtアプリケーションを開発する際、SEO対策やSNSシェア時の表示、ブラウザのタブタイトルなど、headタグの内容を適切に設定することは非常に重要です。useHeadは、これらのheadタグをプログラム的かつリアクティブに管理できるNuxtのコンポーザブル関数です。
従来は静的にHTMLのheadを編集したり、ページごとに設定を分けるのが面倒でしたが、useHeadを使うことでVueのリアクティブな仕組みと連携し、動的にタイトルやメタタグを変更できます。これにより、ユーザーの操作やAPIから取得したデータに応じてSEO情報を柔軟に更新できるため、より効果的なSEO対策が可能になります。
まず結論:useHeadのポイント
- ページやコンポーネント単位でheadタグの内容を動的に設定できる
- タイトル、メタタグ、リンクタグ、スクリプトタグなど多様なhead要素を管理可能
- Vueの
refやcomputedと組み合わせてリアクティブに更新できる - 関数でオブジェクトを返す形で、依存するデータの変化に応じて自動更新される
titleTemplateでタイトルの共通フォーマットを簡単に適用できる- ユーザー入力など信頼できないデータを扱う場合は
useHeadSafeの利用を検討する
いつ使うべきか?使わない方がよいケース
使うべきケース
- ページごとに異なるタイトルやメタ情報を設定したいとき
- APIから取得したデータに基づいて動的にSEO情報を変えたいとき
- SNSシェア用のOGPタグやTwitterカードタグを動的に切り替えたいとき
- SPAのようにクライアント側でルーティングが変わる場合にheadを更新したいとき
使わない方がよいケース
- 静的に決まったhead情報のみで十分な場合(静的ファイルや単純なサイト)
- 大量のhead更新が頻繁に発生し、パフォーマンスに影響が出る恐れがある場合
- 信頼できない外部データを直接使う場合は
useHeadSafeを使わずにuseHeadを使うとXSSリスクがある
実務でよくあるユースケースとサンプルコード
1. ページタイトルと説明文を動的に設定する
APIから記事データを取得し、タイトルやdescriptionをページごとに変える例です。
import { ref, watch } from 'vue'
import { useHead } from '#imports'
const article = ref(null)
// APIから記事を取得(例)
async function fetchArticle(id) {
// ここはAPI呼び出しのモック
article.value = {
title: 'NuxtでSEOを強化する方法',
description: 'NuxtのuseHeadを使って動的にmetaタグを管理する方法を解説します。'
}
}
fetchArticle(123)
watch(article, (newArticle) => {
if (newArticle) {
useHead({
title: newArticle.title,
meta: [
{ name: 'description', content: newArticle.description }
]
})
}
})
2. titleTemplateで共通タイトルフォーマットを適用する
全ページ共通のタイトルフォーマットを設定しつつ、個別タイトルを差し込む例です。
useHead({
title: 'トップページ',
titleTemplate: (title) => title ? `${title} | My Nuxt Site` : 'My Nuxt Site'
})
3. SNSシェア用のOGPタグを動的に切り替える
ページごとにOGP画像や説明を変えたい場合に便利です。
useHead({
meta: [
{ property: 'og:title', content: 'ページタイトル' },
{ property: 'og:description', content: 'ページ説明' },
{ property: 'og:image', content: 'https://example.com/og-image.png' }
]
})
よくある落とし穴・注意点
SSRとCSRの違いによるHydration問題
useHeadはSSR時にサーバーでheadタグを生成し、クライアントでHydrationされます。サーバーとクライアントでheadの内容が異なると、Hydrationエラーや警告が発生することがあります。特に動的に変わる値は初期レンダリング時とクライアントで差異が出ないよう注意しましょう。
パフォーマンスへの影響
頻繁にuseHeadを呼び出して大量のhead更新を行うと、ブラウザのDOM操作コストが増えパフォーマンス低下の原因になります。必要なタイミングでのみ更新し、無駄な再レンダリングを避ける設計が望ましいです。
信頼できないデータの扱い
ユーザー入力や外部APIからのデータを直接useHeadに渡すとXSS攻撃のリスクがあります。そうした場合はuseHeadSafeを使い、サニタイズされた安全なデータのみを設定しましょう。
まとめ
useHeadはNuxtでSEOやメタ情報を柔軟に管理するための必須ツールです。動的なタイトルやメタタグの設定が簡単にでき、SPAのような動的ページでも効果的にSEO対策が可能になります。使い方を正しく理解し、SSR/CSRの違いやパフォーマンス面に注意しながら活用しましょう。信頼できないデータを扱う場合はuseHeadSafeの利用も検討してください。
NuxtのSEO強化やSNSシェア対応をより洗練させたい開発者にとって、useHeadは強力な味方となるでしょう。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/composables/use-head