辛苦开发的页面结果搜不到,用 SSR、预渲染和静态生成给爬虫开了三扇门,提高SEO

举报
海是岛思念的泪 发表于 2026/10/08 14:33:34 2026/10/08
【摘要】 纯客户端渲染(CSR)的 SPA 经常因为首屏 HTML 是空的,导致搜索引擎抓不到正文。本文对比 CSR / SSR / SSG / ISR 四种渲染方式,讲清各自的适用场景和一段可落地的 Next.js 代码,帮你把内容交给爬虫。

做过 SPA(单页应用)的人都遇到过这个场景:本地跑得好好的,上线后去搜索引擎一搜,结果页 snippet 里只有一句"Loading…"或者一堆 JS 变量名。原因很简单——你返回给爬虫的第一份 HTML 里没有正文,正文是浏览器跑完 JS 之后才塞进去的。老一代爬虫不执行 JS,自然抓不到内容。这不是 SEO 玄学,是渲染方式的锅。

一、四种渲染方式,先看清楚差别

方式 谁生成 HTML 首屏有内容吗 适合什么
CSR(客户端渲染) 浏览器 JS 否,先白屏后渲染 后台系统、登录后才看得到的页面
SSR(服务端渲染) 服务器每次请求现生成 是 内容频繁变、要实时性的页面
SSG(静态生成) 构建时生成 是 博客、文档、营销页等不常变的内容
ISR(增量静态) 构建生成 + 定时重新生成 是 大量页面、偶尔更新

CSR 不是不能用,是别把它用在需要被搜到的公开页面上。后台管理系统搜不到无所谓,因为本来就不让搜;但产品介绍页、博客文章如果被 CSR 包了,等于主动放弃了搜索流量。

二、SSR:每次请求都现做一份 HTML

以 Next.js 为例,给页面加一个 getServerSideProps,框架就会在每次请求时于服务端把数据取好、把 HTML 生成好再返回:

// pages/post/[id].js
export async function getServerSideProps({ params }) {
  const res = await fetch(`https://api.example.com/posts/${params.id}`);
  const post = await res.json();
  return { props: { post } };  // 服务端已拿到数据,HTML 里直接有正文
}

export default function Post({ post }) {
  return (
    <article>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.content }} />
    </article>
  );
}

爬虫拿到的第一份 HTML 里就已经有 <h1> 和正文了,不用等 JS。代价是每次请求都走一遍服务端,QPS 高时要做好缓存。

三、SSG 和预渲染:构建时就把页面烤好

如果你的内容不常变(比如这篇博客),完全没必要每次请求都现生成。SSG 在构建阶段就把页面渲染成静态 HTML,用户和爬虫拿到的都是现成的文件,速度快还省服务器:

// pages/post/[id].js
export async function getStaticProps({ params }) {
  const post = getPostFromDisk(params.id);  // 构建时从磁盘/CMS 读
  return { props: { post } };
}
export async function getStaticPaths() {
  const ids = getAllPostIds();
  return { paths: ids.map(id => ({ params: { id } })), fallback: false };
}

对于纯 CSR 的老项目,不想大改架构,也可以用预渲染(prerendering):在构建后用无头浏览器把关键路由跑一遍,把生成的 HTML 存下来。相当于给少数公开页面单独"烤"一份快照,其余页面仍是 CSR。这是一种低成本过渡方案。
image.png

总结

页面搜不到,根因多半是首屏 HTML 里没有正文,爬虫空手而归。解决思路就是别让公开内容走纯 CSR:实时内容用 SSR 每次现生成 HTML,不常变的内容用 SSG 在构建时烤好,老项目嫌改造大就用预渲染给关键路由存快照。CSR 本身没错,只该留给登录后才看得到的后台页面。选对渲染方式,爬虫拿到的第一份 HTML 就有完整正文,搜索收录自然就上来了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。