惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
罗磊的独立博客
H
Help Net Security
I
Intezer
G
Google Developers Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Troy Hunt's Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
J
Java Code Geeks
S
Security Affairs
T
The Blog of Author Tim Ferriss
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
Docker
The GitHub Blog
The GitHub Blog
F
Full Disclosure
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs
腾讯CDC
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
T
Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
L
LINUX DO - 最新话题
Google Online Security Blog
Google Online Security Blog
S
Schneier on Security
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Help Net Security
Help Net Security
P
Proofpoint News Feed
Project Zero
Project Zero
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗

搜索引擎优化

搜索引擎对于时间久的网页和自动移出的吗? - V2EX 多语言小语种的外链感觉很难发,我收集了几个,或许有人可以补充些吗? - V2EX 分享我自己出海发的免费但权重很高的外链 - V2EX 分享一个 94 DR 免费外链 - V2EX 想搞点有质量的外链太难了!哭死! - V2EX 一个空壳静态网站,每天 40 UV, Bing 排名意外靠前,该继续投入吗? WP 博客 sitemap.xml/robots.txt 正确,却始终无法提交到 GSC 的站点地图 SEO 优化求解,谷歌网站排名一直没上去 有没有懂 SEO 的老哥, Google 的搜索引擎怎么还不把我的博客文章放到搜索结果里 - V2EX 一个新游戏站 72 小时冲到 Google 首页后又“消失”的 SEO 复盘 - V2EX 请问大佬们, google 是不能抓取国内的网页了吗?我用的阿里云 DNS, google 一直说无法访问 robots.txt - V2EX 做内容型网站这半年,我踩过的 SEO 内容规划坑 Google 收录 1119 万页, 1855 万未收录页面,究竟如何实现? - V2EX 网站无法被 Bing/Google 收录,索引量突然降为 0 怎么处理? - V2EX 前段时间开发的工具站,今天偶然谷歌搜索了一下,竟然发现排名很靠前 - V2EX 创建了一个“论坛” 各位大佬,seo 推广你们是怎么做的哇 - V2EX 如何快速上线一个新网站 求推荐站长 seo 工具 做 SEO 时,有哪些可以提交外链的网站集合? - V2EX 分享一下可以用作外链的“个人主页”类的网站 - V2EX 我自己做了个网站,但是搜关键词,找不到我网站,应该怎么样把排名搞上去呢? - V2EX Google 说外链要自然,但为啥还有人天天发导航站和博客评论? 我的网站 PageSpeed 全项 100 分,分享下优化思路 独立项目运营一周年经验分享 - V2EX [SEO 基础] 跟大家聊聊 HTTP 协议、互联网、爬虫和外链 - V2EX 分享一个 DR 85 的外链网站 - V2EX 百度老是不收录怎么办? - V2EX 新站 Canonical 设置错了,对 SEO 影响大吗? - V2EX 运营多年的网站突然被百度标红,竟因几篇推广文? - V2EX 分享一个免费的 DR90 的外链 - V2EX [哥飞评站] 年访问量 6236 万的 AI 视频生成网站 Pixverse SEO 评测报告和改进建议(3000 字) - V2EX bing 是要解封我的个人站点了吗? - V2EX 优化了一下网站的 SEO,目前谷歌、百度、必应等搜索引擎都是第一 - V2EX 随手做了个网站,百度一直不收录,不知道为什么。 - V2EX Github 是独立开发者很重要的运营入口 - V2EX 现在的网站还需要做哪些 seo 优化呢,新写的站点部署很久了还不如之前 flarum 被收录的多。。 - V2EX google seo - 通过 title 提升网站排名的最佳实践 - V2EX AI 出海:新站用小工具页面获取流量是否可行 - V2EX 挑战一下, 30 天新站 DR 过 40 - V2EX 面向海外华人独立站推广 - V2EX 如何给网站增加高质量的外链? - V2EX 我的个人博客,自己运行了几年了, bing 一条都没收录? - V2EX 学习 SEO 做出海网站,已经上线并收录,欢迎指点 - V2EX 国内新网站吸引用户, 是不是只能投百度推广了 - V2EX wordpress 站点 Bing 索引 SEO 相关问题 求助 - V2EX 有 SEO 外包成功的案例么? - V2EX 零基础学 SEO 第 3 步 - 零基础学 SEO 第 3 步:优质外链 - V2EX 零基础学 SEO 第 2 步 - 主站和二级域名的影响 - V2EX 在百度图片搜索 “四川 博物馆精讲”会导致搜索内容消失? - V2EX 这种搜索引擎污染算是什么技术? - V2EX SEO 搜索结果问题 - V2EX 写了两篇关于 SEO 的文章,请大佬们斧正 - V2EX 淘宝店家是如何帮别人作百度收录的
Nuxt 的 SEO 实践 - V2EX
leia · 2025-05-21 · via 搜索引擎优化

