【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【Hugo】首页板块配置:Leaf Bundle
分析了首页展示的内容类型,以及 Leaf Bundle 的详细定义,下面继续分析
搭建私人博客
OK,介绍完 Leaf Bundle,继续看 Branch Bundle,Branch Bundle 是首页板块配置里的核心概念 ,其官方描述如下 https://gohugo.io/content-management/page-bundles/#branch-bundles

Branch Bundle 是一个包含 _index.md 文件的目录 (注意,这里是下划线开头 _index.md,不是 Leaf Bundle 里面那样的 index.md ),这个 Branch Bundle 可以包含其他资源文件,比如 .md,图片等,也可以包含子目录,这些子目录可以是其他 Branch Bundles(带 _index.md 的目录),也可以是 Leaf Bundles(包含 index.md 的叶子目录),Branch Bundle 就像树的一根枝干,这跟枝干可以继续分叉,有后代
Branch Bundle 和 Leaf Bundle 的对比如下
- Leaf Bundle:内含
index.md,不能有子目录,属于叶子,末端 - Branch Bundle:内含
_index.md,可以有子目录,属于枝干,可以继续生长
OK,下面看示例如下
bash
content/
├── branch-bundle-1/
│ ├── _index.md
│ ├── content-1.md
│ ├── content-2.md
│ ├── image-1.jpg
│ └── image-2.png
├── branch-bundle-2/
│ ├── a-leaf-bundle/
│ │ └── index.md
│ └── _index.md
└── _index.md
这里一共有 3 个 Branch Bundles:
- 首页 Home Page:路径
content/_index.md,是顶级的 Branch Bundle,其包含两个子 Branch Bundles:branch-bundle-1 和 branch-bundle-2,本身没有额外的资源(比如图片,附件啥的没有) - branch-bundle-1:有
_index.md,是 branch bundle,包含资源content-1.md和content-2.md(Page 类型资源),和image-1.jpg,image-2.png(图片资源),没有子目录 - branch-bundle-2:有
_index.md,是 branch bundle,包含一个子目录a-leaf-bundle/(里面有index.md,所以是 Leaf Bundle),说明 Branch Bundle 里可以包含 Leaf Bundle
OK,上面介绍了 Home Page,里面提到了顶级的 Branch Bundle,不过可惜,即使定义了 content/_index.md,也需要配合模板或者主题进行使用,而 PaperMod 并没有在 Home Page 首页,去处理这个顶级的 Branch Bundle,所以如果想在首页实现 Branch Bundle 的板块功能,需要用户自己稍微调整一下模板实现
在介绍模板实现之前,先来看下 Hugo 模板系统是如何工作的,这里涉及到 Hugo 的模板继承机制和 PaperMod 的设计哲学,Hugo 默认首页的渲染流程优先级如下
- 查找
layouts/index.html,如果找到,就用 - 找不到的话,就查找
layouts/_default/list.html - 如果还没有的话,就是用 PaperMod 主题提供的
themes/PaperMod/layouts/_default/list.html
而 PaperMod 没有 index.html,而是通过 list.html 实现了默认首页 ,关于这块模板系统的工作原理,可以参考官方描述 https://gohugo.io/templates/lookup-order/?spm=5176.28103460.0.0.5efd7551qOOnnF,这里详细描述了 Hugo 模板的查找顺序,解释了 Hugo 如何为一个页面选择最合适的模板文件

Hugo 在渲染某个页面(比如首页 /,文章页 /ubuntu/hello,分类页 categories/hugo/)时,会按照一套规则去查找模板(最具体 most specific → 最通用 most common)
- 最具体:只适用于当前页面的模板,比如
layout/ubuntu/single.html - 最通用:适用于所有页面的默认模板,比如
layout/_default/single.html
Hugo 一旦找到第一个匹配的模板,就立刻使用这个匹配上的模板,不再继续往下查找了
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】首页板块配置:Template Lookup Order(.Kind)