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