30秒代码仓库中的内容管理系统(CMS)负责管理内容的组织、存储、处理以及向用户提供的方式(代码片段和集合)。本文档解释了内容管理系统的架构和组件、内容的建模和准备方式,以及它如何与搜索功能等其他系统进行接口。有关搜索实现本身的更多信息,请参阅搜索和索引。
内容管理系统使用定义良好的对象模型来表示不同类型的内容。系统中的所有内容都继承自一个通用的基础模型,并根据其类型提供特定功能。
该图说明了主要内容模型之间的继承层次结构和关系。ContentModel 为 Snippet 和 Collection 类提供通用功能,而专业模型则处理它们之间的关系。
来源
内容管理系统管理多种内容类型,每种类型都具有特定的属性和行为
| 内容类型 | 目的 | 关键属性 | 存储格式 |
|---|---|---|---|
| 代码片段 | 附带解释的代码示例 | 标题、内容、语言、标签、修改日期 | Markdown |
| 集合 | 相关代码片段的集合 | 标题、代码片段ID、父级/子级 | YAML |
| 语言 | 编程语言信息 | 短名称、长名称、名称、参考资料 | YAML |
| CollectionSnippet | 将集合与代码片段关联 | 代码片段ID、集合ID、位置 | 生成 |
代码片段是主要的内容单元,包含代码示例和解释。它们具有标题、内容、标签等属性,并与一种编程语言相关联。
集合将相关的代码片段分组。它们可以是主要的(基于语言)或次要的(基于语言内的某个主题),形成一个分层结构。
语言定义了平台支持的编程语言,包括文档的参考链接。
CollectionSnippet 是一个连接代码片段与集合的关联模型,它维护集合内代码片段的顺序。
来源
内容以各种文件格式存储在仓库中,遵循结构化的组织模式。
代码片段以 Markdown 文件的形式存储在 content/snippets/ 目录下,按语言和类别组织。每个代码片段文件都包含带有元数据(标题、语言、标签等)的 YAML 前置元数据,后跟 Markdown 内容。
代码片段结构示例
---
title: Sort an array of objects in JavaScript
shortTitle: Sort array of objects
language: javascript
tags: [object,array]
cover: volcano-sunset
excerpt: Ever wanted to sort an array of objects, but felt like it was too complex? Here's a robust solution for just that.
listed: true
dateModified: 2024-01-15
---
Ever wanted to sort an array of objects, but felt like it was too complex? After all, `Array.prototype.sort()` can be customized to your needs...
集合在 content/collections/ 目录下的 YAML 文件中定义。它们指定了集合的元数据,并列出了属于该集合的代码片段的 ID。
集合结构示例
语言在 content/languages/ 目录下的 YAML 文件中定义。它们包含基本的语言信息和文档资源的引用。
语言结构示例
内容管理系统通过一个集中的 YAML 文件(content/redirects.yaml)管理 URL 重定向。此文件定义了 URL 重定向规则,以处理旧版 URL、重命名的资源和 URL 规范化。
来源
内容准备是一个多步骤过程,它将原始内容文件转换为网站使用的结构化数据。此过程由 bin/prepare 脚本协调,并涉及多个专用组件。
内容准备过程遵循以下主要步骤:
资产准备:处理代码片段和集合的封面图像,并对其进行优化以供网络使用。
内容提取:
内容转换:
数据导出:
内容生成:
ContentUtils 类协调此过程,将其委托给每种内容类型的专用工作类。
来源
代码片段内容以 Markdown 编写,并处理为 HTML,其中包含针对以下方面的特殊处理:
在内容准备期间,系统生成两种类型的令牌:
这些令牌支持高效的内容搜索以及整个网站的相关推荐。
来源
内容管理系统为内容模型实现了受 Active Record 启发的模式,提供丰富的查询接口以检索和过滤内容。
基础的 Model 类提供核心功能:
ContentModel 通过特定于内容的功能对此进行扩展:
专用模型(Snippet、Collection 等)添加类型特定的行为和属性。
模型系统提供了一个受 Active Record 模式启发的丰富查询接口。
PreparedQueries 类提供额外的、更高级别的查询,用于特殊用例。
来源
内容管理系统提供了一种系统化的方式,将内容模型转换为适合在 UI 中渲染的数据结构。
Serializer 基础类提供了一种标准化的方式,将模型对象转换为具有渲染所需属性的纯 JavaScript 对象。针对不同上下文存在专用序列化器:
内容管理系统利用页面适配器将内容模型转换为页面数据结构:
这些适配器准备渲染所需的数据,包括面包屑导航、分页、推荐和 SEO 元数据。
来源
内容管理系统包含一个全面的 URL 管理系统,处理 URL 生成、规范化和重定向。
系统中的 URL 遵循一致的模式:
| 内容类型 | URL模式 | 示例 |
|---|---|---|
| 代码片段 | /{language}/s/{snippet-id} | /js/s/sort-array-of-objects |
| 集合 | /{collection-path}/p/{page-number} | /js/data-structures/p/1 |
| 主要集合 | /{language}/p/{page-number} | /js/p/1 |
| 次要集合 | /{language}/{category}/p/{page-number} | /js/array/p/1 |
系统通过一个集中的 YAML 文件(content/redirects.yaml)管理重定向,该文件定义了用于以下方面的规则:
在构建过程中,这些重定向被转换为 Netlify 兼容的重定向规则。
来源
内容管理系统与仓库中的其他几个系统紧密集成:
内容管理系统通过在内容准备期间生成令牌来为搜索系统提供内容。这些令牌用于构建搜索索引,从而实现高效的内容搜索。
内容管理系统向基于 Astro 的渲染系统提供结构化内容:
内容管理系统是构建过程的核心部分:
来源
30秒代码(30 seconds of code)的内容管理系统为管理大量的代码片段和相关内容提供了一个全面的解决方案。通过使用具有继承和关系结构的建模系统,它实现了强大的内容查询和组织功能,同时保持内容存储、处理和呈现之间的清晰分离。
内容管理系统的主要功能包括:
此架构使网站能够高效管理和呈现数百个代码片段,涵盖多种编程语言和类别。