Nuxt3_2_SEO and Meta+Transitions

news2024/11/18 23:00:16

1. SEO and Meta

使用强大的head配置、可组合组件和组件来改善nuxt应用的SEO。

  • nuxt开箱即用,提供了相同的默认值,如果需要,你可以覆盖这些默认值。
    • charset: utf-8
    • viewport: width=device-width, initial-scale=1

可以在nuxt.config.ts中进行使用:

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  app: {
    head: {
      charset: 'utf-8',
      viewport: 'width=device-width, initial-scale=1'
    }
  }
})

在nuxt.config.js中提供app.head属性可以让你自定义整个应用的头部,这个方法不允许提供响应数据,建议在app.vue中使用useHead()方法。

1.1 useHead()

useHead可组合功能允许以编程式、响应式的方式管理head标记,由Unhead提供支持。
与所有组合式一样,他只能用于script setup中使用像生命周期hooks用法那样

index.vue

<script setup lang="ts">
useHead({
    title: '首页-感受nuxt魅力',
    meta: [
        {
            name: 'description',
            content: 'My nuxt meta use useHead'
        }
    ],
    bodyAttrs: {
        class: 'usehead_style'
    },
    script: [{
        innerHTML: 'console.log(\'Hello useHead nuxt page\')'
    }]
})
</script>
 
<style>
.usehead_style {
    background: #0189ff;
}
</style>
  • 我们之前在开发PC/M站时,在不同的页面总要展示不同的title等meta信息,此功能刚好适用。

1.2 useHeadSafe()

useHeadSafe事故useHead外部再进行一次包装,将输入限制为只允许安全的值输入。

useHeadSafe({
  script: [
    { id: 'xss-script', innerHTML: 'alert("xss")' }
  ],
  meta: [
    { 'http-equiv': 'refresh', content: '0;javascript:alert(1)' }
  ]
})

// Will safely generate
// <script id="xss-script"></script>
// <meta content="0;javascript:alert(1)">

但同样的代码放在useHead中,就可以完整的被执行,会有风险。

1.3 useSeoMeta 和 useServerSeoMeta

useSeoMeta和useServerSeoMeta组合式函数可以让你将网站的SEO 元标签定义成一个平面对象,并具有完整的typescript支持。这样可以避免拼写错误和常见错误,例如使用name 而不是 property。

  • 官方示例
<script setup lang="ts">
useSeoMeta({
  title: 'My Amazing Site',
  ogTitle: 'My Amazing Site',
  description: 'This is my amazing site, let me tell you all about it.',
  ogDescription: 'This is my amazing site, let me tell you all about it.',
  ogImage: 'https://example.com/image.png',
  twitterCard: 'summary_large_image',
})
</script>
  • 业务场景示例:若你有一个商品详情页面,不同的商品meta title是商品的名称,那么可以如下操作:
<script setup>
const route = useRoute();
const id = route?.params?.id || 0
const name = route?.query?.name || ''

const title = ref('')

onMounted(() => {
    title.value = name
})

useSeoMeta({
    title,
    description: () => `description: ${title.value}`
})
</script>

这样我们可以看到的效果是:当我们跳转至对应商品页面时,就会展示对应的title和description。

  • 像useSeoMeta一样,useServerSeoMeta让网站的SEO标签定义为具有完整typescript支持的平面对象。在大多数情况下,meta不需要响应,因为机器人只会扫描初始负载。因为,建议使用useServerSeoMeta作为一个以性能为重点的应用程序,它不会在客户机上做任何事情(或返回一个head对象),参数与useSeoMeta完全相同。

1.4 Components

1.4.1 介绍

  • nuxt提供了<Title>, <Base>, <NoScript>, <Style>, <Meta>, <Link>, <Body>, <Html>,<Head>组件,这样就可以直接与组件模板中的元数据进行交互。
  • 因为这些组件名与原生HTML元素相匹配,所以在模板中非常重要的第一点就是要记住大写。
  • <Head>和<Body>可以接受嵌套的元标签(出于美观的原因),但这对嵌套元标签在最终HTML中的呈现位置没有影响。

1.4.2 代码示例

