Nuxt初心者がtitle設定でよくやる「%s」などの3つの間違い

Nuxt初心者に多いtitle設定の間違い

NuxtでWebサイトを制作しているとページごとにtitleを変更したり、サイト名をタイトルの末尾に追加したりする機会があります。

Nuxt初心者の場合、titleの設定方法を間違えて正しく設定できていないケースがあります。

この記事ではNuxtでtitleを設定するときによくある3つの間違いを紹介します。

1. useHeadでtitleだけ使用する

以下のようにuseHeadでtitleを指定すれば、titleが「マイページ | 株式会社サンプル」になります。

mypage.vue
<script setup lang="ts">
useHead({
	title: 'マイページ | サイトタイトル'
})
</script>

しかし、このようにtitleに設定すると「| サイトタイトル」を必ず記載しなければならなくなるため、手間や記述ミスが増える原因になります。

2. titleTemplateで%sを使用する

app.vueのtitleTemplateで%sを使用すると、ほかのページでuseHeadにtitleが設定されている場合はtitleが「マイページ | サイトタイトル」になります。

app.vue
<script setup lang="ts">
useHead({
  titleTemplate: '%s | サイトタイトル'
})
</script>
mypage.vue
<script setup lang="ts">
useHead({
	title: 'マイページ'
})
</script>

しかし、これだとトップページが「| サイトタイトル」になってしまいます。

トップページの場合はtitleに「サイトタイトル」だけが表示されるのが一般的なので、これでは実装できません。

3. Nuxt公式サイトのコードを使用する

Nuxt公式サイトのドキュメントにはtitleTemplateを使用した以下のコードが記載されています。

app.vue
<script setup lang="ts">
useHead({
  // or as a function
  titleTemplate: (productCategory) => {
    return productCategory
      ? `${productCategory} - Site Title`
      : 'Site Title'
  },
})
</script>

Nuxt公式サイトに記載されているコードなので正しいように見えますが、「TypeScriptなのに型が書かれていない」「Site Title」の文字列が2回記載されています。

以下のように型を付けて、サイトタイトルを定数として定義するほうが安全ですので、こちらのコードを使用することを推奨します。

app.vue
<script setup lang="ts">
useHead({
  titleTemplate: (pageTitle?: string): string => {
    const SITE_TITLE = 'サイトタイトル'
    return pageTitle ? `${pageTitle} | ${SITE_TITLE}` : SITE_TITLE
  }
})
</script>