Jamdesk Documentation logo

SEO 优化

控制搜索引擎和社交预览中的标题、描述与元标签。Jamdesk 自动生成站点地图和 Open Graph 图片。

在 frontmatter 中设置标题、描述和元数据,以控制你的文档在搜索引擎和社交预览中的显示方式。

Jamdesk 自动完成的工作

元标签

frontmatter 中的标题和描述会转换为元标签。

Open Graph

为每个页面生成社交分享图片。

站点地图与 Robots

每次构建时生成 XML 站点地图和 robots.txt。

JSON-LD

每个页面都包含 Schema.org 结构化数据,以支持富媒体搜索结果。

IndexNow

每次构建后,将变更的 URL 提交给搜索引擎。

AI 端点

llms.txt 和 MCP 服务器,供 AI 工具读取你的文档。

优化内容

编写有效的 Frontmatter

---
title: User Authentication    # Under 60 characters
description: Set up OAuth, JWT, and session-based authentication  # 120-160 characters
---

关键词前置。 "Authentication setup" 比 "How to set up authentication" 更好。

页面标题

  • 保持在 60 个字符以内,计入你的标题格式所添加的站点名称。过长的标题会在搜索结果中被截断
  • 将主要关键词放在靠近开头的位置
  • 确保每个标题在你的文档中都是唯一的

默认情况下,浏览器标签页和搜索结果中的标题为 页面标题 — 站点名称。你可以在 docs.json 中使用 seo.titleTemplate 进行修改。将 %s 放在页面标题的位置:

{
  "seo": {
    "titleTemplate": "%s | Acme"
  }
}

这样,标题为 Getting started 的页面将显示为 Getting started | Acme。如果只想使用页面标题、不包含站点名称,可以单独使用 "%s"。缺少 %s 的模板会导致构建失败,jamdesk validate 会显示该错误。链接预览(og:title 和 twitter:title)仍然只显示页面标题。

部分页面不会使用模板。没有 title 的页面会显示你的 name 加上 "Documentation",例如 Acme Documentation;如果你的 name 已经以 "Docs" 或 "Documentation" 结尾,则只显示 name。标题与你的 name 相同的页面只显示该标题。

jamdesk validate 和 jamdesk dev 从 CLI 1.1.220 版本开始支持 seo.titleTemplate。使用 npm i -g jamdesk@latest 升级。

描述

  • 目标长度为 120-160 个字符
  • 概括读者将学到的内容
  • 自然地包含相关关键词

自动生成的备用内容。 当 frontmatter 中缺少 description 时,Jamdesk 会从页面内容中提取第一段正文文本(最多 155 个字符)。标题、代码块、图片和 MDX 组件会被跳过。该文本会填充 <meta name="description">、Open Graph 和 Twitter 卡片。明确编写的描述效果最佳。

控制索引收录

全站设置

在 docs.json 中设置默认的 robots 行为:

docs.json
{
  "seo": {
    "metatags": {
      "robots": "index, follow"
    }
  }
}

单页控制

在 frontmatter 中覆盖特定页面的索引设置:

---
title: Internal Notes
noindex: true
---

以下情况请使用 noindex:

  • 草稿或正在编写中的页面
  • 内部文档
  • 已弃用但需保留以供参考的内容

搜索索引与 AI 摄取

robots 元数据和 noindex 控制的是搜索引擎:页面是否出现在 Google 和你的 sitemap.xml 中。它们对 AI 工具读取的 llms.txt 和 llms-full.txt 文件没有影响。将 seo.ai.llmsTxt 设置为 false 可停止发布这些文件(参见关闭 llms.txt)。这两项控制是相互独立的:页面可以被搜索引擎索引,同时排除在 AI 采集之外,反之亦然。

规范 URL

如果你的文档可以通过多个 URL 访问,请设置规范 URL:

---
title: Getting Started
canonical: https://docs.example.com/getting-started
---

你也可以在 docs.json 中设置全站的规范 URL 基础地址。Jamdesk 会将每个页面的路径追加到该地址之后:

docs.json
{
  "seo": {
    "metatags": {
      "canonical": "https://docs.acme.com"
    }
  }
}

社交预览与 Open Graph