<template>
    <div>
        <Head>
            <Title>{{ title }}</Title>
            <Meta name="description" :content="content"/>
            <Style type="text/css" children="body { background-color: green; }" ></Style>
        </Head>
    
        this is about pages
    </div>
</template>
<script setup lang="ts">
const title = ref('About 自定义title')
const content = ref('作者: Ably')
</script>

此时在about页面上,我们可以看到对应标签生效后的全部内容。例如:网页title变为了我们设置的’About 自定义title’,页面的整体背景颜色变为了绿色。

1.4.3 使用场景

在业务场景中的应用,我们可以全局设置整个应用的meta数据,形成一个整体的风格,但是在一些活动页面/介绍页面,可以有所不同,此时就可以在活动/介绍组件中,通过上述方式,对meta元数据进行自定义设置。

1.5 Types

下面是用于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;
}

1.6 特性(Features)

1.6.1 响应式(Reactivity)

  • 所有属性都支持响应式,例如computed、getter和reactive方式。
  • 建议使用getter (() => value)而不是computed(computed(() => value))。
<script setup lang="ts">
const description = ref('My amazing site.')

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

1.6.2 Title Template

  • 可以使用titleTemplate选项提供一个动态模板,用于自定义网站的标题。例如,将网站名称添加到每个页面标题中。
  • titleTemplate可以是字符串(其中%s)会被标题替换,也可以是函数
  • 如果你想使用一个函数(用于完全控制), 就不能再nuxt.config中设置,需要在app.vue中进行设置,这样会应用到网站上的所有页面。

app.vue中对于整个项目title的设置

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

如果在页面中设置过title,那么会在这个后面拼接上 Ably App, 否则直接展示 Ably App

在这里插入图片描述

1.6.3 Body Tags

可以在标签上使用tagPosition: 'bodyClose'选项,将他们附加到<body>标签的末尾

<script setup lang="ts">
useHead({
    titleTemplate: (titleChunk) => {
        return titleChunk ? `${titleChunk} - Ably App` : 'Ably App'
    },
    script: [
    {
      src: 'https://third-party-script.com',
      // valid options are: 'head' | 'bodyClose' | 'bodyOpen'
      tagPosition: 'bodyClose'
    }
  ]
})
</script>

例如,我们可以通过这种方式引入第三方库,或者插件。
在这里插入图片描述

1.7 Examples 官方示例

1.7.1 With 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: `App Name - ${route.meta.title}` }]
})
</script>

1.7.2 动态标题(Dynamic Title)

在下面的例子中,titleTemplate要么被设置为带有%s占位符的字符串,要么被设置为一个函数,这样可以更灵活地为nuxt应用的每个路由动态设置页面标题

<script setup lang="ts">
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>

1.7.3 内部CSS(External CSS)

下面的例子展示了如何使用useHead的link属性或使用< link >组件来启用Google Fonts:

- 方式一:Components方式

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





- 方式二: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>

2. Transitions

nuxt利用Vue的transition组件在页面和布局之间应用过渡动画

2.1 Page Transitions

可以启用页面转换对所有页面应用自动进行过渡

2.1.1 全局动画

  • 在nuxt.config.ts中配置过渡动画选项
export default defineNuxtConfig({
  app: {
    pageTransition: { name: 'page', mode: 'out-in' }
  },
})
  • 在app.vue中配置选项执行的动画效果
<style>
.page-enter-active,
.page-leave-active {
  transition: all 0.4s;
}
.page-enter-from,
.page-leave-to {
  opacity: 0;
  filter: blur(1rem);
}
</style>
  • 这样再次切换页面时,我们就可以看到生动的动画效果啦

效果视频审核中

2.1.2 局部动画

  • 要为页面设置不同的过渡,可以在页面的definePageMeta中设置pageTransition 键
  • 例如在About.vue中设置单独的页面效果
<script setup lang="ts">
definePageMeta({
  pageTransition: {
    name: 'rotate'   
  }
})
</script>

此时在app.vue中定义rotate动画效果

.rotate-enter-active,
.rotate-leave-active {
  transition: all 0.4s;
}
.rotate-enter-from,
.rotate-leave-to {
  opacity: 0;
  transform: rotate3d(1, 1, 1, 15deg);
}

这样去about页面,我们就可以看到最新的效果啦

2.1.3 动画设置

