Skip to content

Nuxt 3 笔记:SEO 与 Meta(元标记) #14

@cssmagic

Description

@cssmagic

全局 <head> 配置

nuxt.config.js 中,通过 app.head 字段可以自定义全局 <head> 内容。

如果需要使用全局的响应式数据,需要在 app.vue 中使用 useHead() 这个组合式函数。

interface MetaObject {
	title?: string
	titleTemplate?: string | ((title?: string) => string)
	base?: Base
	link?: Link[]
	meta?: Meta[]
	style?: Style[]
	script?: Script[]
	noscript?: Noscript[]
	htmlAttrs?: HtmlAttributes  // key/value 结构
	bodyAttrs?: BodyAttributes  // key/value 结构
}

useHead() 组合式函数

用来设置当前页面的 <head> 内的内容。

可以在组件的 setup 阶段和生命周期钩子里使用。

通过组件来配置 <head> 内容

看起来有点魔幻,Nuxt 定义了 <Html> <Head> <Body> <Meta> <Base> <Link> <Style> <NoScript> 等组件,并可以在组件内使用。当然他们的作用只是用来设置数据,并不会在组件内渲染出实际的元素。

感觉还是用 useHead() 组合式函数更直观一些。

技巧

titleTemplate

提供了更强的 title 控制能力。通常在 app.vue 设置 titleTemplate(可以是包含 %s 的字符串模板,也可以是一个函数),在页面组件中设置 title,最终 title 就是 titleTemplatetitle 处理的结果。

注意:在 nuxt.config 中设置 app.head.titleTemplate 无效。似乎 titleTemplate 只能用于 useHead() 中。

插入 <body>

useHead() 指定的标记也可以插入 <body> 的末尾,方法是补一个 body: true 的属性。通常可以用来在页面尾部添加一个 <script> 标签。

useHead({
	script: [
		{
			src: 'https://third-party-script.com',
			body: true,
		}
	]
})

definePageMeta() 配合

页面模板可以用 definePageMeta() 设置当前路由的信息,这些信息可以在 Layout 组件的 useHead() 里用 route.meta.xxxxx 取到。

优先级

titletitleTemplate 等 head 字段的生效优先级从高到低排列如下:

  1. 页面级模板
  2. Layout
  3. app.vue
  4. nuxt.configtitleTemplate 不生效)

类似 meta 这样的数组字段会在合并后生效,多个 <meta> 的排列顺序与上面的优先级顺序相反。

nuxt.config 中配置 title 有两个问题:

  • titleTemplate 不生效。
  • 不能使用 app config 中的数据。(无法使用 ``)

相关链接:

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions