nuxt3-SEO篇

nuxt3-SEO篇

通过Nuxt提供的强大的head config,组合式函数和组件来提升你的网站的的SEO。

App Head

nuxt.config.ts配置文件中,可以通过app.head属性来定制化你的网站的head信息。

::: alertinfo
这种方式并不支持响应式数据。如果你需要全局的响应式数据的话,你可以在app.vue中使用useHead接口
:::

对于下列的头部信息,nuxt提供了默认值,没有特殊需要,你没必须自己设置。 当然有必须的话,你也可以自己更改这此信息。

export default defineNuxtConfig({
  app: {
    head: {
      charset: 'utf-16',
      viewport: 'width=500, initial-scale=1',
      title: 'My App',
      meta: [
        // <meta name="description" content="My amazing site">
        { name: 'description', content: 'My amazing site.' }
      ],
    }
  }
})

组合式函数: useHead

使用useHead可以管理你项目中的head中的标签。这种方式更灵活,支持响应式的设置。Nuxt内部是使用@vueuse/head来实现此功能的。
和所有的其它组合式函数样,你只能在组件中的setup和生命周期中的钩子中使用此接口。

示例:

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

组件

Nuxt提供了<Title>, <Base>,<NoScript>,<Meta>, <Link>,<Body>,<Html><Head>等组件让你在组件中方便的设置和更改你项目中的metadata。

由于这些组件名与原生的HTML中的一些元素一样,所以你在template中使用时,一定要注意大写。

<Head><Body>可以内部包含元标签(meta tags)。但对最终渲染成的HTML中的嵌套元标签没有什么影响 。
示例:

<script setup>
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; }" />
    </Head>

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

类型

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;
}

你可以在useHead, app.head和组件中使用上面这么类型的元数据。

特色

响应式

所有的属性都是支持响应式的。你可以使用refsreactive来设置和修改这些属性。
例如:

<!-- 使用useHead -->
<script setup lang="ts">
const desc = ref('My amazing site.')

useHead({
  meta: [
    { name: 'description', content: desc }
  ],
})
</script>

使用组件

<script setup>
const desc = ref('My amazing site.')
</script>
<template>
<div>
  <Meta name="description" :content="desc" />
</div>
</template>

标题模板

你可以使用titleTemplate这个可选项,这个可以提供一个动态的模板来定制化你的网站的标题。例如给每个页面的头部添加网站名。
titleTemplate可以是一个字符串,字符串中的%s可以被标题替换。 也可以是一个函数。
如果你想使用函数,那你就不能在nuxt.config配置文件中去设置了,推荐在app.vue文件中去设置,这样就可以将此模板应用到全部页面了。

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

Body 标签

你可以在linkscript元标签中添加body: true可选项,这样这些元标签就将被添加到<body>标签的最后面。
例如:

<script setup lang="ts">
useHead({
  script: [
    {
      src: 'https://third-party-script.com',
      body: true
    }
  ]
})
</script>

示例

definePageMeta使用示例

在你的page/目录下,你可以基于当前路由使用definePageMeta来设置元信息。

例如:

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

这些信息会在项目的构建编译阶段被提取,你不能动态设置这些信息。

通过上面的设置后,你就就可以在布局文件中使用这些路由信息了。

<!-- layouts/default.vue -->
<script setup>
const route = useRoute()

useHead({
  meta: [{ property: 'og:title', content: `App Name - ${route.meta.title}` }]
})
</script>

添加动态标题

使用titleTemplate添加动态的标题

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

添加外部的CSS

<!-- 使用useHead -->
<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>
<!-- 使用组件的方式 -->
<template>
<div>
  <Link rel="preconnect" href="https://fonts.googleapis.com" />
  <Link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" crossorigin="" />
</div>
</template>




版权声明:本文为凸然网站的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:nuxt3-SEO篇

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 我之前的一篇文章,《Vue-cli3基于webpack + prerender-spa-plugin + vue-...
    颂温暖阅读 7,916评论 3 13
  • 初始化 使用脚手架工具 create-nuxt-app 快速创建 npx create-nuxt-app <项目名...
    大月山阅读 1,060评论 0 3
  • vue-meta 简介vue-meta是HTML的元数据的管理工具Nuxt.js内置的库vue-meta[http...
    quanCN阅读 3,034评论 0 0
  • 目录结构 资源目录assets 资源目录assets用于组织未编译的静态资源如LESS、SASS或JavaScri...
    A郑家庆阅读 3,969评论 0 0
  • 众所周知,Vue SPA单页面应用对SEO不友好,当然也有相应的解决方案。 服务端渲染 (SSR) 就是常用的一种...
    明么阅读 972评论 0 1