我们在定义动画时可以看到,无论是在nuxt.config.ts中定义pageTransition,还是在definePageMeta中定义pageTransition,都有一个name,是这个动画的名称。在定义动画时,与vue一样

  • [name]-enter-active、[name]-leave-active 设置动画属性及持续时间
  • [name]-enter-from、[name]-leave-to 设置动画变化效果

2.2 Layout transitions

2.2.1 全局layout动画

  • 参考官方示例,讲解layout布局使用,以及切换布局时的动画效果
  • layouts/default.vue 默认布局效果,与pages同级
<template>
    <div>
      <pre>default layout</pre>
      <slot />
    </div>
  </template>
  
  <style scoped>
  div {
    background-color: lightgreen;
  }
  </style>
  • layouts/orange.vue 橙色布局效果
<template>
    <div>
      <pre>orange layout</pre>
      <slot />
    </div>
  </template>
  
  <style scoped>
  div {
    background-color: #eebb90;
    padding: 20px;
    height: 100vh;
  }
  </style>
  • app.vue中,定义layout动画效果,以及在nuxtpage标签外包一层nuxtlayout
<template>
    <div>
        <NuxtLayout>
            <NuxtPage />
        </NuxtLayout>
    </div>
</template>

<style>
	.layout-enter-active,
	.layout-leave-active {
	  transition: all 0.4s;
	}
	.layout-enter-from,
	.layout-leave-to {
	  filter: grayscale(1);
	}
</style>
  • nuxt.config.ts中配置 layout动画
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  app: {
    head: {
      title: '默认标题',
      charset: 'utf-8',
      viewport: 'width=device-width, initial-scale=1'
    },
    pageTransition: { // page动画效果
      name: 'page',
      mode: 'out-in'
    },
    layoutTransition: { // layout动画效果
      name: 'layout',
      mode: 'out-in'
     }
  }
})

2.2.2 局部layout动画

  • 当我们需要某个页面,例如about.vue页面使用orange布局时,可以在about.vue页面中设置
definePageMeta({
  layout: 'orange'
})

这样,在切换页面时,使用不同布局的页面,就会有不同的动画效果,可以通过这种方式设置切换整体app风格。

2.2.3 动画设置

  • 全局动画效果配置,可以在nuxt.config.ts中app下面进行配置pageTransition、layoutTransition,全部生效
  • 当有自定义动画时,可以在页面中通过definePageMeta下面进行配置pageTransition、layoutTransition,局部页面生效
  • pageTransition、layoutTransition 参数
    • mode 动画进出方式: out-in
    • name 动画名称,用于在css中定义动画
  • 动画可以关闭,若配置,那么pageTransition、layoutTransition是上述定义的对象,若关闭,这两个值为false即可禁用

2.3 JavaScript Hooks

对于高级用例,可以使用JavaScript hooks钩子为nuxt页面创建高度动态和自定义的过渡动画。这种方式为JavaScript动画库(GSAP或Tween.js)提供了完美的用例。

<script setup lang="ts">
definePageMeta({
  pageTransition: {
    name: 'custom-flip',
    mode: 'out-in',
    onBeforeEnter: (el) => {
      console.log('Before enter...')
    },
    onEnter: (el, done) => {},
    onAfterEnter: (el) => {}
  }
})
</script>

2.4 动态过渡动画

  • 定义layouts/default.vue页面及内容:
<script setup lang="ts">
const route = useRoute()
const id = computed(() => Number(route.params.id || 1))
const prev = computed(() => '/' + (id.value - 1))
const next = computed(() => '/' + (id.value + 1))
</script>

<template>
  <div>
    <slot />
    <div v-if="$route.params.id">
      <NuxtLink :to="prev">⬅️</NuxtLink> |
      <NuxtLink :to="next">➡️</NuxtLink>
    </div>
  </div>
</template>

点击按钮,切换到前一个page 或 后一个page

  • pages/[id].vue 动态公共页面及相关页面内容
<script setup lang="ts">
definePageMeta({
  pageTransition: {
    name: 'slide-right',
    mode: 'out-in'
  },
  middleware (to, from) {
    to.meta.pageTransition.name = +to.params.id > +from.params.id ? 'slide-left' : 'slide-right'
  }
})
</script>