Jamdesk 为每个页面生成一张带品牌标识的 1200×630 社交卡片。你可以在 frontmatter 中使用扁平的顶层键或嵌套的 seo: 块来覆盖任何社交标签。当同一个键两种方式都设置时,扁平的顶层值优先。

OpenGraph 预览

在 X、Facebook、LinkedIn 等平台上预览任意页面的卡片。验证其 Open Graph 标签。

---
title: API Reference
description: REST API endpoints and authentication
"og:title": API Reference — Acme
"og:description": Everything you need to call the Acme API
"og:image": /images/api-social-card.png
"twitter:card": summary_large_image
"twitter:creator": "@acme"
keywords: ["api", "rest", "authentication"]
canonical: https://docs.acme.com/api-reference
---

支持的标签

分组标签
Open Graphog:title、og:description、og:image、og:image:width、og:image:height、og:image:alt、og:url、og:type、og:site_name、og:locale、og:video、og:audio
文章og:type: article,并配合 article:published_time、article:modified_time、article:author、article:section、article:tag
Twitter / Xtwitter:card、twitter:title、twitter:description、twitter:image、twitter:image:alt、twitter:site、twitter:creator、twitter:player、应用卡片标签
其他keywords、author、robots、googlebot、google-site-verification、theme-color,以及任何自定义标签(自定义标签应放在 seo: 下)

自定义 OG 图片尺寸。 og:image:width 和 og:image:height 仅在 customImage 为 "replace" 时生效。请将它们与所描述的 og:image 设置在同一位置,即页面 frontmatter 或 seo.metatags 中。生成的卡片始终为 1200×630。

自定义标签。 任意元标签(例如 x-pinterest)会以 <meta name="..."> 的形式输出。请将它们放在 seo: 块下。若以扁平方式书写,则只有被识别的 SEO 键会被采用。

Twitter / X 卡片类型

twitter:card 标签控制分享链接时 X(以及其他平台)所使用的布局:

值效果
summary左侧为小型方形缩略图,标题和描述位于其旁。紧凑。
summary_large_image顶部为全宽大图,标题和描述位于其下。

使用 summary_large_image 可获得带品牌标识的 1200×630 卡片,图片以全宽显示。

全站默认图片

在 docs.json 中为每个页面设置备用社交图片。任何自行设置了 og:image 的页面都会覆盖该默认值:

docs.json
{
  "seo": {
    "metatags": {
      "og:image": "https://docs.acme.com/images/default-card.png"
    }
  }
}

发布前预览。 构建后,将页面 URL 粘贴到 OpenGraph 预览工具中。它会展示卡片在各平台上的呈现效果,并验证 Open Graph 标签。它还会检查图片尺寸,并说明如何修复问题。

自定义社交卡片

除非你在 docs.json 中添加 seo.socialCard,否则生成的卡片将保持当前外观。只需设置你想更改的键:

docs.json
{
  "seo": {
    "socialCard": {
      "theme": "dark",
      "brandColor": true,
      "accentBar": false,
      "siteName": false,
      "customImage": "replace"
    }
  }
}
键默认值效果
theme"light""dark" 使用浅色文字搭配深色背景,并使用你的 logo.dark 图片。
brandColorfalsetrue 使用 colors.primary 为底部色条和章节徽标着色。深色卡片若设置了 colors.light,则使用它。若未设置 colors,卡片使用主题的强调色。false 保持默认的红色。
accentBartruefalse 移除卡片底部的彩色条。
siteNametruefalse 隐藏徽标下方的站点名称。当你的徽标已经包含名称时使用。
customImage"background""background" 在你的 og:image 上方绘制页面标题。"replace" 将你的 og:image 作为整张卡片使用。

卡片只能绘制 SVG、PNG 和 JPG 格式的徽标。Jamdesk 会在构建时将仓库中的 PNG 和 JPG 徽标文件转换为 WebP。这样,卡片通常会显示你的 favicon,并保留站点名称,即使设置了 siteName: false。若要在卡片上显示完整徽标,请使用 SVG 徽标。深色卡片请使用 SVG 格式的 logo.dark。

