菜单

HugoSites 和 Site

相关源文件

本文档解释了 HugoSitesSite 结构体的作用和结构,它们是 Hugo 网站生成过程中最基础的组成部分。HugoSites 管理多个 Site 实例(通常每个语言一个),而每个 Site 代表一个独立的 Hugo 网站,包含其自己的内容、配置和输出。

有关整体网站生成过程的信息,请参阅 网站生成

核心结构和关系

HugoSites 作为多个 Site 实例的容器,协调它们之间的操作并管理共享资源。每个 Site 维护其自己的页面、分类、菜单和其他网站特定的数据。

关系图

来源: hugolib/site.go98-136 hugolib/hugo_sites.go53-104

关键组件

HugoSites

组件类型目的
Sites[]*SiteSite指针的切片,通常每个语言一个
Configs*allconfig.Configs所有网站的配置
currentSite*Site当前渲染的站点(模板中很重要)
pageTrees*pageTrees包含页面树,用于高效查找页面
datamap[string]any从数据文件中加载的数据
cachePages*dynacache.Partition页面集合的缓存
buildCounteratomic.Uint64跟踪构建调用

来源: hugolib/hugo_sites.go53-104

网站

组件类型目的
pageMap*pageMap管理页面组织和访问
language*langs.Language站点语言信息
h*HugoSites指向父 HugoSites 的引用
taxonomiespage.TaxonomyList分类数据
menusnavigation.Menus站点导航菜单
home*pageState指向主页的快捷方式
renderFormatsoutput.Formats需要渲染的输出格式
publisherpublisher.Publisher用于发布渲染后的页面

来源: hugolib/site.go98-136

初始化

站点是在初始设置阶段使用 `NewHugoSites` 函数创建的,该函数会创建 `HugoSites` 容器及其 `Site` 实例。

来源: hugolib/site.go143-453 hugolib/hugo_sites.go337-452

初始化过程包括

  1. 为所有站点创建共享的页面树
  2. 为每种语言创建 `Site` 实例
  3. 设置依赖项,包括模板存储、文件系统和内容转换器
  4. 为每个站点创建页面映射
  5. 设置按需加载的资源,如数据、git 信息和菜单

页面管理

每个 Site 使用 pageMap 来高效地组织和访问页面。页面映射使用基于树的多维数据结构(维度包括 kind、语言、路径),以便快速查找

来源: hugolib/site.go281-282 hugolib/page.go93-115

页面访问方法

Site 提供了几种访问页面的方法

方法目的
Pages()当前语言的所有页面
RegularPages()仅常规内容页面
AllPages()所有站点的所有页面
AllRegularPages()所有站点的所有常规页面
GetPage()按路径获取特定页面

来源: hugolib/site.go592-635 hugolib/hugo_sites.go198-231

构建流程

构建过程由 HugoSites 协调,并由各个 Site 实例执行

来源: hugolib/hugo_sites_build.go60-1000 hugolib/site_render.go34-222

构建过程包括以下关键步骤

  1. 内容处理:读取并转换内容文件为页面
  2. 页面创建:创建页面并在页面映射中组织
  3. 分类和菜单:构建分类和菜单
  4. 渲染:跨多种输出格式渲染页面
  5. 发布:将渲染后的页面写入目标

输出格式和渲染

每个 Site 可以以多种输出格式(HTML、JSON、XML、AMP 等)渲染内容

来源: hugolib/site.go799-836 hugolib/site_render.go70-191

渲染过程的关键方面

  1. Site 决定渲染哪些输出格式
  2. 每个页面都为渲染成每种输出格式做好准备
  3. 模板会针对每个页面种类和输出格式的组合进行解析
  4. 内容被渲染并写入目标
  5. 资源(图片、CSS 等)被处理并发布

多语言支持

HugoSites 通过其 Sites 切片管理多个语言的站点。每个 Site 对应一个语言

来源: hugolib/site.go842-845 hugolib/hugo_sites.go291-302

每个 Site 通过其 language 字段了解其语言,页面在页面树中按语言进行组织。AllTranslations()Translations() 方法允许访问翻译。

站点数据访问

Site 提供了访问各种类型站点数据的方法

方法目的
Data()访问从 data 目录加载的数据
Params()从配置中访问站点参数
Taxonomies()访问分类列表
Menus()访问站点菜单
Hugo()访问 Hugo 构建信息
Home()访问主页
LastChange()获取最后修改日期

来源: hugolib/site.go459-529 hugolib/hugo_sites.go190-195

关键实现细节

延迟加载

许多资源密集型操作是按需加载的

来源: hugolib/site.go697-790

错误处理

HugoSites 包含一个 fatalErrorHandler 来管理构建过程中的关键错误

来源: hugolib/hugo_sites.go149-180

缓存

HugoSites 使用缓存来提高性能

来源: hugolib/hugo_sites.go75-77

常见使用模式

从模板访问页面

在模板中,页面通过 .Site 对象上的方法来访问

来源: hugolib/site.go592-635

构建 HugoSites

在代码中,HugoSites 通常这样创建和构建

来源: hugolib/site.go143-144 hugolib/hugo_sites_build.go60-61

服务器模式下的站点初始化

在服务器模式下,HugoSites 只创建一次,然后针对更改进行重建

来源: commands/commandeer.go168-177

总结

HugoSitesSite 是 Hugo 架构中的核心组件

  • HugoSites 管理多个 Site 实例并协调构建过程
  • 每个 Site 代表一个特定语言的站点,拥有自己的内容和配置
  • 页面被组织在基于树的数据结构中,以便高效访问
  • 构建过程处理内容处理、页面创建和渲染
  • 通过灵活的渲染管道支持多种输出格式
  • 广泛使用惰性加载和缓存来提高性能

这些组件共同实现了 Hugo 强大的多语言、多输出站点生成功能。