SEO 与元数据

使用强大的头部配置、组合函数和组件来改善您的 Nuxt 应用的 SEO。

默认设置

开箱即用,Nuxt 提供了合理的默认设置,您可以根据需要覆盖这些设置。

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

在您的 nuxt.config.ts 中提供 app.head 属性可以让您为整个应用自定义头部。

此方法不允许您提供响应式数据。我们建议在 app.vue 中使用 useHead()

提供简化配置的快捷方式:charsetviewport。您还可以在 Types 中提供下列的任意关键字。

useHead

useHead 组合函数允许您以编程和响应式的方式管理您的头部标签, 由 Unhead 支持。

与所有组合函数一样,它只能在组件的 setup 和生命周期钩子中使用。

app.vue
<script setup lang="ts">
useHead
({
title
: '我的应用',
meta
: [
{
name
: 'description',
content
: '我的惊人网站。' }
],
bodyAttrs
: {
class
: 'test'
},
script
: [ {
innerHTML
: 'console.log(\'Hello world\')' } ]
}) </script>

我们建议您查看 useHeaduseHeadSafe 组合函数。

useSeoMeta

useSeoMeta 组合函数允许您将网站的 SEO 元数据标签定义为具有完全 TypeScript 支持的扁平对象。

这可以帮助您避免拼写错误和常见的错误,比如使用 name 而不是 property

app.vue
<script setup lang="ts">
useSeoMeta
({
title
: '我的神奇网站',
ogTitle
: '我的神奇网站',
description
: '这是我的神奇网站,让我给你介绍一切。',
ogDescription
: '这是我的神奇网站,让我给你介绍一切。',
ogImage
: 'https://example.com/image.png',
twitterCard
: 'summary_large_image',
}) </script>
Read more in Docs > API > Composables > 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('你好,世界')
</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 将标题设置为 我的页面,标题将在浏览器标签中显示为 '我的页面 - 网站标题'。您也可以传递 null 以默认为 '网站标题'。

主体标签

您可以在适用的标签上使用 tagPosition: 'bodyClose' 选项将其附加到 <body> 标签的末尾。

例如:

<script setup lang="ts">
useHead
({
script
: [
{
src
: 'https://third-party-script.com',
// 有效选项为: 'head' | 'bodyClose' | 'bodyOpen'
tagPosition
: 'bodyClose'
} ] }) </script>

示例

使用 definePageMeta

在您的 pages/ 目录 中,您可以使用 definePageMetauseHead 一起根据当前路由设置元数据。

例如,您可以首先设置当前页面标题(这是通过宏在构建时提取的,因此不能动态设置):

pages/some-page.vue
<script setup lang="ts">
definePageMeta
({
title
: '某个页面'
}) </script>

然后在您的布局文件中,您可以使用之前设置的路由元数据:

layouts/default.vue
<script setup lang="ts">
const 
route
=
useRoute
()
useHead
({
meta
: [{
property
: 'og:title',
content
: `应用名称 - ${
route
.
meta
.
title
}` }]
}) </script>
Read and edit a live example in Docs > Examples > Features > Meta Tags.
Read more in Docs > Guide > Directory Structure > Pages > #page Metadata.

动态标题

在下面的示例中,titleTemplate 被设置为字符串形式,使用 %s 占位符,或者作为函数,这允许为 Nuxt 应用中的每个路由动态设置页面标题:

app.vue
<script setup lang="ts">
useHead
({
// 作为字符串, // 其中 `%s` 被替换为标题
titleTemplate
: '%s - 网站标题',
}) </script>
app.vue
<script setup lang="ts">
useHead
({
// 或作为函数
titleTemplate
: (
productCategory
) => {
return productCategory ? `${
productCategory
} - 网站标题`
: '网站标题' } }) </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>