卡片无法绘制 SVG 徽标中的文字,这些文字会显示为空白。请在设计工具中将文字转换为轮廓(路径),然后重新导出 SVG。在 Figma 中,选中文字并使用 Flatten。在 Illustrator 中,使用 Type > Create Outlines。当构建过程在卡片的 SVG 徽标中发现文字时,会显示相应提示。设置为完整 URL(https://...)的徽标不会被检查。

当徽标颜色与卡片背景对比不明显时,徽标文字会回退为普通文字颜色。除非该颜色与卡片背景几乎相同,否则色条会保留你的品牌色;若几乎相同,则色条显示为灰色。

默认情况下,Jamdesk 会在你的 og:image 上方绘制页面标题。设置 "customImage": "replace" 可以原样显示自带文字或设计的图片。

请选择与用作卡片背景的 og:image 相匹配的 theme:深色图片使用 dark,浅色图片使用 light。

在 replace 模式下,Jamdesk 不会在图片上绘制标题。seo.metatags 中的 og:image 适用于每个页面。自行设置了 og:image 的页面则使用该图片。只有两者都未设置的页面才会生成卡片。请使用 1200×630 的 PNG 或 JPG。部分平台不显示 WebP 或 SVG 图片。

社交网站会缓存链接预览。已分享过的链接在你更改这些设置后,可能仍会在一段时间内显示旧卡片。请使用 OpenGraph 预览工具检查新卡片。

较旧版本的 Jamdesk CLI 会在 jamdesk validate 和 jamdesk dev 中拒绝 seo.socialCard 和 seo.titleTemplate。使用 npm i -g jamdesk@latest 升级。

站点地图与 Robots.txt

Jamdesk 每次构建时都会生成 sitemap.xml 和 robots.txt。

文件用途
sitemap.xml列出所有页面及其最后修改日期,供搜索引擎使用
robots.txt允许所有爬虫访问,并指向站点地图

查找位置

URL 取决于你的文档位于根域名还是 /docs 子路径下:

如果你的文档位于域名根目录下(例如 docs.acme.com 或 acme.jamdesk.app):

https://docs.acme.com/sitemap.xml
https://docs.acme.com/robots.txt

站点地图包含的内容

  • 所有已发布的页面(不包括带有 noindex 或 hidden frontmatter 的页面)
  • 可用时,取自 frontmatter 的最后修改日期
  • 每周更新频率

从站点地图中排除页面

在 frontmatter 中添加 noindex,即可使页面不出现在站点地图和搜索引擎中:

---
title: Internal Notes
noindex: true
---

设置了 hidden: true 的页面同样会被排除。

JSON-LD 结构化数据

每个页面都会包含 schema.org 结构化数据,以 <script type="application/ld+json"> 标签的形式输出,包含两种模式:

  • WebSite:你的站点名称、URL 和描述(来自 docs.json)。
  • BreadcrumbList:从首页到当前页面的导航路径,根据你的 navigation 配置生成。

无需任何配置。搜索引擎会使用这些数据生成富媒体结果,例如搜索列表中的面包屑导航。

验证你的标记。 将任意页面 URL 粘贴到 Google 富媒体搜索结果测试工具中,以确认结构化数据已被识别。

IndexNow

Jamdesk 在每次构建后,会将变更页面的 URL 提交给 IndexNow。Bing、Yandex 以及其他参与的搜索引擎无需等待下一次抓取周期,即可得知这些变更。

  • 每次构建成功后触发
  • 仅提交已变更的页面
  • 非阻塞。绝不会延迟你的构建
  • 无需任何配置

最佳实践

发布前请逐项检查以下清单:

发布前检查清单

  • 标题唯一: 每个页面都有独特、描述性的标题,且不超过 60 个字符。
  • 描述准确: 描述以 120-160 个字符概括页面内容。
  • 标题层级清晰: 标题遵循清晰的层级结构:一个 H1,然后是 H2 → H3。
  • 链接描述性强: 内部链接使用有意义的锚文本,切勿使用 "click here"。
  • 图片替代文字: 每张图片都有替代文字,以便无障碍访问和图片搜索。
  • 社交图片: 在关键页面上设置自定义 og:image,或依赖自动生成的卡片。使用 OpenGraph 预览工具进行验证。

相关文章

Frontmatter 参考

所有可用的 frontmatter 选项

docs.json 参考

全站配置选项

OpenGraph 预览工具

在所有平台上预览并验证你的社交卡片