改善开发者结构化数据编写体验

文 / Eyas Sharaiha,地理工程与开放源代码 scheme-dts 项目组 

尽管我们仍在期待着语义网 (Semantic Web) 在未来能够完全实现,但包括 Google 在内的许多搜索引擎大多都通过 Schema.org 来使用网络上的结构化数据。截止 2015 年,带有 Schema.org 标记的页面占网页总数的 31.3%。近年来,在搜索引擎优化 (SEO) 社区中,对 Schema.org 和结构化数据的兴趣一直呈上升趋势。


虽然结构化数据的使用量正持续增加,但开发者编写结构化数据代码段的体验却参差不齐。我在尝试编写 JSON-LD 代码段时遇到了这一问题。事实证明,编写 JSON-LD 的最好方式是:阅读 Schema.org 提供的参考资料;尝试自行编写 JSON 字面量;在您认为编写完成后,将 JSON 粘贴到检查器中(例如 Google 的结构化数据测试工具);查看错误并予以修改(视情况重复上述步骤)。


如果这是您初次编写 JSON-LD,则可能需要花几分钟了解如何表示枚举值或布尔值,并根据需要查找示例。



了解 schema-dts

从我的经验看来,我觉得编写流程还有优化的余地,编写 JSON-LD 不应该比编写固定格式的 JSON 更加困难。基于这种想法,我创建了 schema-dtsnpmgithub),这是一个基于 TypeScript(和可选编译工具)的内容库,其中包含最新 Schema.org 中的 JSON-LD 规范类型。


我的想法如下:就像 IDE(以及后来适用于轻量级代码编辑器的语言服务器协议)能够通过突出显示拼写错误和代码补全功能来优化开发者体验一样,我们也可以优化 JSON-LD 字面量的编写体验。


借助 IDE 和语言服务器协议,编写 - 测试 - 调试的闭环会变得更加紧密。开发者可以即时获得所写代码正确与否的反馈,而无需不时保存代码,并将代码输入至编译器来获取反馈。通过使用 schema-dts,我们尝试将结构化数据测试等验证工具从编写 - 测试 - 调试的封闭路径分离出来。相反,您可以使用内容库对您编写的 JSON 进行拼写检查。系统会在您输入时报告错误,并自动补全相应的“@type”、属性名称和值。


得益于 TypeScript 的结构性输入可辨识联合数据结构,我们可以使用 TypeScript 针对输入内容很好地表示 Schema.org 的 JSON-LD 通用结构。之前我介绍过创建表示 Schema.org 类结构的 TypeScript 结构枚举DataType属性背后的输入理论。


Schema-dts 包含以下两个相关部分:包含最新 Schema.org 定义的“默认” schema-dts NPM 软件包 schema-dts-gen 命令行工具,您可利用此 命令行工具 从类似 Schema.org 的 .nt N-Triple 文件中创建自己的输入定义。该命令行工具还提供了标志位,用于控制是否导入废弃的类、属性以及枚举值,或者控制什么`@context`可以被您编写的对象所集成等功能。等等。



目标和非目标

Schema-dts 的目标不仅是校验输入 Schema.org JSON 字面量类型定义的合规性,而且要确保我们输入的Schema.org JSON-LD 字面量始终(或在绝大多数情况下)是合规的并可被搜索引擎接受。在此过程中,我们也希望在不牺牲拼写检查和实用补全功能的同时,尽力确保该内容库的通用性。


例如,资源描述框架 (RDF) 的观点是结构化数据以属性为中心,Schema.org 的参考资料和属性的范围只是系统推理取值的参考。实际上,RDF 允许向属性分配任意类型的值。相反,schema-dts 实际上会对 Schema.org 的值进行约束。



写在最后

如果您热衷于结构化数据,则请尝试使用 schema-dts,并加入 GitHub 上的对话


如果您想详细了解 本文讨论 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:

  • 期待着语义网在未来完全实现
    https://twobithistory.org/2018/05/27/semantic-web.html

  • 使用网络上的结构化数据
    https://developers.google.com/search/docs/guides/intro-structured-data

  • 占网页总数的 31.3%
    https://ai.googleblog.com/2015/12/four-years-of-schemaorg-recent-progress.html

  • 遇到了这一问题
    https://blog.eyas.sh/2019/10/the-joys-and-happy-accidents-of-branching-out/#wanting-someone-to-succeed

  • 结构化数据测试工具
    https://search.google.com/structured-data/testing-tool

  • schema-dts
    https://opensource.google/projects/schema-dts

  • npm
    https://www.npmjs.com/package/schema-dts

  • github
    https://github.com/google/schema-dts

  • 结构性输入
    https://www.typescriptlang.org/docs/handbook/type-compatibility.html

  • 可辨识联合数据
    https://basarat.gitbooks.io/typescript/docs/types/discriminated-unions.html

  • 创建表示 Schema.org 类结构的 TypeScript 结构
    https://blog.eyas.sh/2019/05/modeling-schema-org-schema-with-typescript-the-power-and-limitations-of-the-typescript-type-system/

  • 枚举
    https://blog.eyas.sh/2019/05/schema-org-enumerations-in-typescript/

  • DataType
    https://blog.eyas.sh/2019/07/schema-org-datatype-in-typescript-structural-typing-doesnt-cut-it/

  • 属性
    https://blog.eyas.sh/2019/07/schema-org-classes-in-typescript-properties-and-special-cases/

  • “默认” schema-dts NPM 软件包
    https://www.npmjs.com/package/schema-dts

  • schema-dts-gen 
    https://www.npmjs.com/package/schema-dts-gen

  • 结构化数据以属性为中心
    https://www.w3.org/TR/rdf-schema/#ch_introduction

  • 加入 GitHub 上的对话
    https://github.com/google/schema-dts