Nuxt Nationカンファレンス開催!11月12日〜13日

SEOとメタ情報

強力なhead設定、コンポーザブル、コンポーネントを使用して、NuxtアプリのSEOを改善します。

デフォルト

Nuxtは、必要に応じて上書きできる適切なデフォルトを提供します。

nuxt.config.ts
export default 
defineNuxtConfig
({
app
: {
head
: {
charset
: 'utf-8',
viewport
: 'width=device-width, initial-scale=1',
} } })

app.headプロパティをnuxt.config.tsに指定すると、アプリケーション全体のheadをカスタマイズできます。

この方法は、リアクティブデータを提供できません。useHead()app.vueで使用することをお勧めします。

設定を容易にするためのショートカットがあります。charsetviewportです。にリストされているキーも使用できます。

useHead

useHeadコンポーザブル関数は、Unheadによって実現された、headタグをプログラム的に、そしてリアクティブに管理できます。

すべてのコンポーザブルと同様に、コンポーネントのsetupとライフサイクルフックでのみ使用できます。

app.vue
<script setup lang="ts">
useHead
({
title
: 'My App',
meta
: [
{
name
: 'description',
content
: 'My amazing site.' }
],
bodyAttrs
: {
class
: 'test'
},
script
: [ {
innerHTML
: 'console.log(\'Hello world\')' } ]
}) </script>

useHeaduseHeadSafeコンポーザブルを確認することをお勧めします。

useSeoMeta

useSeoMetaコンポーザブルを使用すると、完全なTypeScriptサポートで、サイトのSEOメタタグをフラットオブジェクトとして定義できます。

これにより、タイプミスやnamepropertyと間違えるといった一般的なミスを防ぐことができます。

app.vue
<script setup lang="ts">
useSeoMeta
({
title
: 'My Amazing Site',
ogTitle
: 'My Amazing Site',
description
: 'This is my amazing site, let me tell you all about it.',
ogDescription
: 'This is my amazing site, let me tell you all about it.',
ogImage
: 'https://example.com/image.png',
twitterCard
: 'summary_large_image',
}) </script>
詳細はドキュメント > API > コンポーザブル > Use Seo Metaをご覧ください。

コンポーネント

Nuxtは、<Title><Base><NoScript><Style><Meta><Link><Body><Html><Head>コンポーネントを提供しており、コンポーネントのテンプレート内でメタデータと直接やり取りできます。

これらのコンポーネント名はネイティブのHTML要素と一致するため、テンプレートでは大文字にする必要があります。

<Head><Body>はネストされたメタタグを受け入れることができます(見た目の理由から)が、これはネストされたメタタグが最終的なHTMLでレンダリングされる場所には影響しません。

app.vue
<script setup lang="ts">
const title = ref('Hello World')
</script>

<template>
  <div>
    <Head>
      <Title>{{ title }}</Title>
      <Meta name="description" :content="title" />
      <Style type="text/css" children="body { background-color: green; }" ></Style>
    </Head>

    <h1>{{ title }}</h1>
  </div>
</template>

useHeadapp.head、コンポーネントで使用される非リアクティブ型を以下に示します。

interface MetaObject {
  title?: string
  titleTemplate?: string | ((title?: string) => string)
  templateParams?: Record<string, string | Record<string, string>>
  base?: Base
  link?: Link[]
  meta?: Meta[]
  style?: Style[]
  script?: Script[]
  noscript?: Noscript[];
  htmlAttrs?: HtmlAttributes;
  bodyAttrs?: BodyAttributes;
}

より詳細な型については、@unhead/schemaを参照してください。

機能

リアクティビティ

計算済み値、ゲッター、またはリアクティブオブジェクトを提供することで、すべてのプロパティでリアクティビティがサポートされます。

<script setup lang="ts">
const 
description
=
ref
('My amazing site.')
useHead
({
meta
: [
{
name
: 'description',
content
:
description
}
], }) </script>

タイトルテンプレート

titleTemplateオプションを使用して、サイトのタイトルをカスタマイズするための動的なテンプレートを提供できます。たとえば、すべてのページのタイトルにサイトの名前を追加できます。

titleTemplateは、%sがタイトルに置き換えられる文字列、または関数にすることができます。

関数を使用する場合(完全な制御のため)、nuxt.configでは設定できません。app.vueファイル内で設定することをお勧めします。そうすることで、サイトのすべてのページに適用されます。

<script setup lang="ts">
useHead
({
titleTemplate
: (
titleChunk
) => {
return
titleChunk
? `${
titleChunk
} - Site Title` : 'Site Title';
} }) </script>

ここで、サイトの別のページでuseHeadを使用してタイトルをMy Pageに設定すると、ブラウザのタブには「My Page - Site Title」と表示されます。nullを渡して「Site Title」にデフォルトすることもできます。

ボディタグ

該当するタグでtagPosition: 'bodyClose'オプションを使用すると、<body>タグの最後に追加できます。

例:

<script setup lang="ts">
useHead
({
script
: [
{
src
: 'https://third-party-script.com',
// valid options are: 'head' | 'bodyClose' | 'bodyOpen'
tagPosition
: 'bodyClose'
} ] }) </script>

definePageMetaを使用

pages/ディレクトリ内では、definePageMetauseHeadを使用して、現在のルートに基づいてメタデータを設定できます。

たとえば、まず現在のページタイトルを設定できます(これはマクロを介してビルド時に抽出されるため、動的に設定することはできません)。

pages/some-page.vue
<script setup lang="ts">
definePageMeta
({
title
: 'Some Page'
}) </script>

次に、レイアウトファイルで、前に設定したルートのメタデータを使用できます。

layouts/default.vue
<script setup lang="ts">
const 
route
=
useRoute
()
useHead
({
meta
: [{
property
: 'og:title',
content
: `App Name - ${
route
.
meta
.
title
}` }]
}) </script>
ドキュメント > 例 > 機能 > メタタグでライブ例を参照、編集できます。
詳細はドキュメント > ガイド > ディレクトリ構造 > ページ > #ページメタデータをご覧ください。

動的なタイトル

以下の例では、titleTemplate%sプレースホルダーを含む文字列、または関数として設定されます。これにより、Nuxtアプリの各ルートのページタイトルを動的に設定する柔軟性が向上します。

app.vue
<script setup lang="ts">
useHead
({
// as a string, // where `%s` is replaced with the title
titleTemplate
: '%s - Site Title',
}) </script>
app.vue
<script setup lang="ts">
useHead
({
// or as a function
titleTemplate
: (
productCategory
) => {
return productCategory ? `${
productCategory
} - Site Title`
: 'Site Title' } }) </script>

nuxt.configも、ページタイトルを設定する代替方法として使用されます。ただし、nuxt.configではページタイトルを動的にすることはできません。そのため、app.vueファイルでtitleTemplateを使用して動的なタイトルを追加し、それをNuxtアプリのすべてのルートに適用することをお勧めします。

外部CSS

以下の例は、useHeadコンポーザブルのlinkプロパティを使用するか、<Link>コンポーネントを使用するかによって、Googleフォントを有効にする方法を示しています。

<script setup lang="ts">
useHead
({
link
: [
{
rel
: 'preconnect',
href
: 'https://fonts.googleapis.com'
}, {
rel
: 'stylesheet',
href
: 'https://fonts.googleapis.com/css2?family=Roboto&display=swap',
crossorigin
: ''
} ] }) </script>