数据层
什么是 TinaCMS 数据层?
TinaCMS 数据层提供了一个 GraphQL API,用于服务由数据库支持的 Markdown 和 JSON 文件。你可以将数据库视为一种临时缓存,因为你的内容的唯一真实来源实际上是你的 Markdown/JSON 文件。
Figure: TinaCMS 数据层
TinaCMS 在 TinaCMS GraphQL API 和底层 Git 仓库之间实现了这个数据库层。这个数据层缓冲了 TinaCloud 和 GitHub 之间的请求,从而提高了使用 TinaCMS 的编辑性能。
数据层的主要优点包括:
- 简化的身份验证:数据层抽象了与 GitHub 进行身份验证的复杂性,为编辑者提供了无缝的体验。
- 本地缓冲:数据层直接提供内容,这意味着编辑者可以在不需要等待与 GitHub 往返的情况下处理他们的内容。这避免了 GitHub API 速率限制的问题,并带来了更快速的编辑体验。
- 性能:数据层为快速查询索引了你的内容,因此即使在大型仓库中,搜索、分页和引用等功能也能高效运行。
- 可扩展性:通过将 GraphQL API 与直接文件访问分离,数据层允许 TinaCMS 在不降低性能的情况下扩展到更大的网站和团队。
它还支持其他功能,例如:
- 引用完整性
为什么 TinaCMS 需要数据层?
你的 Markdown 文件是事实的来源,但 TinaCMS 仍然需要数据层来启用搜索、分页和 Markdown 文件之间的引用等功能。没有它,每个查询都需要直接从文件系统或 Git 读取和解析文件,这无法扩展。
由于数据层提供了一个 API,你可以像使用传统的无头 CMS 一样获取你的内容。
数据层如何工作
在底层,数据层有两个关键组件:
- 桥接 — 从源读取内容(在开发中是你的本地文件系统,在生产中是 GitHub)
- 数据库 — 将内容索引到一个可查询的存储中
当一个 GraphQL 查询进入时,TinaCMS 从索引的数据库中读取,而不是从原始文件中读取。这使得排序、过滤和分页变得快速。
本地开发
当你运行 tinacms dev 时,数据层会自动启动,无需配置。它使用内存数据库并直接从你的文件系统读取文件。文件监视器在你编辑时保持索引的更新,因此更改会立即显示。
使用 TinaCloud 的生产环境
TinaCloud 为你提供了一个完全托管的服务的数据层。
它通过 webhooks 与你的 GitHub 仓库同步,并自动维护索引。每个项目都有自己的 GraphQL 端点。
你也可以选择自托管数据层作为替代方案。
索引
索引是扫描你的内容文件并将它们存储在数据库中以便查询的过程。索引包括:
- 内容条目 — 每个文档的解析数据
- 索引条目 — 用于查询的可搜索元数据
- 引用条目 — 文档之间的关系(例如,一个帖子引用一个作者)
索引何时发生?
TinaCloud: 每次推送到你的 GitHub 仓库时(通过 webhooks),索引会增量更新。只有更改的文件会被重新索引,因此速度很快。以下情况会触发完整重新索引:
自托管: 索引在你的网站构建时发生。通过 TinaCMS 进行的内容更新会立即反映出来,但直接在 GitHub 上进行的编辑不会在下次构建前出现。
本地开发: 文件监视器在文件在磁盘上更改时立即重新索引。
分支隔离
每个 Git 分支都有其独立的索引。这意味着功能分支上的内容不会影响你的生产分支,反之亦然。
同步问题(TinaCloud)
Webhook 失败
在极少数情况下,连接你的仓库到 TinaCloud 的 GitHub webhook 可能会中断。如果 webhook 未执行,TinaCloud 可能会与 GitHub 仓库不同步。
使用 刷新 Webhooks 按钮重新初始化 webhook。
外部更新不同步
在某些情况下,TinaCloud 的仓库缓存可能会与 GitHub 仓库不同步,这可能导致更改存在于你的仓库中但不在 TinaCMS 中。通常,这只会在 GitHub webhook 出现问题时发生。如果发生这种情况,你可以重新索引不同步的分支,将其恢复到你仓库的当前状态。这将丢弃 TinaCloud 中尚未推送到你仓库的分支中的任何更新。
使用 刷新 Webhooks 按钮重新初始化 webhook。
未索引的分支
有时,你可能会发现某个分支在 TinaCloud 中没有被索引。这可能是由于 GitHub 的间歇性问题造成的。或者,如果你在连接到 TinaCloud 之前有现有的分支,也可能发生这种情况。如果你尝试访问未索引的分支,你将看到一条错误消息,指示该分支未被索引。
请参阅故障排除指南以获取简短的操作步骤。
导出分支
在分支上使用“重新索引”将丢弃 TinaCloud 中尚未推送到你仓库的该分支中的任何更改。如果你需要从 TinaCloud 导出未保存的内容,你可以使用 导出分支 按钮将你仓库的当前状态导出到一个新分支。
自托管数据层
数据层的设计使其可以作为无服务器函数与你的网站一起托管(例如使用 Vercel/Netlify 函数)。你也可以在任何你喜欢的地方单独托管它。
在自托管时,你需要提供两件事:
- Git 提供者 — 连接到你的仓库(例如 GitHub)
- 数据库适配器 — 存储索引。支持的选项有:
- MongoDB (
mongodb-level) — 用于传统数据库部署 - Upstash Redis (
upstash-redis-level) — 用于无服务器部署(例如 Vercel KV)
数据库适配器是可插拔的,因此可以实现自定义实现。
自托管的常见原因包括:
- 将来从 TinaCloud 中退出的灵活性
- 需要将内容存储在本地
- 在特定区域托管服务器
- 使用 TinaCloud 不支持的自定义身份验证
- 自定义/扩展 TinaCloud 中使用的行为
要了解有关自托管的更多信息,请参阅自托管概述。