SEO и Meta
Настройки по умолчанию
Из коробки Nuxt предоставляет осмысленные настройки по умолчанию, которые вы можете отменить при необходимости.
export default defineNuxtConfig({
  app: {
    head: {
      charset: 'utf-8',
      viewport: 'width=device-width, initial-scale=1',
    }
  }
})
Определение свойства app.head в вашем nuxt.config.ts позволяет вам настроить head для всего вашего приложения.
useHead() в app.vue.Для облегчения настройки доступны шорткаты: charset и viewport. Вы также можете указать любой из ключей, перечисленных ниже в Типах.
useHead
Композабл useHead позволяет программно и реактивно управлять тегами head с помощью функции Unhead.
Как и все композаблы, он может использоваться только с setup компонента и хуками жизненного цикла.
<script setup lang="ts">
useHead({
  title: 'Мое приложение',
  meta: [
    { name: 'description', content: 'Мой невероятный сайт.' }
  ],
  bodyAttrs: {
    class: 'test'
  },
  script: [ { innerHTML: 'console.log(\'Привет, мир!\')' } ]
})
</script>
Мы рекомендуем обратить внимание на useHead и useHeadSafe композаблы.
useSeoMeta
Композабл useSeoMeta позволяет определить SEO-мета-теги вашего сайта в виде плоского объекта с полной поддержкой TypeScript.
Это поможет вам избежать опечаток и распространенных ошибок, например, использования name вместо property.
<script setup lang="ts">
useSeoMeta({
  title: 'Мой невероятный сайт',
  ogTitle: 'Мой невероятный сайт',
  description: 'Это мой невероятный сайт, позвольте мне рассказать вам о нем.',
  ogDescription: 'Это мой невероятный сайт, позвольте мне рассказать вам о нем.',
  ogImage: 'https://example.com/image.png',
  twitterCard: 'summary_large_image',
})
</script>
Компоненты
Nuxt предоставляет компоненты <Title>, <Base>, <NoScript>, <Style>, <Meta>, <Link>, <Body>, <Html> и <Head>, чтобы вы могли напрямую взаимодействовать с мета-данными в шаблоне вашего компонента.
Поскольку имена этих компонентов соответствуют нативным элементам HTML, в шаблоне они должны быть написаны с заглавной буквы.
<Head> и <Body> могут принимать вложенные мета-теги (из эстетических соображений), но это не влияет на то, где именно вложенные мета-теги будут отображаться в конечном HTML.
<script setup lang="ts">
const title = ref('Привет, мир!')
</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>
Типы
Ниже приведены нереактивные типы, используемые для useHead, app.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.
Возможности
Реактивность
Реактивность поддерживается для всех свойств путем предоставления вычисляемого значения (computed), геттера или реактивного объекта.
<script setup lang="ts">
const description = ref('Мой невероятный сайт.')
useHead({
  meta: [
    { name: 'description', content: description }
  ],
})
</script>
Шаблон названия
Вы можете использовать опцию titleTemplate, чтобы предоставить динамический шаблон для настройки заголовка вашего сайта. Например, вы можете добавить название вашего сайта в заголовок каждой страницы.
titleTemplate может быть либо строкой, где %s заменяется на заголовок, либо функцией.
Если вы хотите использовать функцию (для полного контроля), то ее нельзя задавать в файле nuxt.config. Вместо этого рекомендуется задать ее в файле app.vue, где она будет применяться ко всем страницам вашего сайта:
<script setup lang="ts">
useHead({
  titleTemplate: (titleChunk) => {
    return titleChunk ? `${titleChunk} - Заголовок сайта` : 'Заголовок сайта';
  }
})
</script>
Теперь, если вы установите заголовок Моя страница с помощью useHead на другой странице вашего сайта, заголовок будет отображаться как 'Моя страница - Заголовок сайта' на вкладке браузера. Вы также можете передать null, чтобы по умолчанию отображался «Заголовок сайта».
Теги body
Вы можете использовать опцию tagPosition: 'bodyClose' для соответствующих тегов, чтобы добавить их в конец тега <body>.
Например:
<script setup lang="ts">
useHead({
  script: [
    {
      src: 'https://third-party-script.com',
      // допустимые варианты: 'head' | 'bodyClose' | 'bodyOpen'
      tagPosition: 'bodyClose'
    }
  ]
})
</script>
Примеры
Используя definePageMeta
В директории pages/ вы можете использовать definePageMeta вместе с useHead, чтобы установить мета-данные на основе текущего маршрута.
Например, сначала можно установить заголовок текущей страницы (он извлекается во время сборки с помощью макроса, поэтому не может быть установлен динамически):
<script setup lang="ts">
definePageMeta({
  title: 'Some Page'
})
</script>
А затем в файле лэйаута вы можете использовать мета-данные маршрута, которые вы установили ранее:
<script setup lang="ts">
const route = useRoute()
useHead({
  meta: [{ property: 'og:title', content: `Название приложения - ${route.meta.title}` }]
})
</script>
Динамический title
В примере ниже titleTemplate задается либо как строка с заполнителем %s, либо как функция, что позволяет более гибко устанавливать заголовок страницы динамически для каждого маршрута вашего приложения Nuxt:
<script setup lang="ts">
useHead({
  // в виде строки,
  // где `%s` заменяется на заголовок
  titleTemplate: '%s - Site Title',
})
</script>
<script setup lang="ts">
useHead({
  // или в виде функции
  titleTemplate: (productCategory) => {
    return productCategory
      ? `${productCategory} - Site Title`
      : 'Site Title'
  }
})
</script>
nuxt.config также используется в качестве альтернативного способа установки заголовка страницы. Однако nuxt.config не позволяет сделать заголовок страницы динамическим. Поэтому рекомендуется использовать titleTemplate в файле app.vue для добавления динамического заголовка, который затем применяется ко всем маршрутам вашего приложения Nuxt.
Внешний CSS
В примере ниже показано, как можно включить Google Fonts, используя свойство link композабла useHead или компонент <Link>:
<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>