页面包
分支包与叶子包的目录结构与区别,以及 headless bundle 和多语言命名。
页面包(page bundle)是一个目录,把内容与相关资源封装在一起。例如下面这个站点有一个 about 页面和一个 privacy 页面:
content/
├── about/
│ ├── index.md
│ └── welcome.jpg
└── privacy.mdabout 页面就是一个页面包:它把资源与内容打包在一起,从而在逻辑上建立关联。页面包内的资源称为页面资源,可以用 Page 对象的 .Resources 方法访问。
叶子包与分支包
页面包分为叶子包(leaf bundle)与分支包(branch bundle)两类。
- 叶子包
- 一个包含
index.md文件以及零个或多个资源的目录。类似大树的一片叶子,叶子包位于分支的末端,没有后代。 - 分支包
- 一个包含
_index.md文件以及零个或多个资源的目录。类似大树的枝干,分支包可以有后代,包括叶子包与其他分支包。顶层目录无论是否含_index.md文件都是分支包,首页也属于分支包。
注意:索引文件的扩展名取决于内容格式。Markdown 内容用
index.md,HTML 内容用index.html,AsciiDoc 内容用index.adoc,其余格式依此类推。
两类页面包对比
| 对比项 | 叶子包 | 分支包 |
|---|---|---|
| 索引文件 | index.md |
_index.md |
| 示例 | content/about/index.md |
content/posts/_index.md |
| 页面种类 | page |
home、section、taxonomy 或 term |
| 模板类型 | 单页模板 | 首页、section(内容区块)、分类法或术语模板 |
| 后代页面 | 无 | 零个或多个 |
| 资源位置 | 与索引文件相邻,或位于嵌套子目录中 | 与叶子包相同,但不包括后代包中的文件 |
| 资源类型 | page、image、video 等 |
除 page 之外的所有类型 |
资源类型为 page 的文件包括用 Markdown、HTML、AsciiDoc、Pandoc、reStructuredText 和 Emacs Org Mode 书写的内容。在叶子包中,除索引文件以外,这些文件只能作为页面资源访问;在分支包中,这些文件只能作为内容页面访问。
叶子包
叶子包是一个包含 index.md 文件以及零个或多个资源的目录,位于分支的末端,没有后代。
content/
├── about
│ └── index.md
├── posts
│ ├── my-post
│ │ ├── content-1.md
│ │ ├── content-2.md
│ │ ├── image-1.jpg
│ │ ├── image-2.png
│ │ └── index.md
│ └── my-other-post
│ └── index.md
└── another-section
├── foo.md
└── not-a-leaf-bundle
├── bar.md
└── another-leaf-bundle
└── index.md上例中有四个叶子包:
about:不含任何页面资源。my-post:含一个索引文件、两个资源类型为page的资源,以及两个资源类型为image的资源。content-1、content-2是资源类型为page的资源,通过.Resources访问,Hugo 不会把它们渲染成独立页面;image-1、image-2是资源类型为image的资源,同样通过.Resources访问。my-other-post:不含任何页面资源。another-leaf-bundle:不含任何页面资源。
注意:叶子包可以创建在
content目录下的任意深度,但一个叶子包内不能再包含另一个包。叶子包没有后代。
分支包
分支包是一个包含 _index.md 文件以及零个或多个资源的目录,可以有包括叶子包和其他分支包在内的后代。顶层目录无论是否含 _index.md 文件都是分支包,首页也包括在内。
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上例中有三个分支包:
- 首页:含一个索引文件、两个后代分支包,没有资源。
branch-bundle-1:含一个索引文件、两个资源类型为page的资源,以及两个资源类型为image的资源。branch-bundle-2:含一个索引文件和一个叶子包。
注意:分支包可以创建在
content目录下的任意深度,并且可以有后代。
headless bundle
在前置元数据(front matter)中使用构建选项,可以创建不发布的叶子包或分支包,其内容与资源可以供其他页面引用。把 headless 设为 true 时,Hugo 会同时把 render 与 list 构建选项设为 never。
+++
title = "共享资源"
headless = true
+++headless 适合“整个包都不发布”的简单情形;需要更细地控制页面是否输出、是否进入列表、资源是否复制时,直接使用 build 构建选项(list、render、publishResources),也可以配合 cascade 统一下发。
与 section 的关系
叶子包与被它替代的单文件页面发布的地址相同,区别在于能否携带同目录下的资源:
content/posts/second-post.md → /posts/second-post/
content/posts/second-post/index.md → /posts/second-post/同一个目录里不能同时存在 _index.md 与 index.md。叶子包就是一个普通页面,不会创建新的 section;分支包则可以嵌套分支包,从而形成多级 section,详见内容区块。更多目录层面的约定见目录结构。
多语言下的文件命名
多语言站点中,语言可以通过文件名后缀或目录区分。使用文件名后缀时,把语言代码插在扩展名之前:
content/posts/first-post/
├── index.zh.md # 简体中文版本
├── index.en.md # 英文版本
├── cover.zh.jpg # 中文版页面的资源
└── cover.en.jpg # 英文版页面的资源索引文件同理,写作 _index.zh.md、_index.en.md。语言代码要与配置中声明的语言一致,例如 zh、zh-cn、en;同一包内不同语言的资源属于对应语言的页面,命名时注意区分。共享资源在多语言构建中的处理方式见页面资源。