现代框架对SEO的深度影响

news2025/5/10 19:23:17

第8章:现代框架对SEO的深度影响

1. 引言

NextNuxt 是两个 🔥热度和使用度都最高 的现代 Web 开发框架,它们分别基于 ⚛️React🖖Vue 构建,也代表了这两个生态的 🌐全栈框架

  • Next 是由 Vercel 公司 开发的 React 框架,

  • Nuxt 则是 Vue 的 服务器端渲染框架

共同目标

  • 简化开发流程

  • 提升应用性能

  • SEO 优化 提供丰富的内置功能

2. Next和Nuxt页面渲染机制

Next和Nuxt都提供了常见的四种渲染方式,SSR、SSG、IRR、SCR。但在细节上有非常大的区别。

1. 服务器端渲染(SSR)

  • ✅ 优点: 📈 搜索引擎可以直接抓取完整的HTML内容,有利于 SEO快速建立索引

  • 实现

    • Next.js (App Router):默认所有组件都是服务器组件,自动SSR

    • Nuxt.js:通过 asyncDatafetch

2. 静态站点生成(SSG)

  • ✅ 优点预渲染页面,加载速度快,对 SEO非常有利

  • 实现

    • Next.js (App Router):使用 generateStaticParams 函数进行静态生成

    • Nuxt.js:在 nuxt.config.ts 中的 routeRules 可直接配置

3. 增量静态再生(ISR)

  • ✅ 优点: 结合了 SSG的性能优势动态内容的新鲜度,有利于SEO

  • 实现

    • Next.js (App Router):通过在页面文件中导出 revalidate 变量实现

    • Nuxt.js:在 nuxt.config.ts 中的 routeRules 可直接配置

4. 客户端渲染(CSR)

  • 缺点不利于SEO,因为初始HTML内容较少

  • 实现

    • Next.js (App Router):使用 'use client' 指令将组件标记为客户端组件

    • Nuxt.js:默认支持

2.1 Nuxt(Vue)的优势

