现代框架对SEO的深度影响
第8章:现代框架对SEO的深度影响
1. 引言
Next 和 Nuxt 是两个 🔥热度和使用度都最高 的现代 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:通过
asyncData
或fetch
-
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 路由变更全流程解析流程:
-
触发路由变更:用户点击链接或通过编程方式触发路由变更。🔗
-
请求 RSC Payload:Next.js 首先请求新路由的 RSC(React Server Components)payload,它包含了服务器组件的结构和数据。📡
-
显示加载状态:在 RSC payload 请求完成前,如果存在
loading.js
文件,Next.js 会显示其中定义的 加载 UI。⏳ -
处理 RSC Payload:客户端接收 RSC payload 并开始处理。
-
流式渲染:如果使用了 流式渲染(例如通过
React Suspense
),部分内容可能会提前显示。💧 -
客户端组件加载:开始加载和执行标记为
'use client'
的 客户端组件。 -
水合(Hydration):客户端 React 开始水合过程,使 静态 HTML 变为可交互组件。💡
-
数据获取:如有客户端数据请求(例如在
useEffect
中),这些操作会在此时执行。 -
路由更新完成:新页面完全加载并可交互,
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 标签中包含完整的数据,有两种方式可以考虑:
-
使用一些 hack 手段(如延迟渲染 meta);
-
移除 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) | 支持 | 支持 |
首屏加载速度 | 中等 | 上等 |
数据安全性 | 差 | 好 |
学习曲线 | 较平缓 | 较陡峭 |
大型应用扩展性 | 中等 | 上等 |
关键结论
-
Next.js 优势:
-
首屏加载速度、SEO优化、大型项目扩展性表现突出 🚀
-
更适合高性能要求和复杂应用场景
-
-
Nuxt 亮点:
-
开发体验更友好,学习成本较低 ✨
-
适合快速迭代的中小型项目
-
-
共同优势:
-
全栈渲染方案支持(SSR/SSG/ISR/CSR) 💡
-
无论选择哪个框架,深入理解其工作原理和潜在问题都是至关重要的,这样才能在开发过程中做出正确的优化决策,并在必要时采取适当的措施来弥补框架的不足。最终,成功的项目不仅取决于所选择的工具,还取决于如何巧妙地运用这些工具来满足特定的项目需求。
欢迎加入群聊,我们一起讨论一些更有趣的技术、商业、闲聊。
相关文章:

现代框架对SEO的深度影响
第8章:现代框架对SEO的深度影响 1. 引言 Next 和 Nuxt 是两个 🔥热度和使用度都最高 的现代 Web 开发框架,它们分别基于 ⚛️React 和 🖖Vue 构建,也代表了这两个生态的 🌐全栈框架。 Next 是由 Vercel 公司…...

密码学--RSA
一、实验目的 1.随机生成明文和加密密钥 2.利用C语言实现素数选择(素性判断)的算法 3.利用C语言实现快速模幂运算的算法(模重复平方法) 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 结论 在开始构建自己的数字足迹之前,大多数人会…...

BUUCTF——杂项渗透之赛博朋克
下载附件,是一个txt。打开查看,数据如下: 感觉这个像是用十六进制编辑器打开后的图片数据。为了验证此想法,我用010editor打开,发现文件头的确是png图片的文件头。 把txt文件后缀改成png格式,再双击打开&am…...
【c++】 我的世界
太久没更新小游戏了 给个赞和收藏吧,求求了 要游戏的请私聊我 #include <iostream> #include <vector>// 定义世界大小 const int WORLD_WIDTH 20; const int WORLD_HEIGHT 10;// 定义方块类型 enum BlockType {AIR,GRASS,DIRT,STONE };// 定义世界…...

React 中集成 Ant Design 组件库:提升开发效率与用户体验
React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…...
HunyuanCustom, 腾讯混元开源的多模态定制视频生成框架
HunyuanCustom是一款由腾讯混元团队开发的多模态驱动定制视频生成框架,能够支持图像、音频、视频和文本等多种输入方式。该框架专注于生成高质量的视频,能够实现特定主体和场景的精准呈现。 HunyuanCustom是什么 HunyuanCustom是腾讯混元团队推出的一种…...
Lightweight App Alternatives
The tech industry’s business model thrives on constant churn: new features, fancier designs, and heavier apps — not because they’re essential, but because they keep consumers upgrading. Stripping your phone back to basics is an act of tech self-defense.…...
STM32F103RCT6 + MFC实现网口设备搜索、修改IP、固件升级等功能
资源下载链接:https://download.csdn.net/download/qq_35831134/90712875?spm=1001.2014.3001.5501 一.大概逻辑: // 网口搜索大概逻辑: // ************************************************************************** // 一.环境: // 上位机用MFC下位机用STM32F103R…...

