Sanity 是挪威的无头 CMS,成立于 2015 年。与竞品的主要区别:内容是结构化数据,而非 HTML 块。开发者在代码中描述模式,编辑者在实时协作管理后台中填充内容,内容查询使用 GROQ — Sanity 自有的查询语言。
官网:sanity.io
架构
Sanity 在根本层面上分离了内容和展示。内容存在于 Sanity Content Lake — 通过 API 访问的云端存储。管理后台(Sanity Studio)是一个 React 应用,可以随意定制并托管在任何地方。
内容模式在 JavaScript/TypeScript 文件中描述。你定义字段、类型、验证、关联 — Studio 自动识别模式。模式的更改与 Studio 代码一起部署 — 基于 Git 的工作流,无需 GUI 配置器。
GROQ — 查询语言
GROQ(Graph-Relational Object Queries)类似 GraphQL,但针对文档操作进行了优化。它可以在一个查询中查询嵌套结构、过滤、聚合和转换数据。示例:
*[_type == "post" && publishedAt < now()] | order(publishedAt desc) {
title,
"slug": slug.current,
"author": author->name,
"related": *[_type == "post" && references(^._id)]{title}
}[0...10]
功能强大,但需要时间适应。熟悉 GraphQL 的开发者一两天内即可掌握。
实时协作
多个编辑者可以同时处理同一个文档。更改即时显示 — 就像 Google Docs 一样。冲突在字段级别解决。对于 2–3 人共同编辑一篇文章的编辑部和内容团队来说,这是杀手级功能。
价格方案
- Free:无限内容,2 个用户,100 GB 素材
- Growth:$15/月/用户 — 自定义角色,定时发布
- Enterprise:定制 — SSO,审计日志,专属支持
免费套餐非常慷慨。5 人团队 — $75/月。与 Contentful 相比(5 个用户 $489/月)— 差距是一个数量级。
优点
开发者体验是主要亮点。代码中的模式,通过 Git 部署,React 定制管理后台。直接在编辑面板中嵌入自定义组件:预览、自定义小部件、集成。可以为客户品牌定制 Sanity Studio 的样式。
GROQ — 掌握后赋予你超能力。按关联文档过滤、条件字段、聚合 — 全在一个查询中,没有 N+1 问题。
内容可通过 GraphQL 和 GROQ 同时访问。API 快速,CDN 缓存,用于重新构建的 webhook。
顾虑
学习曲线比 Strapi 或 Storyblok 更陡峭。GROQ 需要学习,Studio 需要构建 — 这不是即插即用。对于结构典型的简单博客来说,开销过大。
供应商锁定:Content Lake 中的内容不仅仅是 JSON。可以导出为 Markdown,但 Sanity 的结构(引用、块、可移植文本)会丢失。逆向迁移将会很痛苦。
按用户定价($15/月)对于大团队来说会快速累积。20 个编辑者 — $300/月。
总结
Sanity 是面向开发者参与内容设计的团队的 CMS。如果你的数据结构复杂,需要实时协作,并希望为客户定制管理后台 — Sanity 是市场上最佳选择。对于简单的博客和落地页 — 选择 Strapi,它更简单。