1. 引言

Nuxt 框架在 SEO 方面的优势主要体现在以下几个方面:

  1. 服务器端渲染(SSR): Nuxt 默认支持 SSR,这意味着搜索引擎爬虫可以直接看到完整的页面内容,而不需要执行 JavaScript 。
  2. 内置的元标签管理: Nuxt 提供了比 Next 更简单的 API 来管理<head>标签,包括 title, meta 描述等关键 SEO 元素。
  3. 静态站点生成(SSG): 通过 nuxt generate 命令,可以生成完全静态的网站,进一步提高了性能和 SEO 友好度。

2. Nuxt 内置的 SEO 功能

Nuxt 框架内置了多个强大的 SEO 工具,让开发者可以轻松地优化他们的应用程序。让我们详细了解这些功能:

useHead 和 useSeoMeta 组合式函数

Nuxt 有 2 个组合式函数,使得管理头部元标签变得更加简单和灵活:

useHead: 这个函数允许你动态设置<head>标签的内容。

useHead({
  title: 'My Amazing Site',
  meta: [{ name: 'description', content: 'This is my amazing site built with Nuxt 3' }],
  link: [{ rel: 'canonical', href: 'https://example.com' }]
})

useSeoMeta: 这个函数专门用于设置 SEO 相关的元标签。

useSeoMeta({
  title: 'My Amazing Site',
  ogTitle: 'My Amazing Site - The Best Site Ever',
  description: 'This is my amazing site built with Nuxt 3',
  ogDescription: 'Experience the best site ever built with Nuxt 3',
  ogImage: 'https://example.com/image.jpg'
})

这两者最终达成的效果是一致的,都是在 head 里面去设置源数据标签,并没有很特殊的区别使用场景,只是有 ts 类型和进行结构简化了当使用 useSeoMeta 的时候。

动态元标签管理

Nuxt 允许你根据页面内容或路由动态地更新元标签。这对于创建独特的、针对每个页面优化的元描述和标题非常有用。

const route = useRoute()

useHead(() => ({
  title: `${route.params.productName} - Our Store`,
  meta: [
    { name: 'description', content: `Learn more about ${route.params.productName} and purchase it from our store.` }
  ]
}))

这个场景的考虑是这样的,因为有 lazy 标识,会直接进入页面进行客户端渲染,但因为是新进入页面此时请求还没有拿到数据,title 在浏览器上方显示的就是undefined-product, 而当请求结束后,因为data是一个响应式对象,会直接更新页面的title

const { data } = await useFetch('/api/products/[id]', {
  lazy: true
})
useHead(() => ({
  title: `${data.title}-product`
}))

这只是个小 demo ,更好的做法是,当没数据的时候,有一个 title 的占位标志文本。

自动生成规范链接( canonical URLs )

Nuxt 可以自动为你的页面生成规范链接,这有助于防止重复内容问题。你可以在nuxt.config.js中配置这个功能:

export default defineNuxtConfig({
  app: {
    head: {
      link: [{ rel: 'canonical', href: 'https://example.com' }]
    }
  }
})

这些语法糖能为 Nuxt 应用提供了坚实的 SEO 基础。在下一节中,我们将探讨如何使用 @nuxtjs/seo 模块来进一步增强你的 SEO 策略。

3. @nuxtjs/seo 模块

@nuxtjs/seo 是一个功能强大的 Nuxt.js 模块,专门用于优化网站的搜索引擎表现。它提供了一套全面的 SEO 工具,使开发者能够轻松实现各种 SEO 最佳实践。

功能介绍和使用方法

