学习契约与正确模型
先明确为什么学、学完能做什么,以及如何证明自己真的掌握。
现代 SaaS 官网常由 SPA、组件库和 API 驱动;用户看得到,不代表无登录、无交互的爬虫也得到同样主体。
- 能区分 CSR、SSR、SSG 与 hydration 风险
- 能比较源代码和渲染结果
- 能提交可复现的工程缺陷
精读 30 分钟 → 引导练习 20 分钟 → 实战任务 60 分钟。实战时间单列,不再把浏览页面和项目操作混成一个数字。
- 它是什么
- JavaScript SEO 关注爬虫获取资源、执行脚本、生成 DOM 并抽取内容、链接和元数据的可靠性。
- 为什么重要
- 渲染增加排队、依赖和失败模式;只存在于客户端状态的主体可能无法稳定处理。
- 什么时候使用
- SPA、客户端路由、懒加载、无限滚动、个性化和 JS 注入元数据的站点。
- 什么时候不要套用
- 不要因使用 JavaScript 就默认有问题,也不要为 SEO 建与用户内容不同的第二套页面。
- 边界与不确定性
- 预渲染提升可获取性,但不自动解决质量、重复、性能或索引选择。
机制精讲
先读完整因果链,再看每个环节留下什么可观察信号。
JavaScript SEO 的核心不是争论“Google 会不会运行 JavaScript”,而是验证关键任务信息在抓取、渲染和后续处理链中是否稳定存在。一个真实页面至少有三种可比较表示:服务器首个 HTML 响应、普通浏览器执行脚本后的 DOM、搜索引擎测试或抓取环境得到的渲染结果。三者可能因 API、Cookie、地区、权限、懒加载和脚本错误出现差异,因此用户浏览正常只能证明某个客户端路径成功,不能替代可复现审计。
工程验收必须从页面任务出发:标题、正文、主链接、canonical、robots 指令和结构化数据中,哪些必须在失败条件下仍可用?服务端渲染、静态生成和客户端渲染都是实现手段,不存在看到某个框架就能判定排名好坏的规则。本课训练你保存三种页面表示、制造受控失败、定位丢失发生在哪一层,并把发现写成工程师可以复现且发布后可以复测的缺陷单。
抓取与渲染分阶段
爬虫先请求 URL 获取响应和资源引用,支持渲染的系统再执行可用脚本形成另一页面表示。阶段可能异步且会失败;这是一种公开的概念模型,不代表完整内部架构。
依赖链放大风险
正文若必须等待 bundle、第三方脚本、API、鉴权和交互依次成功,任一依赖失败都会把完整页面变成空壳。问题是关键内容的可用性,不是 JavaScript 文件数量本身。
可发现链接语义
带有效 href 的锚点能直接表达目标地址;仅在点击事件中拼接路由会让发现依赖脚本执行。客户端路由还必须维护历史、直接访问和正确状态。
关键概念
掌握术语之间的关系,才能迁移到不同网站、行业和工具。
源 HTML 与渲染 DOM
源 HTML 是服务器首响,渲染 DOM 是执行脚本后的结果;差异是诊断入口。
可抓取链接
导航应使用带有效 href 的 a 元素,不能只依赖 onclick 或应用状态。
资源依赖
API、脚本、cookie 或权限失败都可能产生空壳、错误正文或错误 canonical。
完整示范
跟随一次“输入 → 分析 → 中间产物 → 结论”,看见专家是怎样做判断的。
审计客户端渲染的集成目录
教学用合成数据:某 SaaS 有 300 个集成详情页,首个 HTML 只有站点壳,正文由 /api/integrations/{id} 返回;近 30 天 180 页无曝光。
- 页面允许公开访问且没有登录要求
- 目标是验证内容可用性,不把零曝光直接归因于渲染
建立三份快照
- 输入
- 一个有曝光页和三个零曝光页。
- 分析
- 分别保存原始响应、普通浏览器 DOM 和搜索引擎渲染结果,比较 title、h1、说明、canonical、相关链接与结构化数据。
- 输出
- 按元素列出的差异矩阵和带时间的原始文件。
制造依赖故障
- 输入
- API 域名、脚本清单和浏览器开发工具。
- 分析
- 阻断 API、模拟慢速网络和脚本 500,观察页面是否保留对象名称、主要说明和可导航链接;不要只截一张成功截图。
- 输出
- 可重复的故障步骤、控制台与网络证据。
定位责任边界
- 输入
- 差异矩阵和网络瀑布。
- 分析
- 若原始 HTML 缺内容但渲染稳定,风险与性能仍需衡量;若 API 对无 Cookie 请求 403,则先修访问契约;若链接只是按钮事件,则改为真实 href。
- 输出
- 按响应、渲染、发现分层的缺陷单。
定义工程验收
- 输入
- 页面任务与失败样本。
- 分析
- 规定服务端最小内容、正确状态、稳定 canonical 和链接;发布后重新跑同一测试,并观察日志、索引和曝光。曝光变化是结果证据,不是代码修复成功的唯一标准。
- 输出
- 测试用例、发布门槛和复查日期。
决策规则与证据边界
把“看到什么、意味着什么、下一步做什么”连起来,同时区分公开事实、实践推断和未知项。
- 响应 HTML、渲染 DOM、网络错误与 href 是否存在都可直接观测;Google 公开说明其抓取与渲染 JavaScript 的基本过程。
- 把关键内容改为服务端输出通常更易验证,但搜索表现增益需由发布前后证据确认。
- 具体 URL 何时进入渲染队列、采用哪些内部资源限制并不公开。
引导练习
先独立完成,再按提示修正,最后展开参考解法并用 0–4 级量规评分。
根据教学用合成数据,为三个集成页定位最先失败的层级,并写工程验收条件。
给定材料
- 页 A:raw HTML 与渲染 DOM 都有正文;页 B:raw 无正文,API 在无 Cookie 时 403;页 C:正文存在,但所有相关集成使用 div onclick 且直接访问目标返回 200。
- 搜索引擎渲染测试:A 完整,B 只见加载动画,C 能见当前正文但没有可解析的相关链接。
需要提示时再展开
- 分别判断内容获取与 URL 发现,不把所有症状归为同一类。
- 验收必须写成另一个人能够重跑的输入、操作与期望输出。
完成后核对参考解法
A 没有当前可复现的渲染缺陷,应保留为健康对照,继续从需求、索引和竞争层调查。B 的首要问题是公开 API 在无 Cookie 环境拒绝请求:修复匿名访问契约,或让服务器首个 HTML 输出名称、主要说明、canonical 与关键链接;验收需阻断 Cookie 后仍看到这些元素。C 的正文获取正常,发现链却依赖点击事件,应把相关项目输出为具有真实 href 的锚点,并确认目标地址可直接访问、返回正确状态。以上测试只能证明页面表示与链接机制修复,不能宣称必然带来排名提升。
自评分量规
真实项目实战
把理解变成一个可以检查、复核和复用的工作产物。
审计客户端渲染的集成目录
浏览器中有 500 个集成卡片,但爬虫只发现目录页,详情页也长期未索引。
- 保存源 HTML、禁用 JS 视图与渲染 DOM
- 检查卡片是否有真实 href
- 记录渲染所需 API、状态和超时
- 用 URL 检查测试 Google 视图
- 确定 SSR/SSG、分页或渐进增强方案
验收条件
- 核心文本和链接可稳定取得
- 每个详情 URL 独立返回正确状态和元数据
- 无必须滚动/点击才能发现的唯一链接
- URL 检查与本地渲染主体一致
诊断练习
目标不是猜中答案,而是提出竞争假设并选择能区分它们的证据。
页面可抓取,但索引中只有空标题或旧内容。
竞争假设
- 客户端覆盖 title/canonical 失败
- API 对匿名爬虫返回错误
- 缓存提供旧产物
- 源 HTML 的 noindex 让系统跳过渲染
应该检查的证据
- 比较响应源、渲染 DOM 与 URL 检查
- 检查网络请求和 API 响应
- 在无 cookie/慢网络复现
- 核对 CDN 缓存键与部署版本
常见陷阱:只用自己已登录的 Chrome 验证,忽略匿名首访和失败状态。
完成后用本页决策规则复核
- 若观察到:原始 HTML 无正文,但可靠渲染后完整
应优先:评估资源稳定性、渲染证据、性能与故障降级,再决定 SSR/SSG 优先级。
不要把首屏源代码差异直接等同于索引失败。 - 若观察到:API 在无 Cookie 或特定 User-Agent 下返回 401/403
应优先:修复访问规则或在服务器输出核心内容,并加入匿名测试。
不要通过伪装 Googlebot 绕过真正安全控制。 - 若观察到:目标 URL 仅由 onclick 计算且没有 href
应优先:输出语义化 a[href],再增强客户端路由。
链接存在仍不保证目标页值得索引。
自测与误区
先口头回答,再展开检查。无法给出例外与证据,说明还没真正掌握。
你应该能回答
1. 核心任务在 JS 依赖失败时还能理解吗?
参考答案:检查禁用脚本、API 超时或 bundle 失败时,产品名称、核心说明、主要 CTA 去向和导航是否仍存在;至少要返回明确状态而不是空壳 200。
为什么:核心任务的失败降级比“脚本是否存在”更能描述实际风险。
2. URL 发现靠真实链接还是事件处理器?
参考答案:在原始与渲染 HTML 中查找真实 a[href],再从全新会话直接访问目标;只有事件处理器而无 href 时,发现依赖脚本执行。
为什么:语义链接直接暴露地址,点击行为本身不是稳定的 URL 声明。
3. 工程改动解决哪个可复现差异?
参考答案:缺陷单应指出某个元素在特定输入条件下由“存在”变为“缺失”,工程改动后用同一快照与故障测试证明差异消失。
为什么:可复现差异把实现验收与后续排名观察分开。
需要避开的误区
- Google 能执行 JavaScript,所以所有实现都无风险
- 动态渲染是永久首选架构
- 用 JS 后置修改 canonical/noindex 一定被采纳
术语与复盘
用自己的话复述术语和结论;如果只能认出、不能解释,就还没有形成可调用的知识。
- 原始 HTML
- 服务器对首次文档请求返回的未执行脚本文本。
- 渲染 DOM
- 脚本和网络任务执行后浏览器中的文档结构。
- Hydration
- 客户端代码接管服务端已输出标记并添加交互的过程。
- 客户端路由
- 由浏览器脚本切换视图和历史记录的导航方式。
- 优雅降级
- 依赖失败时仍保留核心信息、导航或明确错误状态。
离开本页前记住
- 审计页面表示,不审判技术框架。
- 用户浏览正常只是一个客户端样本。
- 内容获取与链接发现要分开检查。
- 故障注入能暴露隐藏依赖。
- 工程验收先证明差异被修复,排名另行观察。
资料与证据
优先采用官方和一手资料。实践材料用于补充工作方法,不替代机制证据。