Schema.org 结构化数据实战指南
什么是结构化数据?
结构化数据(Structured Data) 是一种标准化的格式,用于向搜索引擎提供关于页面内容的明确信息。它就像给网页内容贴上"标签",让搜索引擎不再需要"猜测"页面在讲什么,而是能够精确理解每个内容元素的含义。
为什么结构化数据如此重要?
1. 获得 Rich Snippets(富媒体摘要)
使用结构化数据的页面可以在搜索结果中展示增强型内容:
| 类型 | 展示效果 |
|---|---|
| 产品 | 价格、评分、库存状态 |
| 文章 | 发布时间、作者头像、阅读时间 |
| FAQ | 直接展开问答列表 |
| 菜谱 | 烹饪时间、卡路里、评分 |
| 活动 | 日期、地点、票价 |
| 本地商家 | 营业时间、电话、地址、评价 |
2. 提升点击率(CTR)
根据 Google 的研究,Rich Snippets 可以将点击率提升 20-30%,因为:
- 占据更多搜索结果空间
- 提供更丰富的预览信息
- 建立用户信任感
3. 支持语音搜索和 AI 助手
结构化数据是语音搜索和 AI 搜索(如 Google SGE)理解网页内容的核心依据。
Schema.org 基础概念
Schema.org 是什么?
Schema.org 是由 Google、Microsoft、Yahoo 和 Yandex 联合创建的结构化数据词汇表。它定义了数百种类型(Type)和属性(Property),覆盖了几乎所有网页内容场景。
三种实现格式
<!-- 1. JSON-LD(推荐):独立的 script 标签 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "文章标题",
"author": "作者名"
}
</script>
<!-- 2. Microdata:嵌入 HTML 属性 -->
<article itemscope itemtype="https://schema.org/Article">
<h1 itemprop="headline">文章标题</h1>
<span itemprop="author">作者名</span>
</article>
<!-- 3. RDFa:类似 Microdata,使用不同属性 -->
<article vocab="https://schema.org/" typeof="Article">
<h1 property="headline">文章标题</h1>
<span property="author">作者名</span>
</article>
为什么推荐 JSON-LD?
- ✅ 与 HTML 完全分离,不影响页面结构
- ✅ 易于动态生成和维护
- ✅ Google 明确推荐
- ✅ 便于调试和验证
- ✅ 支持嵌套和复杂结构
常用结构化数据类型详解
1. Article(文章)
适用于博客文章、新闻报道、技术文档等。
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Vue 3 响应式系统深度解析",
"description": "详细讲解 Vue 3 的核心特性和响应式原理",
"image": [
"https://example.com/images/vue3-guide-1x1.jpg",
"https://example.com/images/vue3-guide-4x3.jpg",
"https://example.com/images/vue3-guide-16x9.jpg"
],
"datePublished": "2026-01-15T08:00:00+08:00",
"dateModified": "2026-01-15T10:30:00+08:00",
"author": [{
"@type": "Person",
"name": "张三",
"url": "https://example.com/authors/zhangsan"
}],
"publisher": {
"@type": "Organization",
"name": "HTMLPAGE",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/articles/vue3-guide"
},
"wordCount": 3500,
"articleSection": "前端开发",
"keywords": ["Vue 3", "响应式系统", "Composition API"]
}
关键属性说明:
| 属性 | 必需 | 说明 |
|---|---|---|
| headline | ✅ | 文章标题,建议 < 110 字符 |
| image | ✅ | 至少一张图片,推荐提供多种比例 |
| datePublished | ✅ | 首次发布时间,ISO 8601 格式 |
| dateModified | 推荐 | 最后修改时间 |
| author | ✅ | 作者信息,可以是数组 |
| publisher | ✅ | 发布组织信息 |
2. Product(产品)
适用于电商产品页、商品详情等。
{
"@context": "https://schema.org",
"@type": "Product",
"name": "专业版网站模板",
"image": [
"https://example.com/products/template-pro.jpg"
],
"description": "适用于企业官网的专业模板,响应式设计,支持暗黑模式",
"sku": "TPL-PRO-001",
"brand": {
"@type": "Brand",
"name": "HTMLPAGE"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/template-pro",
"priceCurrency": "CNY",
"price": "299",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "156"
},
"review": [{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"author": {
"@type": "Person",
"name": "李四"
},
"reviewBody": "非常好用的模板,节省了大量开发时间!"
}]
}
产品可用性选项:
// 常用的 availability 值
const availabilityOptions = {
inStock: "https://schema.org/InStock", // 有货
outOfStock: "https://schema.org/OutOfStock", // 缺货
preOrder: "https://schema.org/PreOrder", // 预购
backOrder: "https://schema.org/BackOrder", // 补货中
discontinued: "https://schema.org/Discontinued", // 已停产
limitedAvailability: "https://schema.org/LimitedAvailability" // 限量
};
3. FAQPage(常见问题)
适用于 FAQ 页面、产品问答等。
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "HTMLPAGE 支持哪些浏览器?",
"acceptedAnswer": {
"@type": "Answer",
"text": "HTMLPAGE 支持所有现代浏览器,包括 Chrome、Firefox、Safari、Edge 的最新两个版本,以及 iOS Safari 和 Android Chrome。"
}
}, {
"@type": "Question",
"name": "如何导出我的网站?",
"acceptedAnswer": {
"@type": "Answer",
"text": "在编辑器右上角点击「导出」按钮,选择导出格式(HTML/ZIP),即可下载完整的网站文件。"
}
}, {
"@type": "Question",
"name": "支持自定义域名吗?",
"acceptedAnswer": {
"@type": "Answer",
"text": "支持!在项目设置中添加你的域名,按照指引配置 DNS 解析即可。专业版支持无限自定义域名。"
}
}]
}
4. BreadcrumbList(面包屑)
帮助搜索引擎理解页面在网站中的层级位置。
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "首页",
"item": "https://example.com"
}, {
"@type": "ListItem",
"position": 2,
"name": "前端开发",
"item": "https://example.com/frontend"
}, {
"@type": "ListItem",
"position": 3,
"name": "Vue 3 教程",
"item": "https://example.com/frontend/vue3"
}, {
"@type": "ListItem",
"position": 4,
"name": "响应式系统深度解析"
}]
}
5. Organization(组织)
适用于企业官网、关于我们页面。
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "HTMLPAGE",
"alternateName": "HTMLPAGE 在线建站平台",
"url": "https://htmlpage.cn",
"logo": "https://htmlpage.cn/logo.png",
"sameAs": [
"https://github.com/htmlpage",
"https://twitter.com/htmlpage",
"https://weibo.com/htmlpage"
],
"contactPoint": [{
"@type": "ContactPoint",
"telephone": "+86-400-123-4567",
"contactType": "customer service",
"availableLanguage": ["Chinese", "English"]
}],
"address": {
"@type": "PostalAddress",
"streetAddress": "科技园路100号",
"addressLocality": "深圳市",
"addressRegion": "广东省",
"postalCode": "518000",
"addressCountry": "CN"
}
}
6. WebSite(网站)+ 站内搜索
启用搜索框功能,让用户直接在搜索结果中搜索你的网站。
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "HTMLPAGE",
"url": "https://htmlpage.cn",
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://htmlpage.cn/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
}
在现代框架中实现结构化数据
Nuxt 3 实现方案
方案 1:使用 useHead 组合式函数
// composables/useStructuredData.ts
export function useStructuredData(data: Record<string, unknown>) {
useHead({
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
...data
})
}
]
})
}
// 在页面中使用
// pages/articles/[slug].vue
<script setup lang="ts">
const { data: article } = await useFetch(`/api/articles/${route.params.slug}`)
useStructuredData({
'@type': 'Article',
headline: article.value.title,
description: article.value.description,
image: article.value.coverImage,
datePublished: article.value.publishedAt,
dateModified: article.value.updatedAt,
author: {
'@type': 'Person',
name: article.value.author.name,
url: article.value.author.url
},
publisher: {
'@type': 'Organization',
name: 'HTMLPAGE',
logo: {
'@type': 'ImageObject',
url: 'https://htmlpage.cn/logo.png'
}
}
})
</script>
方案 2:使用 Nuxt SEO 模块
# 安装
npx nuxi module add @nuxtjs/seo
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxtjs/seo'],
site: {
url: 'https://htmlpage.cn',
name: 'HTMLPAGE',
description: '专业的在线建站平台'
},
schemaOrg: {
identity: {
type: 'Organization',
name: 'HTMLPAGE',
url: 'https://htmlpage.cn',
logo: 'https://htmlpage.cn/logo.png'
}
}
})
<!-- pages/articles/[slug].vue -->
<script setup lang="ts">
import { useSchemaOrg, defineArticle, defineBreadcrumb } from '@unhead/schema-org/vue'
const article = await $fetch(`/api/articles/${route.params.slug}`)
useSchemaOrg([
defineArticle({
headline: article.title,
description: article.description,
image: article.coverImage,
datePublished: article.publishedAt,
dateModified: article.updatedAt,
author: {
name: article.author.name,
url: article.author.url
}
}),
defineBreadcrumb({
itemListElement: [
{ name: '首页', item: '/' },
{ name: '文章', item: '/articles' },
{ name: article.title }
]
})
])
</script>
Next.js 实现方案
方案 1:直接在页面中添加 JSON-LD
// app/articles/[slug]/page.tsx
import { Metadata } from 'next'
type Props = {
params: { slug: string }
}
async function getArticle(slug: string) {
const res = await fetch(`https://api.example.com/articles/${slug}`)
return res.json()
}
// 生成元数据
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const article = await getArticle(params.slug)
return {
title: article.title,
description: article.description,
openGraph: {
title: article.title,
description: article.description,
images: [article.coverImage]
}
}
}
// 页面组件
export default async function ArticlePage({ params }: Props) {
const article = await getArticle(params.slug)
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Article',
headline: article.title,
description: article.description,
image: article.coverImage,
datePublished: article.publishedAt,
dateModified: article.updatedAt,
author: {
'@type': 'Person',
name: article.author.name,
url: article.author.url
},
publisher: {
'@type': 'Organization',
name: 'HTMLPAGE',
logo: {
'@type': 'ImageObject',
url: 'https://htmlpage.cn/logo.png'
}
}
}
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<article>
<h1>{article.title}</h1>
{/* 文章内容 */}
</article>
</>
)
}
方案 2:使用 next-seo 库
npm install next-seo
// app/articles/[slug]/page.tsx
import { ArticleJsonLd, BreadcrumbJsonLd } from 'next-seo'
export default async function ArticlePage({ params }: Props) {
const article = await getArticle(params.slug)
return (
<>
<ArticleJsonLd
type="Article"
url={`https://example.com/articles/${params.slug}`}
title={article.title}
images={[article.coverImage]}
datePublished={article.publishedAt}
dateModified={article.updatedAt}
authorName={article.author.name}
publisherName="HTMLPAGE"
publisherLogo="https://htmlpage.cn/logo.png"
description={article.description}
/>
<BreadcrumbJsonLd
itemListElements={[
{ position: 1, name: '首页', item: 'https://example.com' },
{ position: 2, name: '文章', item: 'https://example.com/articles' },
{ position: 3, name: article.title }
]}
/>
<article>
<h1>{article.title}</h1>
{/* 文章内容 */}
</article>
</>
)
}
验证与调试工具
Google Rich Results Test
最权威的验证工具:https://search.google.com/test/rich-results
// 快速验证脚本:在控制台检查页面的结构化数据
(function() {
const scripts = document.querySelectorAll('script[type="application/ld+json"]');
scripts.forEach((script, index) => {
try {
const data = JSON.parse(script.textContent);
console.log(`结构化数据 #${index + 1}:`, data);
} catch (e) {
console.error(`结构化数据 #${index + 1} 解析错误:`, e);
}
});
})();
Schema Markup Validator
Schema.org 官方验证器:https://validator.schema.org/
常见错误与修复
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
| Missing field | 必需字段缺失 | 添加缺失字段 |
| Invalid value | 值格式不正确 | 检查日期、URL 格式 |
| Duplicate | 同一页面重复定义 | 合并或删除重复项 |
| Invalid JSON | JSON 语法错误 | 使用 JSON 验证器检查 |
日期格式正确写法:
// ✅ 正确的 ISO 8601 格式
const correctFormats = [
"2026-01-15", // 仅日期
"2026-01-15T08:00:00", // 日期+时间
"2026-01-15T08:00:00+08:00", // 带时区
"2026-01-15T08:00:00Z" // UTC 时间
];
// ❌ 错误格式
const wrongFormats = [
"2026/01/15", // 斜杠分隔
"15-01-2026", // 日期顺序错误
"Jan 15, 2026" // 非 ISO 格式
];
高级技巧与最佳实践
1. 多类型组合
一个页面可以包含多个结构化数据类型:
[
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Vue 3 响应式系统深度解析",
"description": "...",
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [...]
}
},
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Vue 3 响应式系统深度解析",
...
}
]
2. 动态生成结构化数据
// utils/structuredData.ts
export function generateArticleSchema(article: Article) {
return {
'@context': 'https://schema.org',
'@type': 'Article',
headline: article.title,
description: article.excerpt,
image: article.images.map(img => ({
'@type': 'ImageObject',
url: img.url,
width: img.width,
height: img.height
})),
datePublished: new Date(article.createdAt).toISOString(),
dateModified: new Date(article.updatedAt).toISOString(),
author: article.authors.map(author => ({
'@type': 'Person',
name: author.name,
url: author.profileUrl
})),
publisher: {
'@type': 'Organization',
name: 'HTMLPAGE',
logo: {
'@type': 'ImageObject',
url: 'https://htmlpage.cn/logo.png',
width: 200,
height: 60
}
},
mainEntityOfPage: {
'@type': 'WebPage',
'@id': article.canonicalUrl
},
wordCount: article.content.split(/\s+/).length,
articleSection: article.category,
keywords: article.tags.join(', ')
}
}
3. SEO 检查清单
## 发布前结构化数据检查
### 必须检查
- [ ] 使用 Rich Results Test 验证无错误
- [ ] 所有必需字段都已填写
- [ ] 日期使用 ISO 8601 格式
- [ ] 图片 URL 可访问且 HTTPS
- [ ] @type 值拼写正确
### 推荐检查
- [ ] 提供多种图片比例(1:1, 4:3, 16:9)
- [ ] 文章包含 author 和 publisher
- [ ] 产品包含 offers 和 aggregateRating
- [ ] FAQ 至少包含 3 个问答
### 高级检查
- [ ] 使用 Schema.org 官方验证器二次确认
- [ ] 在 Google Search Console 监控结构化数据报告
- [ ] 检查移动端页面的结构化数据是否一致
总结
结构化数据是现代 SEO 的核心技术之一。通过正确实现 Schema.org 标记,你的网站可以在搜索结果中获得更丰富的展示效果,显著提升点击率和用户信任度。
关键要点回顾
- ✅ 选择 JSON-LD 格式:与 HTML 分离,易于维护和调试
- ✅ 覆盖主要内容类型:Article、Product、FAQ、BreadcrumbList、Organization
- ✅ 框架集成:Nuxt 使用 useHead 或 @nuxtjs/seo,Next.js 使用 next-seo
- ✅ 持续验证:使用 Google Rich Results Test 确保无错误
- ✅ 监控效果:通过 Search Console 跟踪 Rich Results 展示情况
立即行动
- 审查你的网站,确定需要添加结构化数据的页面类型
- 从最重要的页面开始实施(首页、产品页、文章页)
- 使用验证工具确保实现正确
- 在 Search Console 中监控效果


