|
| 1 | +# VuePress 静态站 SEO 优化复用手册 |
| 2 | + |
| 3 | +这份文档沉淀 JavaGuide 这次 SEO、搜索、sitemap、robots、IndexNow 和部署链路优化经验,适合迁移到另一个 VuePress + Theme Hope 静态内容站点。 |
| 4 | + |
| 5 | +## 适用场景 |
| 6 | + |
| 7 | +- 文档站、技术博客、知识库、教程站。 |
| 8 | +- 使用 VuePress / VuePress Theme Hope / Vite 静态构建。 |
| 9 | +- 希望优化 Bing、Google 等搜索引擎收录和排序。 |
| 10 | +- 站内搜索使用 Algolia DocSearch,或准备从本地 `dist` 生成搜索索引。 |
| 11 | + |
| 12 | +## 核心原则 |
| 13 | + |
| 14 | +- 先做可抓取、可索引、可验证,再做标题和内容优化。 |
| 15 | +- sitemap 的更新频率要符合真实更新节奏,不要全站都写 `weekly` 或 `daily`。 |
| 16 | +- 首页、栏目页、专题页承担关键词入口;普通文章承担长尾词和具体问题。 |
| 17 | +- 首屏正文要先给搜索引擎和用户一段真实内容,广告、提示、组件不要压在最前面。 |
| 18 | +- 站内搜索索引尽量从本地构建产物 `dist` 生成,避免线上抓取受 CDN、反爬、缓存和动态渲染影响。 |
| 19 | +- 每次部署后要同时处理静态文件、CDN、sitemap、robots、搜索索引和搜索引擎提交。 |
| 20 | + |
| 21 | +## 一次完整优化的顺序 |
| 22 | + |
| 23 | +### 1. 先盘点站点现状 |
| 24 | + |
| 25 | +重点检查: |
| 26 | + |
| 27 | +- `docs/.vuepress/config.ts` |
| 28 | +- `docs/.vuepress/theme.ts` |
| 29 | +- `docs/.vuepress/navbar.ts` |
| 30 | +- `docs/.vuepress/public/robots.txt` |
| 31 | +- `package.json` |
| 32 | +- `docs/README.md` |
| 33 | +- 核心栏目 `README.md` |
| 34 | +- 生成后的 `dist/sitemap.xml` |
| 35 | +- 生成后的 `dist/robots.txt` |
| 36 | + |
| 37 | +常用命令: |
| 38 | + |
| 39 | +```bash |
| 40 | +rg -n "seo|sitemap|robots|docsearch|search|head|canonical|pagePatterns" docs/.vuepress package.json |
| 41 | +rg -n "^title:|^description:|^sitemap:|^head:" docs -g "*.md" |
| 42 | +pnpm docs:build |
| 43 | +``` |
| 44 | + |
| 45 | +### 2. 明确关键词和页面分工 |
| 46 | + |
| 47 | +先列出目标关键词,再决定谁来承接: |
| 48 | + |
| 49 | +- 品牌词:首页承接。 |
| 50 | +- 核心大词:专题页或栏目页承接。 |
| 51 | +- 中等竞争词:高质量聚合页承接。 |
| 52 | +- 长尾问题词:具体文章承接。 |
| 53 | + |
| 54 | +示例: |
| 55 | + |
| 56 | +- `Java 面试`:`/home.html` 或面试专题页承接。 |
| 57 | +- `AI 应用开发面试`:`/ai/` 或 AI 面试指南承接。 |
| 58 | +- `计算机基础面试题`:`/cs-basics/` 承接。 |
| 59 | +- `操作系统面试题`:具体操作系统文章承接。 |
| 60 | + |
| 61 | +### 3. 配置技术 SEO |
| 62 | + |
| 63 | +建议在主题配置里启用或补齐: |
| 64 | + |
| 65 | +- canonical。 |
| 66 | +- Open Graph。 |
| 67 | +- sitemap。 |
| 68 | +- feed。 |
| 69 | +- JSON-LD。 |
| 70 | +- robots。 |
| 71 | +- 明确排除不该索引的页面。 |
| 72 | + |
| 73 | +sitemap 建议: |
| 74 | + |
| 75 | +- 全站默认 `monthly`。 |
| 76 | +- 首页、栏目入口、专题入口显式 `weekly`。 |
| 77 | +- 普通文章不单独写 `weekly`,除非真实频繁更新。 |
| 78 | +- 草稿、TODO、snippet、内部片段不进入 sitemap。 |
| 79 | + |
| 80 | +robots 建议: |
| 81 | + |
| 82 | +- 优先由 SEO / Sitemap 插件生成。 |
| 83 | +- 不要在 `public/robots.txt` 和插件生成逻辑之间制造冲突。 |
| 84 | +- 生成结果中应包含: |
| 85 | + |
| 86 | +```txt |
| 87 | +Sitemap: https://example.com/sitemap.xml |
| 88 | +``` |
| 89 | + |
| 90 | +### 4. 优化页面 frontmatter |
| 91 | + |
| 92 | +核心页面建议具备: |
| 93 | + |
| 94 | +```yaml |
| 95 | +--- |
| 96 | +title: 页面主关键词 + 清晰主题 |
| 97 | +description: 用一句自然的话说明覆盖范围、适用人群和页面价值。 |
| 98 | +sitemap: |
| 99 | + changefreq: weekly |
| 100 | + priority: 1 |
| 101 | +head: |
| 102 | + - - meta |
| 103 | + - name: keywords |
| 104 | + content: 核心关键词,相关关键词,长尾关键词 |
| 105 | +--- |
| 106 | +``` |
| 107 | + |
| 108 | +普通文章建议: |
| 109 | + |
| 110 | +- 写好 `title` 和 `description`。 |
| 111 | +- 可以补充 `keywords`。 |
| 112 | +- 默认继承全站 `monthly`。 |
| 113 | +- 不要为了“看起来重要”给每篇文章都写高 priority。 |
| 114 | + |
| 115 | +### 5. 优化正文结构 |
| 116 | + |
| 117 | +每个重点页面尽量做到: |
| 118 | + |
| 119 | +- H1 与页面主题一致。 |
| 120 | +- 首屏先有一段总结性正文。 |
| 121 | +- 广告、提示块、卡片组件不要放在正文前面。 |
| 122 | +- 核心内容尽量出现在页面前半部分。 |
| 123 | +- 内链锚文本要明确,例如“Java 面试指南”“AI Agent 面试题”,不要写“点击这里”。 |
| 124 | +- 同一主题下的文章互相链接,栏目页链接核心文章,核心文章回链栏目页。 |
| 125 | + |
| 126 | +### 6. 处理站内搜索 |
| 127 | + |
| 128 | +推荐做法: |
| 129 | + |
| 130 | +- 关闭 VuePress 本地搜索,避免生成过大的客户端 `searchIndex.js`。 |
| 131 | +- 使用 Algolia DocSearch。 |
| 132 | +- 构建前端时只暴露 Search-Only API Key。 |
| 133 | +- 写索引时使用 Admin API Key,并只放在本地或 CI Secret。 |
| 134 | +- 从本地 `dist` 写索引,而不是让 crawler 在线抓取。 |
| 135 | + |
| 136 | +示例命令: |
| 137 | + |
| 138 | +```bash |
| 139 | +pnpm docs:build |
| 140 | + |
| 141 | +DOCSEARCH_APP_ID=你的 Algolia App ID \ |
| 142 | +DOCSEARCH_INDEX_NAME=你的索引名 \ |
| 143 | +DOCSEARCH_SOURCE_DIR=dist \ |
| 144 | +DOCSEARCH_ADMIN_API_KEY=你的写入索引专用 Key \ |
| 145 | +pnpm docsearch:index |
| 146 | +``` |
| 147 | + |
| 148 | +### 7. 增加 IndexNow 提交 |
| 149 | + |
| 150 | +IndexNow Key 不需要平台申请,可以自己生成: |
| 151 | + |
| 152 | +```bash |
| 153 | +node -e "console.log(crypto.randomUUID())" |
| 154 | +``` |
| 155 | + |
| 156 | +然后在站点根目录部署: |
| 157 | + |
| 158 | +```txt |
| 159 | +https://example.com/{INDEXNOW_KEY}.txt |
| 160 | +``` |
| 161 | + |
| 162 | +文件内容就是 key 本身。 |
| 163 | + |
| 164 | +提交示例: |
| 165 | + |
| 166 | +```bash |
| 167 | +INDEXNOW_KEY=你的 IndexNow Key \ |
| 168 | +pnpm indexnow:submit / /home.html /ai/ |
| 169 | +``` |
| 170 | + |
| 171 | +大范围更新后可以提交 sitemap: |
| 172 | + |
| 173 | +```bash |
| 174 | +INDEXNOW_KEY=你的 IndexNow Key \ |
| 175 | +pnpm indexnow:submit --sitemap |
| 176 | +``` |
| 177 | + |
| 178 | +### 8. 规范部署流程 |
| 179 | + |
| 180 | +VuePress / Vite 会生成带 hash 的静态资源。部署时不要每次清空整个站点目录,否则旧 HTML 或旧客户端可能引用不到旧 chunk。 |
| 181 | + |
| 182 | +推荐策略: |
| 183 | + |
| 184 | +- 非 assets 文件跟随新版本删除。 |
| 185 | +- `/assets/` 只增量覆盖,保留旧 hash 文件一段时间。 |
| 186 | +- Google/Bing/IndexNow 验证文件部署后恢复。 |
| 187 | +- CDN 优先刷新 HTML、sitemap、robots 和变更页面,不要默认全站刷新。 |
| 188 | + |
| 189 | +推荐脚本: |
| 190 | + |
| 191 | +```bash |
| 192 | +set -e |
| 193 | + |
| 194 | +SITE_DIR="/www/wwwroot/example.com" |
| 195 | +DIST_DIR="/github/dist" |
| 196 | +VERIFY_FILE_GOOGLE="/www/wwwroot/google-verification.html" |
| 197 | +VERIFY_FILE_BING="/www/wwwroot/bing-verification.txt" |
| 198 | +INDEXNOW_KEY_FILE="/www/wwwroot/your-indexnow-key.txt" |
| 199 | + |
| 200 | +mkdir -p "$SITE_DIR/assets" |
| 201 | + |
| 202 | +rsync -av --delete \ |
| 203 | + --exclude='assets/' \ |
| 204 | + "$DIST_DIR/" "$SITE_DIR/" |
| 205 | + |
| 206 | +rsync -av \ |
| 207 | + "$DIST_DIR/assets/" "$SITE_DIR/assets/" |
| 208 | + |
| 209 | +cp "$VERIFY_FILE_GOOGLE" "$SITE_DIR/" |
| 210 | +cp "$VERIFY_FILE_BING" "$SITE_DIR/" |
| 211 | +cp "$INDEXNOW_KEY_FILE" "$SITE_DIR/" |
| 212 | +``` |
| 213 | + |
| 214 | +### 9. 部署后验证 |
| 215 | + |
| 216 | +基础验证: |
| 217 | + |
| 218 | +```bash |
| 219 | +curl -I https://example.com/ |
| 220 | +curl -s https://example.com/robots.txt |
| 221 | +curl -s https://example.com/sitemap.xml | head |
| 222 | +``` |
| 223 | + |
| 224 | +sitemap 抽查: |
| 225 | + |
| 226 | +```bash |
| 227 | +node - <<'NODE' |
| 228 | +const fs = require("fs"); |
| 229 | +const xml = fs.readFileSync("dist/sitemap.xml", "utf8"); |
| 230 | +const counts = {}; |
| 231 | +for (const m of xml.matchAll(/<changefreq>(.*?)<\/changefreq>/g)) { |
| 232 | + counts[m[1]] = (counts[m[1]] || 0) + 1; |
| 233 | +} |
| 234 | +console.log(counts); |
| 235 | +NODE |
| 236 | +``` |
| 237 | + |
| 238 | +重点确认: |
| 239 | + |
| 240 | +- `robots.txt` 能访问。 |
| 241 | +- `sitemap.xml` 能访问。 |
| 242 | +- sitemap 中没有 TODO、snippet、内部测试页面。 |
| 243 | +- 首页和栏目页是 `weekly`。 |
| 244 | +- 普通文章是 `monthly`。 |
| 245 | +- IndexNow key 文件能访问。 |
| 246 | +- Bing Webmaster Tools 和 Google Search Console 能正常抓取。 |
| 247 | + |
| 248 | +## 常见坑 |
| 249 | + |
| 250 | +- 全站都写 `daily` 或 `weekly`,但内容几个月才更新一次。 |
| 251 | +- 每篇文章都写高 priority,导致 sitemap 信号失真。 |
| 252 | +- `public/robots.txt` 覆盖插件生成结果,导致 sitemap 丢失。 |
| 253 | +- TODO、snippet、草稿页被生成成正式页面。 |
| 254 | +- 广告或组件放在页面第一屏,正文太靠后。 |
| 255 | +- 只优化 meta,不补正文和内链。 |
| 256 | +- 部署时删除旧 assets,导致旧页面加载 chunk 404。 |
| 257 | +- 把 Admin API Key、IndexNow Key 提交到公开仓库。 |
| 258 | + |
| 259 | +## 可复用提示词 |
| 260 | + |
| 261 | +### 总提示词 |
| 262 | + |
| 263 | +```text |
| 264 | +你是一个熟悉 VuePress、VuePress Theme Hope、静态站 SEO、Algolia DocSearch、sitemap、robots、IndexNow 和 CDN 部署的技术 SEO 工程师。 |
| 265 | +
|
| 266 | +请你阅读当前仓库,帮我对这个静态文档站做一次系统 SEO 优化。目标是提升 Bing 和 Google 对核心关键词的收录和排名,同时不要破坏现有构建、主题配置和部署流程。 |
| 267 | +
|
| 268 | +请按这个顺序执行: |
| 269 | +
|
| 270 | +1. 先检查 VuePress 配置、主题配置、navbar、robots、sitemap、package scripts 和核心栏目 README。 |
| 271 | +2. 判断当前站点是否存在本地搜索索引过大、robots/sitemap 冲突、草稿页面被索引、sitemap 频率不真实、首页和栏目页首屏正文不足等问题。 |
| 272 | +3. 为首页、核心栏目页和重点专题页优化 title、description、keywords、首屏正文、内链锚文本和 sitemap 配置。 |
| 273 | +4. 全站 sitemap 默认使用 monthly,只给首页、栏目页、专题入口保留 weekly。 |
| 274 | +5. 排除 TODO、snippet、草稿、内部页面进入 sitemap 和正式页面构建。 |
| 275 | +6. 如果站内搜索使用 Algolia DocSearch,请保留前端 Search-Only Key 的配置入口,并提供从本地 dist 写入索引的部署命令;Admin Key 不能提交到仓库。 |
| 276 | +7. 增加或整理 IndexNow 提交流程,支持提交变更 URL 和 sitemap。 |
| 277 | +8. 整理一份每次部署后的 SEO 和搜索索引检查清单。 |
| 278 | +9. 最后运行构建和必要的 lint,抽查 dist/sitemap.xml、dist/robots.txt 和关键页面生成结果。 |
| 279 | +
|
| 280 | +约束: |
| 281 | +- 不要引入和现有主题风格冲突的新框架。 |
| 282 | +- 不要为了 SEO 堆砌关键词。 |
| 283 | +- 不要把密钥写入仓库。 |
| 284 | +- 不要把普通文章全部标成 weekly 或高 priority。 |
| 285 | +- 不要删除用户已有的无关改动。 |
| 286 | +
|
| 287 | +请直接修改文件,并在最后总结改了什么、如何验证、部署后还需要手动做什么。 |
| 288 | +``` |
| 289 | + |
| 290 | +### 只做审计的提示词 |
| 291 | + |
| 292 | +```text |
| 293 | +请只审计这个 VuePress 静态站的 SEO 和部署链路,暂时不要改文件。 |
| 294 | +
|
| 295 | +重点检查: |
| 296 | +- robots.txt 和 sitemap 是否正确生成。 |
| 297 | +- sitemap 是否包含不该收录的 TODO、snippet、草稿页。 |
| 298 | +- sitemap changefreq 和 priority 是否符合真实更新频率。 |
| 299 | +- 首页、栏目页、专题页是否有清晰 title、description、首屏正文和内链。 |
| 300 | +- 是否存在本地搜索索引过大影响性能的问题。 |
| 301 | +- Algolia DocSearch 的前端 key 和写入 key 是否边界清晰。 |
| 302 | +- 部署方式是否会删除旧 assets 导致 chunk 404。 |
| 303 | +- 是否有 IndexNow 或搜索引擎提交流程。 |
| 304 | +
|
| 305 | +请输出问题列表、影响、建议修改文件和优先级。 |
| 306 | +``` |
| 307 | + |
| 308 | +### 只做重点栏目优化的提示词 |
| 309 | + |
| 310 | +```text |
| 311 | +请帮我优化这个 VuePress 站点的某个重点栏目页:{栏目路径}。 |
| 312 | +
|
| 313 | +目标关键词: |
| 314 | +- {关键词1} |
| 315 | +- {关键词2} |
| 316 | +- {关键词3} |
| 317 | +
|
| 318 | +请完成: |
| 319 | +- 优化 frontmatter 的 title、description、keywords。 |
| 320 | +- 如果它是栏目入口页,设置合理的 sitemap,例如 weekly;如果是普通文章,继承全站默认 monthly。 |
| 321 | +- 在广告、提示块或组件前补一段自然的首屏介绍。 |
| 322 | +- 增加指向核心文章的内链,锚文本要包含明确主题词。 |
| 323 | +- 不要堆砌关键词,不要改变文章事实。 |
| 324 | +- 修改后运行 markdownlint 和构建验证。 |
| 325 | +``` |
| 326 | + |
| 327 | +### 部署清单提示词 |
| 328 | + |
| 329 | +```text |
| 330 | +请帮我为这个 VuePress/Vite 静态站整理部署清单。 |
| 331 | +
|
| 332 | +要求: |
| 333 | +- 构建命令区分普通 build 和 clean build。 |
| 334 | +- 部署脚本要保留旧 assets,但删除旧 HTML、sitemap、robots 等非 assets 文件。 |
| 335 | +- 写清楚 Google/Bing 验证文件和 IndexNow key 文件如何恢复。 |
| 336 | +- 写清楚部署后 CDN 应刷新哪些路径。 |
| 337 | +- 写清楚什么时候需要重建 Algolia DocSearch 索引。 |
| 338 | +- 写清楚什么时候提交 IndexNow 变更 URL,什么时候提交 sitemap。 |
| 339 | +- 给出部署后 curl 验证命令。 |
| 340 | +``` |
| 341 | + |
| 342 | +## 最小落地清单 |
| 343 | + |
| 344 | +如果时间有限,优先完成这几项: |
| 345 | + |
| 346 | +- 确认 `robots.txt` 包含 sitemap。 |
| 347 | +- 确认 `sitemap.xml` 生成正确,且没有草稿页。 |
| 348 | +- 全站默认 `monthly`,首页和栏目页 `weekly`。 |
| 349 | +- 核心入口页补齐 title、description、首屏正文和内链。 |
| 350 | +- 关闭本地搜索索引,使用 DocSearch 或其他远程搜索。 |
| 351 | +- 部署后提交 IndexNow。 |
| 352 | +- 搜索索引从 `dist` 生成。 |
| 353 | +- 部署时保留旧 `/assets/*`。 |
0 commit comments