<template>
  <h1>#{{ $route.params.id }}</h1>
</template>
<style>
.slide-left-enter-active,
.slide-left-leave-active,
.slide-right-enter-active,
.slide-right-leave-active {
  transition: all 0.2s;
}
.slide-left-enter-from {
  opacity: 0;
  transform: translate(50px, 0);
}
.slide-left-leave-to {
  opacity: 0;
  transform: translate(-50px, 0);
}
.slide-right-enter-from {
  opacity: 0;
  transform: translate(-50px, 0);
}
.slide-right-leave-to {
  opacity: 0;
  transform: translate(50px, 0);
}
</style>

加上动画效果后,与轮播组件一样流畅完整。

2.5 在<NuxtPage />中增加transition动画

<NuxtPage />在app.vue中使用时,transition-props可以直接作为组件props传递来激活全局转换。

<template>
  <div>
    <NuxtLayout>
      <NuxtPage :transition="{
        name: 'bounce',
        mode: 'out-in'
      }" />
    </NuxtLayout>
  </div>
</template>

如果有用,点个赞呗~

总结用法,希望可以帮助到你,
我是Ably,你无须超越谁,只要超越昨天的自己就好~

官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/956082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3D 连接 SQLite 作为数据库基础功能【详细图文教程】

一、简单介绍一下SQLite的优势&#xff08;来自ChatGPT&#xff09; 轻量级: SQLite是一个嵌入式数据库引擎&#xff0c;它的库文件非常小巧&#xff0c;没有独立的服务器进程&#xff0c;适用于嵌入到其他应用程序中&#xff0c;对于轻量级的项目或移动应用程序非常适用。零配…

云原生Kubernetes:K8S概述

目录 一、理论 1.云原生 2.K8S 3.k8s集群架构与组件 二、总结 一、理论 1.云原生 &#xff08;1&#xff09;概念 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展&#xff0c;适用于各种不同的云平台。 如果…

执行公开网数据采集-技术人员撤退

首先逼逼&#xff0c;此贴仅为秀肌肉&#xff0c;技术人员想学习的话可以绕道了 打开控制台&#xff0c;看cookie&#xff0c;ST&#xff0c;某数 第一个请求412&#xff0c;看VM 然后就是替换js&#xff0c;hook&#xff0c;之类的&#xff0c;扣代码流程&#xff0c;此处省…

C语言:函数原型声明时的参数列表

相关阅读 C语言专栏https://blog.csdn.net/weixin_45791458/category_12423166.html 在C语言中&#xff0c;使用函数前&#xff0c;要么对函数进行了定义&#xff0c;要么对函数原型进行了声明&#xff0c;ANSI C形式的函数原型声明形式如下&#xff1a; void show(char ch, …

nvm use node版本无效问题

没想到使用nvm还折腾一上午&#xff0c;安装nvm 1.1之后&#xff0c;发现 nvm install 16.20.2 nvm use 16.20.2 之后&#xff0c;node -v 根本不生效&#xff0c;找了很久发现少设置了一些变量&#xff0c;可以参考如下前人经验&#xff1a;nvm use 命令失效 - 简书 (jians…

成都优优聚优质美团服务机构!

成都优优聚是一家专业的美团代运营服务机构&#xff0c;其优秀的团队和丰富的经验使其成为了众多商家的首选合作伙伴。下面就让我们一起来了解一下成都优优聚做美团代运营的优势和特点。 首先&#xff0c;成都优优聚拥有一支专业高效的运营团队。团队成员均具备丰富的美团运营经…

2022年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;数字变换 给定一个包含 5 个数字&#xff08;0-9&#xff09;的字符串&#xff0c; 例如 “02943”&#xff0c; 请将“12345”变换到它。 你可以采取 3 种操作进行变换 &#xff08;1&#xff09;交换相邻的两个数字 &#xff08;2&#xff09;将一个数字加 …

ssm学生公寓管理系统的设计与实现

ssm学生公寓管理系统的设计与实现106 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归…

d3dcompiler_43.dll丢失怎么修复,分享几种修复d3dcompiler_43.dll的方法

