十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hugo 页面 Kind 详解:用 `.Kind` 精准区分 home、page、section、taxonomy 与 term

Hugo 页面 Kind 详解:用 `.Kind` 精准区分 home、page、section、taxonomy 与 term Hugo 页面 Kind 详解用.Kind精准区分 home、page、section、taxonomy 与 term【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo本文围绕 Hugo 的 Page 方法 Kind 展开系统讲解五种页面类型page kind的含义、判定规则与模板用法并结合本仓库源码说明其底层实现与典型应用场景。读完本文你将掌握如何通过{{ .Kind }}精确识别页面身份进而实现按类型驱动的模板分支、输出格式配置与内容过滤。什么是 Page Kind在 Hugo 中每一个被渲染的页面都属于某一类“页面类型”page kind。PAGE.Kind方法返回当前页面的 kind它是一个string类型方法签名见 Kind.md 的 front matterreturnType: string、signatures: [PAGE.Kind]。Hugo 的 page kind 一共有五种Kind含义home网站首页站点根目录对应的_index.mdpage普通内容页叶子页面包括单篇博客、普通 Markdown 文件等section内容分区section由目录中的_index.md标识taxonomy分类法列表页如tags、categories的分类法本身term分类法下的某个具体条目页如tags/fiction下面这份目录树直观展示了五种 kind 的对应关系摘自 Kind.mdcontent/ ├── 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从这份结构中可以看出三条核心判定规则带_index.md的目录是分支节点branch node对应home、section、taxonomy、term四种 kind普通内容文件book-2.md或带index.md的叶子目录book-1/是叶子页面对应page分类法tags与分类条目tags/fiction虽然同属分支节点但 kind 不同需要分别对待。在模板中获取页面 Kind要在模板中读取当前页面的 kind直接访问页面上下文即可{{ .Kind }}该方法对所有页面上下文Page对象都可用无论当前渲染的是首页、文章还是分类页。由于Kind是 Page 接口的标准方法它在模板中的行为与访问.Title、.Date等其他页面属性完全一致。源码层面的实现kind 常量的定义Hugo 在独立的kinds包中集中定义了所有 kind 常量见 resources/kinds/kinds.goconst ( KindPage page // The rest are node types; home page, sections etc. KindHome home KindSection section // Note that before Hugo 0.73 these were confusingly named // taxonomy (now: term) // taxonomyTerm (now: taxonomy) KindTaxonomy taxonomy KindTerm term // The following are (currently) temporary nodes, // i.e. nodes we create just to render in isolation. KindTemporary temporary KindRSS rss KindSitemap sitemap KindSitemapIndex sitemapindex KindRobotsTXT robotstxt KindStatus404 404 )值得注意的细节源码注释明确指出在Hugo 0.73 之前taxonomy与term的命名是混淆的旧版taxonomy现在叫term旧版taxonomyTerm现在叫taxonomy。为了兼容历史配置kinds.go 中仍保留了taxonomyterm到KindTaxonomy的遗留映射并通过IsDeprecatedAndReplacedWith函数处理旧名。除了五种主要 kind仓库中还定义了一组临时 kindtemporary nodesrss、sitemap、sitemapindex、robotstxt、404以及temporary。它们是 Hugo 为独立渲染而临时创建的节点从源码注释看并不属于常规页面流。IsBranch判定分支节点kinds.go 提供了IsBranch(kind string) bool函数将home、section、taxonomy、term四种 kind 判定为分支节点branch而page不属于分支// IsBranch returns whether the given kind is a branch node. func IsBranch(kind string) bool { switch kind { case KindHome, KindSection, KindTaxonomy, KindTerm: return true default: return false } }这解释了前面目录树中的规律凡是带_index.md的目录都是分支节点而page是唯一的叶子页面 kind。Kind()方法的实现页面元数据对象上定义了Kind()方法见 hugolib/page__meta.gofunc (m *pageMetaSource) Kind() string { return m.pageConfigSource.Kind }即Kind直接返回页面配置pageConfigSource中记录的 kind 字段值。与之配套的还有IsHome()方法它通过比较 kind 是否为KindHome来快速判断首页func (m *pageMeta) IsHome() bool { return m.Kind() kinds.KindHome }在 hugolib/content_map_page.go 中页面集合pageMap为KindPage、KindSection、KindHome、KindTerm分别定义了谓词过滤器用于按 kind 筛选页面例如KindPage: func(p *pageState) predicate.Match { return predicate.BoolMatch(p.Kind() kinds.KindPage) },这些谓词是 Hugo 内部按 kind 批量处理页面如构建站点树、生成页面集合的基础设施。典型应用场景场景一按 kind 分支渲染模板最常用的场景是在模板中用if判断当前页面类型从而提供差异化渲染。例如在列表模板中区分普通页面与分支页面{{ if eq .Kind home }} {{/* 首页专属布局 */}} {{ else if eq .Kind section }} {{/* 分区列表页布局 */}} {{ else if eq .Kind page }} {{/* 普通内容页布局 */}} {{ else if eq .Kind taxonomy }} {{/* 分类法列表页布局 */}} {{ else if eq .Kind term }} {{/* 分类条目页布局 */}} {{ end }}也可以使用in一次匹配多个 kind例如把四种分支类型合并处理{{ if in (slice home section taxonomy term) .Kind }} {{/* 分支页面统一处理逻辑 */}} {{ end }}场景二结合页面集合过滤Kind也常用于站点页面集合的过滤。例如在首页或列表页中只渲染普通文章排除分区、分类法等分支页{{ range where .Site.Pages Kind page }} lia href{{ .RelPermalink }}{{ .Title }}/a/li {{ end }}需要说明的是home、section、taxonomy、term这类分支页面由 Hugo 根据目录结构自动生成而page通常对应你实际写作的内容文件按 kind 过滤是控制“哪些内容算作文章”的最直接手段。场景三按 kind 配置输出格式与开关kind 也是 Hugo 配置层面的核心维度输出格式可以在outputs配置中为每种 kind 单独指定输出格式如仅给home增加json详见 outputs 文档禁用类型可以在站点配置中用disableKinds关闭某类页面的渲染例如disableKinds [taxonomy, term]可关闭分类法相关输出。这一行为在仓库测试中有直接验证见 tpl/page/page_integration_test.go 中disableKinds [taxonomy, term]的用例模板查找模板查找顺序可包含 kind 维度即[page kind].[output format].[suffix]的命名模式见 output-formats 文档这意味着不同 kind 可以拥有独立的模板文件不必依赖模板内分支。场景四page matcher 按 kind 匹配在 Hugo 的多种配置如 segments、cascade 等中可以使用 page matcher 按 kind 过滤其kind关键字接受匹配 kind 的 glob 模式例如{taxonomy,term}见 page-matcher 配置文档。此时Kind返回的五种字符串正是 matcher 匹配的判定依据。注意事项区分taxonomy与termtaxonomy是分类法本身如tags列表页term是其中的具体条目如tags/fiction。注意 Hugo 0.73 前后这两者命名发生过对调阅读旧资料时需留意。五种 kind 之外的临时类型rss、sitemap、404等临时 kind 在常规.Kind判断中较少出现它们由 Hugo 内部创建用于单独渲染通常不需要在业务模板中特殊处理。page是唯一的叶子 kind其他四种 kind 均对应带_index.md的分支目录理解这一点可以快速推断任意内容文件会被归类为哪种 kind。掌握{{ .Kind }}的返回值与判定规则后你就可以在模板分支、页面过滤、输出格式配置等层面精确控制 Hugo 对不同类型的页面的处理方式这也是搭建复杂站点结构如文档站、博客站的基础能力之一。【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表