阅读视图

发现新文章,点击刷新页面。

Nuxt3 与官网 SEO:从 TDK 配置到搜索引擎收录

本文适合 SEO 初学者快速上手 Nuxt3 项目的搜索引擎优化

使用 nuxt3(本文写于一年前) 做了个官网, 第一次做官网也没啥经验一切都是摸着石头过河! 开发完成后做了一些 SEO 的相关的优化,这里做一个记录

如果之前做过网站的 seo 那这篇文章对你可能没什么帮助,因为这里的目标是 谷歌、必应 搜索框输入指定关键字,可以被搜索到。

为什么使用 nuxt3?

  1. 支持服务端渲染(SSR)
  2. 支持静态站点生成(SSG)
  3. 自动生成 <meta> 标签
  4. 提供开箱即用的 SEO 优化工具
  5. 支持预渲染(Prerendering)

seo 绕不开的 TDK

TDK 分别对应标题(Title)、描述(Description)和关键词(Keywords)

  • <title>标签包含了网页的标题和主要关键词。
  • <meta name="description">标签提供了网页的描述。
  • <meta name="keywords">标签列出了相关的关键词。

这些元素对于搜索引擎优化(SEO)非常重要它们帮助搜索引擎理解网页的内容,并影响搜索结果中的显示。

一个简单的🌰

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>网页标题 - 主要关键词</title>
    <meta name="description" content="这是一个关于主要关键词的网页描述。">
    <meta name="keywords" content="主要关键词, 相关关键词, 其他关键词">
</head>
<body>
    <h1>欢迎访问</h1>
    <p>这里是我们关于主要关键词的内容。</p>
</body>
</html>

nuxt3 中如何设置 TDK

nuxt.config.ts 文件中进行配置

nuxt 3.15 不支持直接在 app 配置 seoMeta 改为在 app.vue 中使用 useSeoMeta 实现

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  app: {
    head: {
      title: '爱中文',
      titleTemplate: '%s',
      meta: [
        { name: 'keywords', content: '爱中文' },
        { name: 'keywords', content: '上海爱中文数字' },
        { name: 'keywords', content: '中文教育' },
        { name: 'keywords', content: '国际中文智慧教育品牌' },
        { name: 'keywords', content: '智慧教育解决方案' },
      ],
    },
  },
})

在 app.vue 中配置 seoMeta

useSeoMeta({
  title: '上海爱中文数字信息技术有限公司',
  description: '上海爱中文数字信息技术有限公司,作为一家国际中文智慧教育企业,我们致力于成为“知识服务提供商与学习技术领导者”。依托先进的数字教育技术与深厚的教学设计实力,我们携手全球中文教育领域的专家,汇聚优质中文教学资源,创新探索适应不同地域特色的海外中文学习新范式。',
})

配置完渲染出来大概是这样

image.png

上边的配置中 title 字段十分重要直接影响搜索结果

这里提一下 titleTemplate: '%s' 这样写渲染后的 title 字段会原样渲染

image.png

如果去除 titleTemplate: '%s' 则会显示,把 package.json 文件的 name 字段拼接在后边这不是咱想要的

image.png

可能你还想为每个页面单独设置

这当然是可以的而且也很简单使用内置的 useHead 或者 useSeoMeta 即可

两者看情况使用或结合一起使用

useHead

image.png

useSeoMeta

image.png

nuxt seo 利器

nuxt3 提供对应的解决方案直接引入 @nuxtjs/seo 即可,号称是 Nuxt 的完整 SEO 解决方案。

image.png

SEO 小白狂喜

image.png

该有的都有了,这里只看 sitemap.xml、robots.txt

sitemap.xml

开发环境会比线上环境多一些调试信息

线上环境 https://xxxx/sitemap.xml

image.png

开发环境 http://localhost:3000/sitemap.xml

image.png

robots.txt

线上生成的文件与本地有一定区别线上全部允许、本地全部不允许

线上环境 https://xxxx/robots.txt

image.png

开发环境 http://localhost:3000/robots.txt

image.png

自动生成 OgImage

猛击查看官网文档

defineOgImageComponent('NuxtSeo', {
  title: '全球中文教育领导者 👋',
  description: '我们携手全球中文教育领域的专家,汇聚优质中文教学资源,创新探索适应不同地域特色的海外中文学习新范式。',
  theme: '#C74043',
  colorMode: 'dark',
  siteLogo: '/img/logo/logo1.jpg', // public 目录
})

中文需要配置字体,修改 nuxt.config.ts

ogImage: {
  googleFontMirror: true, // 开启谷歌字体景象-不挂代理感觉很难下载
  fonts: [
    'Noto+Sans+SC:400',
  ],
},

使用本地字体 本地字体文件必须是 .otf 、 ttf 、 .woff ,并且位于 public 目录内。

ogImage: {
  fonts: [
    {
      name: 'AlibabaPuHuiTi',
      weight: 500,
      path: '/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi-3-65-Medium.woff',
    },
  ],
},

image.png

如何在 谷歌、必应 中可以被搜索到呢?

通过各大搜索引擎提供的站点工具提交网站,可以加快网站被索引的速度

谷歌

猛击访问

image.png

添加站点时是会验证所有权,选择一种验证即可

image.png

image.png

检查下网址是否被收录,只有被收录才可以搜索到

image.png

提交下站点地图

image.png

然后等着被收录就好了,快的话 48 小时,慢的话一个周左右

必应

猛击进入必应站点管理员页面

必应可以直接拉取谷歌已验证的站点,使用谷歌登录即可!

image.png

提交下网站地图

image.png

把网站地图的网址这里在提交一次(感觉会有点用)

image.png

然后等收录,快的话48小时,慢的话一个周左右

最终结果

谷歌搜索有时会靠前有时会靠后🤪

