内容组织
内容目录如何映射为站点的逻辑树、URL 与 section。
内容目录即站点结构
Hugo 假定用于组织源内容的结构,同样用于组织渲染后的站点。内容在 content/ 目录中的位置构成一棵逻辑树:一级子目录即顶层 section,目录名既是 section 名,也是 URL 的一段。内容属于哪个 section 由它在目录树中的位置决定,不能在前置元数据中指定或覆盖。
Hugo 支持任意层级的内容嵌套,但 content/<目录名> 这样的顶层目录具有特殊含义,它被视为内容类型,用于决定布局等行为。不额外配置时,下面的结构会自动得到对应的 URL:
content/
├── about/
│ └── index.md → https://example.org/about/
├── posts/
│ ├── firstpost.md → https://example.org/posts/firstpost/
│ ├── happy/
│ │ └── ness.md → https://example.org/posts/happy/ness/
│ └── secondpost.md → https://example.org/posts/secondpost/
└── quote/
├── first.md → https://example.org/quote/first/
└── second.md → https://example.org/quote/second/这些地址假定站点使用 Hugo 默认的漂亮 URL 形式,并且项目配置中设置了 baseURL = "https://example.org/"。
页面包
Hugo 支持把页面相对的图片与其他资源打包成页面包(page bundle)。页面包有两种形态:目录中是 _index.md 时构成分支包(branch bundle),代表一个列表页;目录中是 index.md 时构成叶子包(leaf bundle),代表一个不可再分的页面。
content/
├── blog/
│ ├── hugo-is-cool/
│ │ ├── images/
│ │ │ ├── funnier-cat.jpg
│ │ │ └── funny-cat.jpg
│ │ ├── cats-info.md
│ │ └── index.md
│ ├── posts/
│ │ ├── post1.md
│ │ └── post2.md
│ ├── 1-landscape.jpg
│ ├── 2-sunset.jpg
│ ├── _index.md
│ ├── content-1.md
│ └── content-2.md
├── 1-logo.png
└── _index.md上例中共有三个页面包。首页包不能包含其他内容页面,但允许存放图片等其他文件。要理解全貌,还需要同时了解页面资源与图像处理。
_index.md 与 index.md 的分工
_index.md 在 Hugo 中有特殊作用,它让你可以为 home、section、taxonomy 和 term 页面添加前置元数据与正文。站点首页以及每个内容 section、分类法和术语都可以各有一个 _index.md;其中的内容与元数据可以用 Site 或 Page 对象的 GetPage 方法访问。
以典型的 section 列表页为例,文件与 URL 的对应关系如下:
content/posts/_index.md → url: /posts/ section: posts
→ https://example.org/posts/index.htmlsection 中的单个内容文件由单页模板渲染。例如 content/posts/my-first-hugo-post.md 的 URL 是 /posts/my-first-hugo-post/,其中 section 为 posts、slug 为 my-first-hugo-post,构建后输出到 https://example.org/posts/my-first-hugo-post/index.html。
两种文件的差别在于包的形态:_index.md 生成列表页,它所在的目录可以继续包含子 section 与其他内容页面;index.md 生成单个页面,同目录下的其他文件成为该页面的页面资源,不会被单独渲染为页面。
路径的组成
理解下列概念,有助于掌握内容组织方式与默认构建行为之间的关系:
- section
- 默认内容类型由内容所处的 section 决定,section 则由内容在项目
content目录中的位置决定,不能在前置元数据中指定或覆盖。 - slug
- slug 是 URL 路径的最后一段,由页面逻辑路径的最后一段确定,也可以用前置元数据中的
slug覆盖,详见 URL 管理。 - path
- 内容的 path 基于内容所在位置的路径,并且不包含 slug。
- url
- url 是完整的 URL 路径,由文件路径决定,也可以用前置元数据中的
url覆盖,详见 URL 管理。
组织内容时的几点建议
- 让内容目录反映渲染后站点的结构,这是最省心的组织方式。
- section 可以嵌套任意深度;要让整棵 section 树都可导航,最下层的 section 至少要包含一个内容文件(即
_index.md)。 - 用
_index.md表达「这里是一个 section 的列表页」,用index.md表达「这里是一个页面」,这一选择会直接改变目录中其他文件的处理方式。 - 与页面同目录的图片、数据等文件应作为页面资源管理,用相对路径引用,便于迁移与复用。