@nuxtjs/seo 模块主要提供以下功能:

  1. 自动生成和管理元标签
  2. 创建结构化数据( Schema.org
  3. 生成站点地图( Sitemap )
  4. 配置 robots.txt
  5. 提供动态 SEO 规则生成

要使用 @nuxtjs/seo 模块,首先需要安装:

npm install @nuxtjs/seo

然后在 nuxt.config.ts 文件中添加模块:

export default defineNuxtConfig({
  modules: ['@nuxtjs/seo']
})

在 nuxt.config 中配置 SEO

@nuxtjs/seo 模块允许你在 nuxt.config.ts 中直接配置 SEO 设置。

site 配置

site 配置定义了网站的基本信息,这是在使用 nuxtjs/seo 必须的:

export default defineNuxtConfig({
  site: {
    url: 'https://example.com',
    name: 'My Awesome Site',
    description: 'This is my awesome website',
    defaultLocale: 'en',
    enabled: true,
    debug: false,
    indexable: true,
    trailingSlash: false
  }
})

主要参数说明:

  • url: 网站的规范 URL
  • name: 网站名称
  • description: 网站描述
  • defaultLocale: 默认语言
  • enabled: 是否启用 site 配置(默认为 true )
  • debug: 是否启用调试模式(默认为 false )
  • indexable: 控制网站是否可以被搜索引擎索引(默认在生产环境为 true )
  • trailingSlash: 控制 URL 是否应该包含尾部斜杠(默认为 false ),尾斜杠应该是网站统一的,不然会出现索引页面分流的问题。

schemaOrg 配置

schemaOrg 配置用于生成结构化数据也就是ld-json

export default defineNuxtConfig({
  schemaOrg: {
    identity: {
      type: 'Organization',
      name: 'Example Company',
      url: 'https://example.com',
      logo: 'https://example.com/logo.png'
    },
    defaults: true,
    minify: true,
    reactive: false,
    enabled: true,
    debug: false
  }
})

主要参数说明:

  • identity: 定义网站或组织的身份信息
  • defaults: 是否启用默认的 Schema.org 设置(默认为 true )
  • minify: 是否压缩 Schema.org 输出(默认在生产环境为 true )
  • reactive: 是否启用客户端反应性(默认在开发环境或非 SSR 模式下为 true )
  • enabled: 是否启用 Schema.org (默认为 true )
  • debug: 是否启用调试模式(默认为 false )

robots.txt 配置

@nuxtjs/seo 模块允许你配置 robots.txt 文件:

export default defineNuxtConfig({
  robots: {
    UserAgent: '*',
    Disallow: '/private',
    Allow: '/',
    Sitemap: 'https://example.com/sitemap.xml'
  }
})

这将生成一个 robots.txt 文件,允许所有搜索引擎爬虫访问除 /private 目录外的所有页面,并指向你的站点地图。

sitemap 配置

站点地图配置会自动帮你生成文件路由的页面,如果你需要额外的内容,就使用 sources 配置, 添加一个 Nuxt 的 SeverApi 返回额外的结果。

export default defineNuxtConfig({
  sitemap: {
    enabled: true,
    sortEntries: true,
    sources: ['/api/sitemap-urls'],
    excludeAppSources: false,
    autoLastmod: true,
    sitemaps: false,
    defaultSitemapsChunkSize: 1000,
    include: ['/**'],
    exclude: ['/admin/**'],
    xsl: '/__sitemap__/style.xsl',
    discoverImages: true,
    discoverVideos: true,
    sitemapName: 'sitemap.xml',
    cacheMaxAgeSeconds: 600,
    sitemapsPathPrefix: '/__sitemap__/',
    debug: false
  }
})

主要参数说明:

  • enabled: 是否生成站点地图(默认为 true )

  • sortEntries: 是否对站点地图条目进行排序(默认为 true )

  • sources: 用于站点地图的数据源

    // server/api/__sitemap__/urls.ts 通常在这个位置定义
    import { defineSitemapEventHandler } from '#imports'
    import { characterUrls } from '~/characterUrls'
    
    export default defineSitemapEventHandler(async () => {
      const internalLinks = await $fetch('/api/internal-links')
      if (internalLinks) {
        const internalLinksNodes = internalLinks.map((link) =>
          asSitemapUrl({ loc: link, lastmod: new Date().toISOString(), priority: 0.8 })
        )
        return [...internalLinksNodes, ...characterUrls]
      }
      return []
    })
    
  • autoLastmod: 是否自动检测每个 URL 的最后修改日期(默认为 false )

  • sitemaps: 是否生成多个站点地图(默认为 false )

  • includeexclude: 用于过滤要包含或排除的路由

  • discoverImagesdiscoverVideos: 是否在预渲染时发现路由中的图片和视频(默认为 true )

  • cacheMaxAgeSeconds: 站点地图的缓存时间(默认为 600 秒)

  • debug: 是否启用调试模式(默认为 false )

4. Nuxt Content

内容是 SEO 的核心,Nuxt 社区当然有库来帮助你创建和管理 SEO 友好的内容。

使用 Nuxt Content 模块管理 SEO 友好的内容

Nuxt Content 模块是一个强大的文档驱动模块,它可以帮助你轻松管理和呈现 Markdown 、JSON 、YAML 、XML 和 CSV 文件。

  1. 安装 Nuxt Content:
npm install @nuxt/content
  1. nuxt.config.ts中配置:
export default defineNuxtConfig({
  modules: ['@nuxt/content']
})
  1. 创建 SEO 友好的内容:
---
sitemap:
  loc: /agreement/community-guidelines
title: 'My Amazing Blog Post'
description: 'This is a blog post about amazing things'
date: '2023-05-20'
---

// 内容

这个 sitemap 的配置项,会自动把这个链接添加到 Sitemap 中。

  1. 在组件中使用内容:
<script setup>
const { data } = await useAsyncData('home', () => queryContent('/').find())
</script>

<template>
  <ContentList v-slot="{ list }">
    <div v-for="article in list" :key="article._path">
      <h2>{{ article.title }}</h2>
      <p>{{ article.description }}</p>
    </div>
  </ContentList>
</template>

5. 常见 SEO 问题及解决方案

处理重复内容

使用规范链接( canonical URLs ):

useHead({
  link: [{ rel: 'canonical', href: 'https://example.com/original-page' }]
})

管理 404 和 301 重定向

  1. 创建自定义 404 页面:

创建pages/404.vue文件:

<template>
  <div>
    <h1>404 - Page Not Found</h1>
    <p>Sorry, the page you are looking for does not exist.</p>
    <NuxtLink to="/">Go back to homepage</NuxtLink>
  </div>
</template>

<script setup>
useHead({
  title: '404 - Page Not Found',
  meta: [{ name: 'robots', content: 'noindex' }]
})
</script>
  1. 实现 301 重定向:

nuxt.config.ts中配置重定向:

export default defineNuxtConfig({
  nitro: {
    handlers: [
      {
        route: '/old-page',
        handler: (event) => {
          event.node.res.writeHead(301, { Location: '/new-page' })
          event.node.res.end()
        }
      }
    ]
  }
})

解决 JavaScript 渲染内容的 SEO 挑战

  1. 使用服务器端渲染( SSR ): Nuxt 默认支持 SSR ,确保搜索引擎可以看到完整的页面内容。

  2. 对于动态内容,使用useFetchuseAsyncData,不加lazy的配置项就是在任何情况下都 ssr 渲染。加了之后意味着如果是通过 Nuxt 本身的 路由方式跳转过来的时候,会直接先进入页面,然后变成客户端渲染。而这对于爬虫是没有影响的:

<script setup>
const { data } = await useFetch('/api/products')
</script>

<template>
  <div v-for="product in data" :key="product.id">
    <h2>{{ product.name }}</h2>
    <p>{{ product.description }}</p>
  </div>
</template>

这一段内容本来应该是 Nuxt 里面最重要的一部分,但我们这个章节是讲 SEO~,就稍微了解一下 lazy 这个对于在 Nuxt 请求中非常关键的配置项!

  1. 使用<ClientOnly>组件包裹仅客户端渲染的内容:
<ClientOnly>
  <ComplexChart :data="chartData" />
</ClientOnly>

6. 结论

Nuxt 的 Seo 其实非常的方便,相对于 Next 都是配置形的,开发体验非常的好,且页面性能和一些用户体验上都会大于 Next ,比较中肯的说,不考虑社区问题,它几乎就是 SSR 前端框架的最佳实践。