1. 在 CI/CD 流水线中内嵌 SEO 质量门禁
绝大多数严重的线上 SEO 事故(如误删 Canonical 标签、顶层 Suspense 导致爬虫抓到 `<div hidden id="S:0">`、误加全局 `noindex` 或破坏 JSON-LD 语法)都源于缺乏自动化回归测试的日常代码发版。
通过将 `npm run verify:seo`(`scripts/verify-seo.mjs`)集成到 GitHub Actions 或 GitLab CI 的构建阶段,任何破坏白帽 SEO 基准的代码提交都会在合并前被自动拦截:
.github/workflows/seo-quality-gate.ymlyaml
name: White-Hat SEO Quality Gate
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
verify-seo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
- run: npm ci
- run: npm run typecheck
- run: npm run build
- name: Start production server and run SEO verification
run: |
npm run start -- -p 3100 &
sleep 4
SEO_VERIFY_BASE_URL=http://127.0.0.1:3100 npm run verify:seo2. 发布后增量 URL 推送编排流程
当新专栏文章或技术文档通过 CI/CD 门禁并部署上线后,工作流引擎会自动比对本次构建与上一版本的 Sitemap 内容摘要,仅筛选出新增或 `lastmod` 发生更新的规范 URL,分批推送到 IndexNow 与百度搜索资源平台普通收录接口:
- 1读取最新生成的 `/sitemap.xml`,提取所有 `<loc>` 与 `<lastmod>` 节点。
- 2对变更列表中的每条 URL 执行 HEAD/GET 预检,确认返回 200 OK 且自引用 Canonical 匹配。
- 3调用 IndexNow 批量接口提交变更 URL,并校验 `/api/indexnow/key` 密钥端点可达性。
- 4在控制台记录推送批次日志,并追踪未来 24 小时内 Bingbot 与 Baiduspider 对该批 URL 的实际回访时间。
3. 内置 SEO 门禁十项核心断言清单
SISEO 标准验证套件(`scripts/verify-seo.mjs`)默认对全站核心路由、文章详情页与文档详情页执行以下十项严格断言:
| 断言编号 | 检查项目 | 通过标准 | 拦截风险类型 |
|---|---|---|---|
| ASSERT-01 | HTTP 状态码 | 所有公开路由必须返回 HTTP 200 | 路由崩溃、500 错误或意外 404 |
| ASSERT-02 | 同步 <head> Title | </head> 之前必须包含非空 <title> 且含品牌词 | 异步流式元数据推迟到 <body> 导致爬虫漏读 |
| ASSERT-03 | 自引用 Canonical | 必须精确等于 https://www.siseo.cn + 规范路径 | 相对路径错误、测试域名残留或权重分散 |
| ASSERT-04 | 唯一 H1 标签 | 去脚本 HTML 中 <h1> 数量严格等于 1 | 多 H1 主题稀释或缺失主标题 |
| ASSERT-05 | 零隐藏流式容器 | 不含包裹 <main> 或 <h1> 的 <div hidden id="S:0"> | Suspense 阻塞首屏导致爬虫抓到空壳 |
| ASSERT-06 | 可见文本丰度 | 可见纯文本长度 >= 300 字符(文章页 >= 1000 字符) | 客户端渲染空壳或薄弱内容页 |
| ASSERT-07 | 站内链接密度 | 每页有效 <a> 标签数量 >= 8 | 内链断裂或孤岛页面 |
| ASSERT-08 | JSON-LD 结构化数据 | JSON.parse 校验通过且包含指定 Schema 实体 | 结构化数据拼写错误或实体缺失 |
| ASSERT-09 | Sitemap 与 Robots 完整性 | /robots.txt 与 /sitemap.xml 均返回 200 且全覆盖 | 站点地图漏页或含非法查询参数 |
| ASSERT-10 | 白帽合规词汇审查 | 全站 HTML 零非合规敏感词条 | 非合规词汇污染品牌与域名安全 |