image.png

image.png

必应搜索

image.png

总结

本文从实战角度出发,系统介绍了 Nuxt3 网站的 SEO 优化方案:

  1. TDK 配置:通过 nuxt.config.ts 和 useSeoMeta 设置标题、描述、关键词
  2. SEO 工具:使用 @nuxtjs/seo 自动生成 sitemap.xml、robots.txt 和 OgImage
  3. 搜索引擎收录:通过 Google Search Console 和 Bing Webmasters 提交站点地图,完成网站收录

优化使用 Nuxt3 开发的官网首页,秒开!

一年前接了个官网的开发的活(这个文章其实也写了一年了!),使用 nuxt3 进行开发,使用 SSG 模式即执行 nuxt generate 后将产物进行部署

测试环境: mac m1 16、 谷歌 136

开发部署完成后客户反应说打开速度有点慢,实际测试了下发现确实有点慢,直接看图

image.png

在无痕模式禁用缓存的情况需要近 20 多秒才能加载完成,它不正常!

再来看下优化后的加载情况

image.png

一秒内!几乎是秒开了,那我都干了什么呢?

开启 http 2.0

让 gpt 先做个总结

特性 HTTP/1.1 HTTP/2.0
协议格式 文本格式 二进制格式
多路复用 不支持,一个连接一次只处理一个请求 支持,一个连接可同时处理多个请求
头部压缩 无(头部冗余较多) 使用 HPACK 进行头部压缩
服务器推送 不支持 支持,服务器可主动推送资源
连接复用 多个请求需多个 TCP 连接或排队 所有请求共享一个 TCP 连接
队头阻塞(HOL) 存在,阻塞严重 解决,通过帧分片并异步处理
加密(TLS) 可选 可选(多数实现默认启用)

还有一个很重要的点是 同一域名下的并发连接数限制 http 1.1 是最多 6个, http 2.0 则是所有请求复用单一连接,通过多路复用并发处理,效率更高

开启 gzip

nuxt3 貌似并没有提供 gzip 压缩的相关操作,这个项目使用 docker 部署在镜像 nginx 中配置了 gzip 压缩

image.png

调试面板这样显示表示 gzip 配置成功!

使用 NuxtPicture 优化图片加载

<NuxtPicture
  format="avif,webp"
  :src="getImg('/about/banner.png')"
  :alt="$t('about.title')"
  :img-attrs="{ style: 'width: 100%' }"
  width="1920"
  height="578"
  placeholder
  loading="lazy"
/>

loading img 原生属性图片可见时加载

format 响应式图片加载,单从图片压缩后大小来看 avif < webp < jpg < png 这里是如果浏览器支持 avif or webp 就使用 否则使用原始图片也就是 src 设置的图片

响应式图片加载

这里以首页封面图为例

<picture>
  <source type="image/avif" srcset="home/banner.avif">
  <source type="image/webp" srcset="home/banner.webp">
  <img src="home/banner.png" alt="用中文链接世界"class="w-full">
</picture>
  1. <picture> 元素:用于为不同的设备或浏览器条件提供不同的图片资源。
  2. <source> 标签:指定不同格式的图片(如 AVIF、WebP)。
  3. 降级加载(Fallback) :如果浏览器不支持 AVIF,会加载 WebP;都不支持则加载 PNG。
格式 压缩类型 浏览器兼容性 文件大小(相同质量) 加载速度 适用场景
AVIF 有损/无损 较新浏览器支持良好 最小(高压缩率) 现代 Web,体积敏感场景
WebP 有损/无损 主流浏览器广泛支持 较小 Web 图片优化
PNG 无损 全面支持 图标、透明图、高质量图像
JPG 有损 全面支持 摄影、背景图等色彩丰富图片

通过上边的表格可以看出来同样质量的图片 AVIF、WebP 体积要小于 PNG、JPG 下边来对比一下

AVIF 440KB -> 156KB 减少了 65%

image.png

WebP 440KB -> 156KB 减少了 65%

image.png

看到这里你觉得也许不过如此!但是如果把图片质量下降到 70 AVIF 图片的体积可以减少到 35KB 减少 92% 的体积

image.png

AVIF 与 PNG 加载速度对比

AVIF- 34ms

image.png

PNG 3.36秒

image.png

1. 字体文件放到 cdn 2. 延迟字体加载

另一个拖慢加载的元凶是字体加载

image.png

最初的方式是创建一个 font.scss 文件

@font-face {
  font-family: 'AlibabaPuHuiTi-3-55-Regular';
  src: url('/public/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi-3-55-Regular.woff2') format('woff2');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}

index.scss 中引入

@use './font.scss';

然后配置 nuxt.config.ts

css: [
    '~/assets/style/index.scss',
],

这样做会导致字体文件参与打包并和其他js、css 等文件同时加载

image.png

可以这样改把 font.scss 改为 font.css 放到 public/fonts/font.css

然后修改 nuxt.config.ts

  app: {
    head: {
      link: [
        {
          rel: 'stylesheet',
          href: '/fonts/font.css',
          media: 'print',
          onload: 'this.media=\'all\'',
        },
      ],
    },
  },

这样 font.css 就会延迟加载从而延迟加载字体文件且字体文件不会参与打包

image.png

合理优化图片可以让官网加载速度提升

首页打开加载完成时间从 26 秒 减少到 2 秒,性能提升了约 92.31% ,即 13 倍

image.png

image.png

总结

通过使用 http2.0 、gzip、图片懒加载、响应式图片加载、延迟字体加载等操作可以让首页达到秒开的效果

就这么简单的几步就可以让首页加载速度提升一个级别

这还是无痕禁用缓存下的数据,如果不禁用缓存还会更快

图片压缩工具是 squoosh.app

❌