编译原理实验 之 语法分析程序自动生成工具Yacc实验
文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具,Yacc实验通常是在编译原理相关课程中进行的实践项目,旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…...
[250504] Moonshot AI 发布 Kimi-Audio:开源通用音频大模型,驱动多模态 AI 新浪潮
目录 Moonshot AI 发布 Kimi-Audio:开源音频基础模型,赋能音频理解、生成与对话新时代核心能力与特性技术基础开放资源与评估行业意义 Moonshot AI 发布 Kimi-Audio:开源音频基础模型,赋能音频理解、生成与对话新时代 Moonshot A…...

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

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

sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用
一、sui在windows虚拟化子系统Ubuntu下的安装使用(WindowsWsl2Ubuntu24.04) 前言:解释一下WSL、Ubuntu的关系 WSL(Windows Subsystem for Linux)是微软推出的一项功能,允许用户在 Windows 系统中原生运行…...

智能合约在去中心化金融(DeFi)中的核心地位与挑战
近年来,区块链技术凭借其去中心化、不可篡改等特性,在全球范围内掀起了技术革新浪潮。去中心化金融(DeFi)作为区块链技术在金融领域的重要应用,自 2018 年以来呈现出爆发式增长态势。据 DeFi Pulse 数据显示࿰…...
Femap许可使用数据分析
在当今竞争激烈的市场环境中,企业对资源使用效率和成本控制的关注日益增加。Femap作为一款业界领先的有限元分析软件,其许可使用数据分析功能为企业提供了深入洞察和智能决策的支持。本文将详细介绍Femap许可使用数据分析工具的特点、优势以及如何应用这…...

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

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

IBM BAW(原BPM升级版)使用教程第六讲
续前篇! 一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一个非常独特和强大的概念,旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程…...

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

VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...

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

springboot3 + mybatis-plus3 创建web项目实现表增删改查
Idea创建项目 环境配置说明 在现代化的企业级应用开发中,合适的开发环境配置能够极大提升开发效率和应用性能。本文介绍的环境配置为: 操作系统:Windows 11JDK:JDK 21Maven:Maven 3.9.xIDE:IntelliJ IDEA…...
每天批次导入 100 万对账数据到 MySQL 时出现死锁
一、死锁原因及优化策略 1.1 死锁原因分析 批量插入事务过大: Spring Batch 默认将整个 chunk(批量数据块)作为一个事务提交,100 万数据可能导致事务过长,增加锁竞争。 并发写入冲突: 多个线程或批处理作…...

【人工智能学习之动作识别TSM训练与部署】
【人工智能学习之动作识别TSM训练与部署】 基于MMAction2动作识别项目的开发一、MMAction2的安装二、数据集制作三、模型训练1. 配置文件准备2. 关键参数修改3. 启动训练4. 启动成功 ONNX模型部署方案一、环境准备二、执行转换命令 基于MMAction2动作识别项目的开发 一、MMAct…...
ES6/ES11知识点 续五
迭代器【Iterator】 ES6 中的**迭代器(Iterator)**是 JavaScript 的一种协议,它定义了对象如何被逐个访问。迭代器与 for…of、扩展运算符、解构赋值等语法密切相关。 📘 迭代器工作原理 ES6 迭代器的工作原理基于两个核心机制…...

sqli-labs靶场18-22关(http头)
目录 less18(user-agent) less19(referer) less20(cookie) less21(cookie) less22(cookie) less18(user-agent) 这里尝试了多次…...
redhat9 安装pywinrm
看了很多文档,都是有很多限制,还是老老实实用pip 安装: Step1: 安装pip: [rootip-abc ~]# python get-pip.py Collecting pip Downloading pip-25.1.1-py3-none-any.whl.metadata (3.6 kB) Collecting wheel Downloading wheel-0.45.1-py…...

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

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