菜单

内容管理系统

相关源文件

30秒代码仓库中的内容管理系统(CMS)负责管理内容的组织、存储、处理以及向用户提供的方式(代码片段和集合)。本文档解释了内容管理系统的架构和组件、内容的建模和准备方式,以及它如何与搜索功能等其他系统进行接口。有关搜索实现本身的更多信息,请参阅搜索和索引

内容模型结构

内容管理系统使用定义良好的对象模型来表示不同类型的内容。系统中的所有内容都继承自一个通用的基础模型,并根据其类型提供特定功能。

该图说明了主要内容模型之间的继承层次结构和关系。ContentModelSnippetCollection 类提供通用功能,而专业模型则处理它们之间的关系。

来源

内容类型

内容管理系统管理多种内容类型,每种类型都具有特定的属性和行为

内容类型目的关键属性存储格式
代码片段附带解释的代码示例标题、内容、语言、标签、修改日期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 文件中定义。它们包含基本的语言信息和文档资源的引用。

语言结构示例

带重定向的 URL 管理

内容管理系统通过一个集中的 YAML 文件(content/redirects.yaml)管理 URL 重定向。此文件定义了 URL 重定向规则,以处理旧版 URL、重命名的资源和 URL 规范化。

来源

内容准备流程

内容准备是一个多步骤过程,它将原始内容文件转换为网站使用的结构化数据。此过程由 bin/prepare 脚本协调,并涉及多个专用组件。

准备工作流程

内容准备过程遵循以下主要步骤:

  1. 资产准备:处理代码片段和集合的封面图像,并对其进行优化以供网络使用。

  2. 内容提取:

    • 从 YAML 文件中提取语言数据
    • 从 Markdown 文件中提取代码片段数据,解析前置元数据和内容
    • 从 YAML 文件中提取集合数据
    • 建立集合和代码片段之间的关系
  3. 内容转换:

    • 将 Markdown 解析为 HTML
    • 处理代码块以进行语法高亮
    • 生成目录
    • 对内容进行分词以实现搜索功能
  4. 数据导出:

    • 将结构化数据导出到模型中
    • 将所有内容写入一个集中的 JSON 文件
  5. 内容生成:

    • 生成搜索索引
    • 创建 Astro 内容页面
    • 生成重定向、订阅源和站点地图
    • 处理内容组件(脚本和样式)

ContentUtils 类协调此过程,将其委托给每种内容类型的专用工作类。

来源

Markdown 处理

代码片段内容以 Markdown 编写,并处理为 HTML,其中包含针对以下方面的特殊处理:

  1. 代码块:根据构建上下文,使用 Prism(快速)或 Shiki(高质量)进行语法高亮
  2. 目录:从内容中的标题自动生成
  3. 嵌入内容:处理用于嵌入其他代码片段或集合的特殊标签

在内容准备期间,系统生成两种类型的令牌:

  1. docTokens:用于文档索引和搜索功能
  2. recTokens:用于代码片段/集合推荐

这些令牌支持高效的内容搜索以及整个网站的相关推荐。

来源

内容模型和查询系统

内容管理系统为内容模型实现了受 Active Record 启发的模式,提供丰富的查询接口以检索和过滤内容。

模型系统

基础的 Model 类提供核心功能:

  • 静态实例存储
  • 用于快速查询的索引
  • 用于检索、过滤和排序记录的方法

ContentModel 通过特定于内容的功能对此进行扩展:

  • URL 生成
  • SEO 元数据
  • 封面图像处理
  • 用于渲染的序列化

专用模型(SnippetCollection 等)添加类型特定的行为和属性。

查询系统

模型系统提供了一个受 Active Record 模式启发的丰富查询接口。

PreparedQueries 类提供额外的、更高级别的查询,用于特殊用例。

来源

内容序列化与呈现

内容管理系统提供了一种系统化的方式,将内容模型转换为适合在 UI 中渲染的数据结构。

序列化系统

Serializer 基础类提供了一种标准化的方式,将模型对象转换为具有渲染所需属性的纯 JavaScript 对象。针对不同上下文存在专用序列化器:

  • SnippetContextSerializer:用于完整代码片段视图
  • CollectionContextSerializer:用于集合视图
  • PreviewSerializer:用于列表和搜索结果中的代码片段/集合预览

页面适配器

内容管理系统利用页面适配器将内容模型转换为页面数据结构:

  • SnippetPage:用于渲染单个代码片段
  • CollectionPage:用于渲染集合列表
  • HomePage:用于渲染站点首页

这些适配器准备渲染所需的数据,包括面包屑导航、分页、推荐和 SEO 元数据。

来源

URL 管理系统

内容管理系统包含一个全面的 URL 管理系统,处理 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)管理重定向,该文件定义了用于以下方面的规则:

  1. 旧版 URL 处理:将旧 URL 格式重定向到新格式
  2. 内容重组:在内容移动或重命名时管理 URL
  3. URL 规范化:确保一致的 URL 格式

在构建过程中,这些重定向被转换为 Netlify 兼容的重定向规则。

来源

与其他系统集成

内容管理系统与仓库中的其他几个系统紧密集成:

1. 搜索系统

内容管理系统通过在内容准备期间生成令牌来为搜索系统提供内容。这些令牌用于构建搜索索引,从而实现高效的内容搜索。

2. 渲染系统

内容管理系统向基于 Astro 的渲染系统提供结构化内容:

  1. 内容模型被序列化为上下文对象
  2. 页面适配器将这些转换为页面属性
  3. Astro 模板渲染最终的 HTML

3. 构建系统

内容管理系统是构建过程的核心部分:

  1. 内容准备是构建工作流程中的关键步骤
  2. 生成的内容驱动静态站点生成
  3. URL 管理生成用于部署的重定向规则

来源

总结

30秒代码(30 seconds of code)的内容管理系统为管理大量的代码片段和相关内容提供了一个全面的解决方案。通过使用具有继承和关系结构的建模系统,它实现了强大的内容查询和组织功能,同时保持内容存储、处理和呈现之间的清晰分离。

内容管理系统的主要功能包括:

  1. 结构化的内容模型,具有继承和关系
  2. 灵活的内容存储,采用 Markdown 和 YAML 格式
  3. 复杂的内容准备过程
  4. 丰富的查询系统,用于检索和过滤内容
  5. 集成的 URL 管理,用于一致的寻址
  6. 无缝集成搜索和渲染系统

此架构使网站能够高效管理和呈现数百个代码片段,涵盖多种编程语言和类别。