不少人可能看到d3dcompiler_43.dll这个文件会感觉到陌生&#xff0c;是的&#xff0c;因为这个文件一般来说是很少丢失的&#xff0c;但是还是会出现d3dcompiler_43.dll丢失的情况的&#xff0c;今天主要是来给大家详细的说说d3dcompiler_43.dll丢失怎么修复的相关方法。 一.分…

Python Flask Web开发二:数据库创建和使用

前言 数据库在 Web 开发中起着至关重要的作用。它不仅提供了数据的持久化存储和管理功能&#xff0c;还支持数据的关联和连接&#xff0c;保证数据的一致性和安全性。通过合理地设计和使用数据库&#xff0c;开发人员可以构建强大、可靠的 Web 应用程序&#xff0c;满足用户的…

SpringBoot 2.7 集成 Netty 4 实现 UDP 通讯

文章目录 1 摘要2 核心 Maven 依赖3 核心代码3.1 服务端事务处理器(DemoUdpNettyServerHandler)3.2 服务端连接类(InitUdpNettyServer)3.3 客户端事务处理类(DemoUdpNettyClientHandler)3.4 客户端连接类(DemoUdpNettyClient) 4 高并发性能配置5 推荐参考资料6 Github 源码 1 摘…

ROLL.DBF回滚表空间增长问题(达梦数据库)

达梦数据库 - 回滚表空间增长问题 环境介绍1 环境搭建1.1 创建表与测试数据1.2 查询待提交的数据量1.3 查询回滚表空间使用情况1.3.1 插入数据前查询结果1.3.2 插入数据后未提交事务查询结果1.3.3 插入数据后提交事务查询结果 环境介绍 达梦数据库ROLL.DBF 在某些业务系统厂商…

防破解暗桩思路:检查菜单是否被非法修改过源码

本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》&#xff08;www.518cj.net&#xff09;的时候&#xff0c;为了防止被破解&#xff0c;需用添加一些暗桩&#xff0c;在合适的时机检查软件是否被非法修改过&#xff0c;如果被非法修改就做出提…

【位运算】位运算常用技巧总结

目录 前言 一.常见的小问题 1.给定一个数n,确定它的二进制表示中的第x位是0还是1 2.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成1 3.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成0 4.给定一个数n&#xff0c;提取它的二进制表示中最右侧的1&…

AUTOSAR开发工具DaVinci Configurator里的Modules

DaVinci Configurator 里面有个Module这个概念。 如你所想&#xff0c;基本上跟AUTOSAR架构里面的Module相对应 从软件的Project菜单中的Basic Editor项可以打开 打开这个菜单后&#xff0c;会看到很多Modules项以及其相关配置项 这个Basic Editor显示出整个ECU配置中的所有…

Windows 安装 RabbitMq

Windows 上安装 RabbitMQ 的步骤 RabbitMQ 是一个强大的开源消息队列系统&#xff0c;广泛用于构建分布式、可扩展的应用程序。本教程将带您一步一步完成在 Windows 系统上安装 RabbitMQ 的过程。无需担心&#xff0c;即使您是初学者&#xff0c;也能够轻松跟随这些简单的步骤…

element-plus 设置 el-date-picker 弹出框位置

前言 概述&#xff1a;el-date-picker 组件会自动根据空间范围进行选择比较好的弹出位置&#xff0c;但特定情况下&#xff0c;它自动计算出的弹出位置并不符合我们的实际需求&#xff0c;故需要我们手动设置。 存在的问题&#xff1a;element-plus 中 el-date-picker 文档中并…

渗透测试漏洞原理之---【任意文件包含漏洞】

文章目录 1、文件包含概述1.1 文件包含语句1.1.1、相关配置 1.2、动态包含1.2.1、示例代码1.2.2、本地文件包含1.2.3、远程文件包含 1.3、漏洞原理1.3.1、特点 2、文件包含攻防2.1、利用方法2.1.1、包含图片木马2.1.2、读取敏感文件2.1.3、读取PHP文件源码2.1.4、执行PHP命令2.…

mybatisPlus多数据源方案

背景 在微服务李娜一般一个服务只有一个数据源&#xff0c;但是在有的老项目或者一些特定场景需要多数据源链接不同的数据库&#xff0c;本文以mybatisPlus为基础给出解决方案 多数据源场景分类 情形一&#xff1a;项目启动就确定了情形一&#xff1a;一些sass系统里面动态确…