【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【Hugo】首页板块配置:Branch Bundle
分析了 Branch Bundle 的详细定义,介绍了 Leaf Bundle 和 Branch Bundle 的区别,以及 Hugo 模板系统的继承机制,下面继续分析
搭建私人博客
下面继续分析 Hugo 模板系统的继承机制 Template Lookup Order
https://gohugo.io/templates/lookup-order/?spm=5176.28103460.0.0.5efd7551qOOnnF
这里有比较关键的一点信息

从 Hugo v0.146.0 版本开始,模板系统被彻底重构了(重写了底层逻辑),官方正在努力更新所有相关文档,也就是说,当前文档可能不完整或滞后,但核心规则仍以这里的 Lookup Order 为主
Hugo v0.146.0 的版本就现在来说还不算久远,一个多月前(大概 25年底),更新的 Hugo 系统版本还是 v0.154.0

OK,下面是 Hugo 模板系统的核心逻辑,上篇 blog 解释过,这里不再赘述

OK,接下来是页面种类 Kind,这也是重点

首先,每个页面在 Hugo 里都有一个叫 Kind 的属性,用来表示这个页面的身份 ,关于 Kind 的官方描述如下
https://gohugo.io/methods/page/kind/#article
关于 Kind 的官方定义如下

可以看到,Kind 是 Hugo 页面对象的一个属性,这个属性会返回一个字符串,表示当前页面的种类,其可能的值只有 5 个:
home:首页/page:普通单页,比如关于页/about/section:分类列表页,可以聚合很多文章,要详细介绍的taxonomy:标签,分类列表页,比如/categories/term:术语页,较少用到
可以理解为 Kind 是 Hugo 给每个页面打的标签
OK,接下是 Kind 类型的一个示例
bash
content/
├── books/
│ ├── book-1/
│ │ └── index.md <-- kind = page
│ ├── book-2.md <-- kind = page
│ └── _index.md <-- kind = section
├── tags/
│ ├── fiction/
│ │ └── _index.md <-- kind = term
│ └── _index.md <-- kind = taxonomy
└── _index.md <-- kind = home
可以看到,Hugo 会完全根据文件名和目录结构来解决 .Kind 是什么,不需要用户手动设置,其规则如下
| 文件名 | 所在位置 | .Kind 值 |
说明 |
|---|---|---|---|
_index.md |
网站根目录,比如 content/_index.md |
home | 首页 |
普通 .md 或 index.md |
任意子目录下 | page | 单篇文章/页面 |
_index.md |
子目录内,比如上面的 books/_index.md |
section | 板块的列表页 |
_index.md |
taxonomy 目录下,比如 tags/_index.md |
taxonomy | 标签,分类的总览页,总索引页 |
_index.md |
taxonomy 子目录下,比如上面的 tags/fiction/_index.md |
term | 某个具体标签的列表页 |
可以看到,Hugo 识别 .Kind 全靠文件名和路径
OK,接下来是 .Kind 的使用方法

在任何模板文件中,比如 list.html,single.html,index.html,可以通过 {``{ .Kind }} 来获取当前页面的类型,比如
bash
{{ if eq .Kind "home" }}
<!-- 这是首页 -->
<h1>Welcome to My Site!</h1>
{{ else if eq .Kind "section" }}
<!-- 这是分类页,比如 /books/ -->
<h1>Books in {{ .Title }}</h1>
{{ end }}
或者简单的在模板中调试输出
html
<!-- 在开发时临时加这行 -->
<p>当前页面 Kind: {{ .Kind }}</p>
.Kind 很重要,因为它是 Hugo 模板系统的核心开关,Hugo 根据 .Kind 决定用哪个模板,比如
.Kind = "home":优先找index.html.Kind = "page":优先用single.html.Kind = "section":优先用list.html
还可以通过 .Kind 控制页面逻辑 ,比如只在首页显示欢迎语,而只在文章页显示作者信息,还可以避免样式错乱,比如首页用单栏布局,而文章页用两栏布局(侧边导航栏 + 正文内容)
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】首页板块配置:Template Lookup Order