自然混合渲染

  • 只需使用 await useFetch + Lazy 配置,服务端/客户端渲染边界自动处理

  • 开发者无需刻意区分渲染环境,按常规写法即可完成混合渲染

  • 传统艺能:Vue生态的强DX(开发体验)设计,简单易用

      潜在问题

    • 高度封装可能在复杂场景引发底层不可控问题

    • 特殊需求需深入框架底层,魔法失效时调试困难

    2.2Next.js (React) 的挑战

    显式边界处理

    • 必须手动标记 'use client' 区分客户端组件

    • 需主动处理水合错误(如 useEffect 依赖问题)

    • 流式渲染需手动包裹 <Suspense> 边界

    优势代价

    • 显式控制带来更高灵活性,适合复杂场景

    • 但开发心智负担显著增加

    在页面中只要使用await useFetch + Lazy的属性配置,而哪些组件在客户端渲染,哪些组件在服务端渲染是自动处理的,我们只需要想往常往下写就可以。

    这确实也是Vue生态的传统艺能,简单易用强DX,但也会在某些更复杂和特殊场景下这种高度化的封装会带来一些从根本上无法解决的问题。

    Next相比之下,写法上会难受不少,一个原因是边界的写法,另外一个是有时候要手动处理水合问题。

    3. 两个框架的体验以及Seo问题大合集

    3.1. Next App SSR路由跳转缓慢

    🔀 Next.js 路由变更全流程解析流程:

    1. 触发路由变更:用户点击链接或通过编程方式触发路由变更。🔗

    2. 请求 RSC Payload:Next.js 首先请求新路由的 RSC(React Server Components)payload,它包含了服务器组件的结构和数据。📡

    3. 显示加载状态:在 RSC payload 请求完成前,如果存在 loading.js 文件,Next.js 会显示其中定义的 加载 UI。⏳

    4. 处理 RSC Payload:客户端接收 RSC payload 并开始处理

    5. 流式渲染:如果使用了 流式渲染(例如通过 React Suspense),部分内容可能会提前显示。💧

    6. 客户端组件加载:开始加载和执行标记为 'use client'客户端组件

    7. 水合(Hydration):客户端 React 开始水合过程,使 静态 HTML 变为可交互组件。💡

    8. 数据获取:如有客户端数据请求(例如在 useEffect 中),这些操作会在此时执行。

    9. 路由更新完成:新页面完全加载并可交互,loading.js 中的 UI 被 新页面内容完全替换。✅

    问题现象

    技术本质

    用户体验伤害登记

    首次渲染无反馈

    RSC Payload未返回无Loading

    用户以为页面卡死 点击---无反应---焦虑

    Prefetch机制失败

    服务端直出数据无法预加载

    点击后强制等待服务端响应 无缓冲期

    路由响应迟滞

    服务端处理时间不可控

    交互顿挫感强烈 类似老旧机械按键延迟

    这就会导致一个非常严重的问题,因为RSC Payload是直接来自服务端,在Rsc Payload完成前是不会有Loading的,就会导致页面停滞一会,尤其是第一次渲染,且prefetch在这种场景也没用,而这段时间是对于用户是没有任何反馈的(如果没有加进度条之类的过度效果),也就是说路由反应晦涩(点一下需要反应)。

    如图(3G网速):

    3.2 Next SSR动态路由时的TDK问题

    在使用 generateMetadata 的时候,在目前的正式版本中(15canary有了)会导致 loading 直接不加载(因为会提前完全准备完页面),那么在之前我是怎么解决的那?

    import { Metadata } from 'next'
    import { headers } from 'next/headers'
    
    function isSSR() {
      return headers().get('accept')?.includes('text/html') // for RSC navigations, it uses either `Accept: text/x-component` or `Accept: */*`, for SSR browsers and other client use `Accept: text/html`
    }
    
    const fallback: Metadata = {
      title: 'Loading...'
    }
    
    type GenerateMetadata<T> = (params: T) => Promise<Metadata>
    
    const getMetadataWithFallback =
      <Params>(generateMetadata: GenerateMetadata<Params>, staticMetadata?: Partial<Metadata>) =>
      (params: Params) => {
        return isSSR() ? generateMetadata(params) : Promise.resolve({ ...fallback, ...staticMetadata })
      }
    
    export default getMetadataWithFallback

    这是种非常丑陋的写法把源数据的更新放在客户端去更新,还是不会让loading加载出来。那么更好的解决方案是什么那? 是通过 experimental.streamingMetadata流式Meta选项,这个实验性选项,会让generateMetadata流式生成,让loading可以加载出来。但同样也有个问题了。

    显然Meta源数据标签被放在了Body里,就是比较靠后的位置,但是seo应该是只会分析head里的meta标签(这里我有点不太确定)。 这是一个大问题,解决的方式同样是实验属性中的htmlLimitedBots它传入一个正则去匹配爬虫的UserAgent,当爬虫的时候就不进行这种源数据流式传输了。

    3.3 Nuxt如何绕过这两个问题的,以及造成的新问题

    Nuxt的框架非常的爽,它的客户端组件和服务端组件并不会分开,而是绑定在一起的。

    
    const { data: SeoData } = await useFetch('/api/seo', {
      query: { url: path, ...query },
      lazy: true
    })

    在组件和页面中,仅仅通过这种方式就可以了。当是在 服务端请求渲染(比如刷新或新打开页面)时,系统会 自动 await 请求,而当是 客户端导航 时,请求将 异步执行,从而直接避免了客户端导航时组件的等待问题。

    好处是:

    • 用户不会感觉有延迟;

    • 不会再次从服务端加载结构性文件。

    ⚠️但代价是什么? 因为在 客户端导航时是异步的,如果有些组件中的 meta 标签依赖接口返回的数据,就可能出现 undefined 的情况。 不过——这 并不影响爬虫和 SEO,因为爬虫不会执行 Nuxt 的客户端导航逻辑。 但如果你确实希望 meta 标签中包含完整的数据,有两种方式可以考虑:

    1. 使用一些 hack 手段(如延迟渲染 meta);

    2. 移除 lazy,不管什么情况都等数据加载完后再渲染 —— 但这会让体验比 Next 的做法还糟糕。🥴


    3.4 Nuxt 的首屏问题 🚨

    Nuxt 的首屏加载太重了,加载了大量的 框架基础文件,这导致:

    • 首屏性能差;

    • 服务端渲染也慢;

    • LCP(最大内容绘制)指标难以达标📉。

    并且 Nuxt 的文档流也不像 Next 那样支持 流式渲染,所以首次渲染体验更差。


    3.5 Nuxt 的致命问题 💥

    Nuxt 有两个 严重影响 SEO 的问题,我也因此直接将项目迁移到了 Next —— Nuxt 在 SEO 方面确实没法做下去。

    3.5.1 NUXT_DATA 的 JSON 化

    在服务端渲染时,无论是 Next 还是 Nuxt,都会将服务端返回的数据注入到 HTML 中。但两者方式差异巨大:

    • Next 是将数据作为 序列化字符串 注入;

    • Nuxt 则是将数据直接 JSON 格式化 放入 HTML 中。

    ⚠️ 这导致了几个问题:

    • 容易被非法爬虫误解析;

    • 体积更大,加载慢;

    • 不利于细粒度的懒加载。

    3.5.1 NUXT_DATA JSON化

    首先服务端渲染,不管是Next还是Nuxt都会把服务端的数据添加到HTML Document里,但他们放的方式区别很大,Next是放序列化字符串,Nuxt是放JSON格式。

    大家可能觉得放JSON还更好一些(JSON会有性能优势 https://v8.dev/blog/cost-of-javascript-2019#json )。

    但JSON也会导致这些内容会被爬虫爬取,并且这还是更利于爬虫爬取的内容。而后端的接口,其实爬虫不需要的信息会特别多,比如id、用户信息、ip信息这种。

    当这些不需要内容太多了的时候,本身要突出的内容和关键词都无法突出了,这是个压倒性的错误。

    另外一方面是有数据安全的问题(这意味着把数据往互联网公开了),另外一方面是

    当然可以设置payloadExtraction为false,也会变成序列化字符串,但却会造成更多的问题(除非在一开始就是false,而默认值为true这个选项)。

    3.5.2 秘钥暴露

    它把环境变量会直接暴露出来,使用NUXT_PUBLIC的,还会暴露打包的设备信息。

    可能这也是压垮我的最后一根稻草吧,即使Nuxt的用户体验、DX、客户端性能都是远大于Next的,但为了流量和长期考虑不得不重构应用换成Next,实际上在重构后整个应用的SEO流量几乎翻倍了。

    结论

    以下是Nuxt和Next.js在多个关键方面的详细对比表:

    特性

    Nuxt

    Next.js

    SEO 优化

    极差

    上等

    框架提供基础用户体验

    上等

    中等

    开发体验 (DX)

    上等

    中等

    服务器端渲染 (SSR)

    支持

    支持

    静态站点生成 (SSG)

    支持

    支持

    增量静态再生 (ISR)

    支持

    支持

    客户端渲染 (CSR)

    支持

    支持

    首屏加载速度

    中等

    上等

    数据安全性

    学习曲线

    较平缓

    较陡峭

    大型应用扩展性

    中等

    上等

    关键结论

    1. Next.js 优势

      1. 首屏加载速度、SEO优化、大型项目扩展性表现突出 🚀

      2. 更适合高性能要求和复杂应用场景

    2. Nuxt 亮点

      1. 开发体验更友好,学习成本较低 ✨

      2. 适合快速迭代的中小型项目

    3. 共同优势

      1. 全栈渲染方案支持(SSR/SSG/ISR/CSR) 💡

    无论选择哪个框架,深入理解其工作原理和潜在问题都是至关重要的,这样才能在开发过程中做出正确的优化决策,并在必要时采取适当的措施来弥补框架的不足。最终,成功的项目不仅取决于所选择的工具,还取决于如何巧妙地运用这些工具来满足特定的项目需求。

    欢迎加入群聊,我们一起讨论一些更有趣的技术、商业、闲聊。

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

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

    相关文章

    密码学--RSA

    一、实验目的 1.随机生成明文和加密密钥 2.利用C语言实现素数选择&#xff08;素性判断&#xff09;的算法 3.利用C语言实现快速模幂运算的算法&#xff08;模重复平方法&#xff09; 4.利用孙子定理实现解密程序 5.利用C语言实现RSA算法 6.利用RSA算法进行数据加/解密 …

    如何选择自己喜欢的cms

    选择内容管理系统cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 检测器的情况下手动检测 CMS 结论 在开始构建自己的数字足迹之前&#xff0c;大多数人会…

    BUUCTF——杂项渗透之赛博朋克

    下载附件&#xff0c;是一个txt。打开查看&#xff0c;数据如下&#xff1a; 感觉这个像是用十六进制编辑器打开后的图片数据。为了验证此想法&#xff0c;我用010editor打开&#xff0c;发现文件头的确是png图片的文件头。 把txt文件后缀改成png格式&#xff0c;再双击打开&am…

    React 中集成 Ant Design 组件库:提升开发效率与用户体验

    React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…

    编译原理实验 之 语法分析程序自动生成工具Yacc实验

    文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具&#xff0c;Yacc实验通常是在编译原理相关课程中进行的实践项目&#xff0c;旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…

    从“山谷论坛”看AI七剑下天山

    始于2023年的美国山谷论坛(Hill and Valley Forum)峰会,以“国会山与硅谷”命名,寓意连接科技界与国家安全战略。以人工智能为代表的高科技,在逆全球化时代已成为大国的致胜高点。 论坛创办者Jacob Helberg,现在是华府的副国务卿,具体负责经济、环境和能源事务。早先曾任…

    C——数组和函数实践:扫雷

    此篇博客介绍用C语言写一个扫雷小游戏&#xff0c;所需要用到的知识有&#xff1a;函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的&#xff0c;如何玩扫雷游戏&#xff1f; 如图&#xff0c;是一个标准的扫雷游戏初始阶段。由此…

    sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用

    一、sui在windows虚拟化子系统Ubuntu下的安装使用&#xff08;WindowsWsl2Ubuntu24.04&#xff09; 前言&#xff1a;解释一下WSL、Ubuntu的关系 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软推出的一项功能&#xff0c;允许用户在 Windows 系统中原生运行…

    智能合约在去中心化金融(DeFi)中的核心地位与挑战

    近年来&#xff0c;区块链技术凭借其去中心化、不可篡改等特性&#xff0c;在全球范围内掀起了技术革新浪潮。去中心化金融&#xff08;DeFi&#xff09;作为区块链技术在金融领域的重要应用&#xff0c;自 2018 年以来呈现出爆发式增长态势。据 DeFi Pulse 数据显示&#xff0…

    有关SOA和SpringCloud的区别

    目录 1. 定义 2. 架构风格 3. 技术栈 4. 服务交互 5. 适用场景 前言 面向服务架构&#xff08;SOA&#xff09;是一种软件设计风格&#xff0c;它将应用程序的功能划分为一系列松散耦合的服务。这些服务可以通过标准的通信协议进行交互&#xff0c;通常是HTTP或其他消息传…

    学习搭子,秘塔AI搜索

    什么是秘塔AI搜索 《秘塔AI搜索》的网址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知识学习&#xff0c;其中学习部分是亮点&#xff0c;也是主要推荐理由。对应的入口&#xff1a;https://metaso.cn/study 推荐理由 界面细节做工精良《今天学点啥》板块的知…

    IBM BAW(原BPM升级版)使用教程第六讲

    续前篇&#xff01; 一、事件&#xff1a;Undercover Agent 在 IBM Business Automation Workflow (BAW) 中&#xff0c;Undercover Agent (UCA) 是一个非常独特和强大的概念&#xff0c;旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程…

    高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化

    一、虚拟机环境下的部署演进 1. 低并发场景&#xff08;QPS<10&#xff09;的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点&#xff1a; 文件替换期间导致Nginx返回502错误&#xff08;统计显示…

    VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件

    《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

    Centos 7.6 安装 Node.js 20 的环境配置记录

    Centos 7.6 安装 Node.js 20 的环境配置记录 Centos 7在 2024 年的 6 月 30 号已经停止维护了&#xff0c;但是由于时代原因&#xff0c;很多服务还是跑在这个系统上。本篇博文记录如何在 Centos 7.6 上安装 Node20。 初步安装 node 下载 node.js 的 Linux 版本 cd ~ curl -O h…

    springboot3 + mybatis-plus3 创建web项目实现表增删改查

    Idea创建项目 环境配置说明 在现代化的企业级应用开发中&#xff0c;合适的开发环境配置能够极大提升开发效率和应用性能。本文介绍的环境配置为&#xff1a; 操作系统&#xff1a;Windows 11JDK&#xff1a;JDK 21Maven&#xff1a;Maven 3.9.xIDE&#xff1a;IntelliJ IDEA…

    【人工智能学习之动作识别TSM训练与部署】

    【人工智能学习之动作识别TSM训练与部署】 基于MMAction2动作识别项目的开发一、MMAction2的安装二、数据集制作三、模型训练1. 配置文件准备2. 关键参数修改3. 启动训练4. 启动成功 ONNX模型部署方案一、环境准备二、执行转换命令 基于MMAction2动作识别项目的开发 一、MMAct…

    sqli-labs靶场18-22关(http头)

    目录 less18&#xff08;user-agent&#xff09; less19&#xff08;referer&#xff09; less20&#xff08;cookie&#xff09; less21&#xff08;cookie&#xff09; less22&#xff08;cookie&#xff09; less18&#xff08;user-agent&#xff09; 这里尝试了多次…

    Android系统架构模式分析

    本文系统梳理Android系统架构模式的演进路径与设计哲学&#xff0c;希望能够借此探索未来系统的发展方向。有想法的同学可以留言讨论。 1 Android层次化架构体系 1.1 整体分层架构 Android系统采用五层垂直架构&#xff0c;各层之间通过严格接口定义实现解耦&#xff1a; 应用…

    Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)

    Web前端—VSCode如何解决打开html页面中文乱码的问题&#xff08;方法2&#xff09; 1.打开VScode后&#xff0c;依次点击 文件 >> 首选项 >> 设置 2.打开设置后&#xff0c;依次点击 文本编辑器 >> 文件&#xff08;或在搜索框直接搜索“files.autoGuessEnc…