# 结构化数据
Source: https://blume.ndjp.net/docs/discoverability/structured-data/
English: https://useblume.dev/docs/discoverability/structured-data

Blume 会在每个页面的 `<head>` 中输出 [schema.org](https://schema.org) JSON-LD，让搜索引擎理解你的内容。默认开启：

```ts blume.config.ts lineNumbers
seo: {
  structuredData: true,
}
```

每个页面包含：

- 一个用于标识站点的 **WebSite** 节点，
- 把页面本身作为 **article** —— blog 文章为 `BlogPosting`，更新日志和文档为 `TechArticle` —— 带上它的描述和发布日期，
- 一个由导航路径构建的 **BreadcrumbList**。

当 [`deployment.site`](/docs/deployment/) 已设置时，URL 是绝对的。标记了 [`seo.noindex`](/docs/discoverability/metadata/) 的页面会被跳过。当 [`lastModified`](/docs/configuration/) 开启时，每个页面的日期还会作为 `dateModified` 输出。

## 站点标识

WebSite 节点只说明存在这样一个站点；它没说这是_什么_，也没说由_谁_运营 —— 而 AI 智能体在推荐或引用你之前，读 JSON-LD 正是为了这些。有两个可选配置块可以补上这些信息，它们都需要 `deployment.site`（这些节点带的是绝对标识符）：

```ts blume.config.ts lineNumbers
seo: {
  organization: {
    name: "Acme", // 默认为站点标题
    email: "hello@acme.com",
    telephone: "+1 555 0100",
    address: { addressLocality: "Sydney", addressCountry: "AU" },
    logo: "/logo.svg",
    sameAs: ["https://github.com/acme", "https://x.com/acme"],
  },
  software: {
    license: "MIT",
    operatingSystem: "Node.js 22+",
    price: 0, // 输出为 Offer；0 表示免费
    sameAs: ["https://www.npmjs.com/package/acme"],
  },
}
```

`organization` 会给每个页面加上一个 **Organization** 节点 —— WebSite 和 article 节点把它作为 `publisher` 引用 —— 其中邮箱和电话组成一个 `ContactPoint`（`contactType` 默认为 `"customer support"`），地址作为一个 `PostalAddress`，商业信息核验查的就是这两项。`name` 和 `url` 默认为站点的值；根相对的 `logo` 会像任何页面 URL 一样被转成绝对地址。

`software` 会给首页加上一个 **SoftwareApplication** 节点：产品名称和描述（默认取站点的）、`applicationCategory`（默认 `"DeveloperApplication"`）、操作系统、许可证、设置了 `price` 时的 `Offer`，以及 `sameAs` 中的注册表或仓库 URL。传入 `software: true` 即可采用全部默认值。若配置了 organization，它会作为该节点的 `publisher` 被引用。

## 自定义页面

通过 `PageLayout` 渲染的自定义 [`.astro` 页面](/docs/advanced/custom-pages/)会输出同样的 `WebSite` 图谱，因此营销首页不会是唯一没有结构化数据的那个 URL。传入 `structuredDataEnabled={config.structuredData}` 让它与本设置保持同步，或传入 `structuredDataEnabled={false}` 单独为该页面关闭。