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/taxonomy 或 layouts/section 文件夹,除非它代表 页面路径。 |
将它们移动到 layouts/,使用 页面种类 section、taxonomy 或 term 作为基本名称,或将布局放置在分类法 页面路径 中。 |
以前名为 taxonomy.html 的模板曾经是 term 和 taxonomy 页面种类的候选,现在仅考虑用于 taxonomy。 |
创建 taxonomy.html 和 term.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" . }}。 |
模板文件名中使用的标识符是 页面种类 之一(home、page、section、taxonomy 或 term)、标准布局之一(list、single 或 all)、自定义布局(如在 layout 前言语段字段中定义)、语言(例如 en)、输出格式(例如 html、rss)和表示媒体类型的后缀。例如 all.en.html 和 home.rss.xml。 |
|
上述内容意味着不再有用于主页的 index.html 模板。 |
将 index.html 重命名为 home.html。 |
另请参阅下面的 示例文件夹结构 以获取新布局系统的具体示例。
模板查找顺序的变化
我们整合了模板查找,使其在所有 模板类型 中工作方式相同。以前的设置很难理解,并且有大量变体。新设置旨在感觉自然,几乎没有意外。
模板权重中使用的标识符按重要性顺序排列:
| 标识符 | 描述 |
|---|---|
| 自定义布局 | 在前言中设置的自定义 layout。 |
| 页面种类 | home、section、taxonomy、term、page 之一。 |
| 标准布局 1 | list 或 single。 |
| 输出格式 | 输出格式(例如 html、rss)。 |
| 标准布局 2 | all。 |
| 语言 | 语言(例如 en)。 |
| 媒体类型 | 媒体类型(例如 text/html)。 |
| 页面路径 | 页面路径(例如 /blog/mypost)。 |
| 类型 | 在前言中设置的 type。2 |
对于部分或完全匹配 页面路径 的 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