HUGO
Menu
GitHub 87548 stars Mastodon

Hugo v0.146.0 中的新模板系统

Hugo v0.146.0 中新模板系统的概述。

Hugo v0.146.0 中,我们完全重新实现了 Hugo 中处理 Go 模板的方式。这包括 layouts 文件夹的结构性变化和一个新的、更强大的模板查找系统。

我们的目标是尽可能保持向后兼容性,通过"旧到新"的映射,但已经报告了一些破坏性变化。我们正在努力全面修订此主题文档——在此之前,这是包含最重要变化的单页文档。

layouts 文件夹的变化

描述 需要采取的操作
_default 文件夹已移除。 layouts/_default 中的所有文件移动到 layouts/ 根目录。
layouts/partials 文件夹重命名为 layouts/_partials 重命名文件夹。
layouts/shortcodes 文件夹重命名为 layouts/_shortcodes 重命名文件夹。
layouts 中任何不以 _ 开头的文件夹代表 页面路径 的根目录。在 Hugo v0.146.0 中,这可以根据需要嵌套,_shortcodes_markup 文件夹可以放置在树中的任何级别。 无需操作。
上述内容还意味着不再有顶层 layouts/taxonomylayouts/section 文件夹,除非它代表 页面路径 将它们移动到 layouts/,使用 页面种类 sectiontaxonomyterm 作为基本名称,或将布局放置在分类法 页面路径 中。
以前名为 taxonomy.html 的模板曾经是 termtaxonomy 页面种类的候选,现在仅考虑用于 taxonomy 创建 taxonomy.htmlterm.html,或创建更通用的布局,例如 list.html
对于基础模板(例如 baseof.html),在以前的 Hugo 版本中,您可以在 baseof 关键字前 prepended 一个标识符(布局、类型或种类)并加上连字符。 将该标识符移动到第一个"点"之后,例如将 list-baseof.html 重命名为 baseof.list.html
我们添加了一个新的 all"catch-all"布局。这意味着如果您有例如 layouts/all.html` 且那是唯一的模板,则该布局将用于所有 HTML 页面渲染。
我们移除了 _internal Hugo 模板的概念。1 将类似 {{ template "_internal/opengraph.html" . }} 的结构替换为 {{ partial "opengraph.html" . }}
模板文件名中使用的标识符是 页面种类 之一(homepagesectiontaxonomyterm)、标准布局之一(listsingleall)、自定义布局(如在 layout 前言语段字段中定义)、语言(例如 en)、输出格式(例如 htmlrss)和表示媒体类型的后缀。例如 all.en.htmlhome.rss.xml
上述内容意味着不再有用于主页的 index.html 模板。 index.html 重命名为 home.html

另请参阅下面的 示例文件夹结构 以获取新布局系统的具体示例。

模板查找顺序的变化

我们整合了模板查找,使其在所有 模板类型 中工作方式相同。以前的设置很难理解,并且有大量变体。新设置旨在感觉自然,几乎没有意外。

模板权重中使用的标识符按重要性顺序排列:

标识符 描述
自定义布局 在前言中设置的自定义 layout
页面种类 homesectiontaxonomytermpage 之一。
标准布局 1 listsingle
输出格式 输出格式(例如 htmlrss)。
标准布局 2 all
语言 语言(例如 en)。
媒体类型 媒体类型(例如 text/html)。
页面路径 页面路径(例如 /blog/mypost)。
类型 在前言中设置的 type2

对于部分或完全匹配 页面路径layouts 文件夹中放置的模板,向上更近的匹配将被视为_更好_。在下面的 示例文件夹结构 中,这意味着:

  • layouts/docs/api/_markup/render-link.html 将用于渲染来自页面路径 /docs/api 及以下的链接。
  • layouts/docs/baseof.html 将用作页面路径 /docs 及以下的基礎模板。
  • layouts/tags/term.html 将用于 tags 分类法中的所有 term 渲染,除了 blue 术语,它将使用 layouts/tags/blue/list.html

示例文件夹结构

layouts
├── baseof.html
├── baseof.term.html
├── home.html
├── page.html
├── section.html
├── taxonomy.html
├── term.html
├── term.mylayout.en.rss.xml
├── _markup
│   ├── render-codeblock-go.term.mylayout.no.rss.xml
│   └── render-link.html
├── _partials
│   └── mypartial.html
├── _shortcodes
│   ├── myshortcode.html
│   └── myshortcode.section.mylayout.en.rss.xml
├── docs
│   ├── baseof.html
│   ├── _shortcodes
│   │   └── myshortcode.html
│   └── api
│       ├── mylayout.html
│       ├── page.html
│       └── _markup
│           └── render-link.html
└── tags
    ├── taxonomy.html
    ├── term.html
    └── blue
        └── list.html

  1. 旧的方式使得例如在主题中覆盖 _internal/disqus.html 非常困难/不可能。现在您可以只创建同名的部分。 ↩︎

  2. 在前言中设置的 type 将在进行查找时有效地替换 页面路径 中的 section 文件夹。 ↩︎


Last updated: January 1, 0001
Improve this page