配置总览
主题真正会读的每一个站点参数:类型、默认值、去哪一页改。查参数从这里开始。
站点参数的唯一归属页。主题读取的每个键在下面某张表里有一行,给出类型、默认值与一句说明,并链接到讲它的指南页。指南页只给可粘贴的片段,不重复定义。页面级参数(front matter)见页面参数。
表格按功能分组,每组一个 ##,锚点可以引用,例如 /zh/docs/customize/config/#sidebar。默认值一栏空着表示主题没有默认值:不配置该功能就不生效。
hugo.yml 的分层
OINK 站点配置有四类键,改哪一层取决于改动目标:
最小的可用配置只需要前两层:
title: 产品文档
baseURL: https://docs.example.com/
defaultContentLanguage: zh
enableGitInfo: true
module:
imports:
- path: github.com/pgsty/oink
hugoVersion:
extended: true
min: 0.160.1
params:
offline_search: true
github_repo: https://github.com/example/product-docs
配置原则
- 主题默认保守,只写要改的键。交互功能(本地搜索、图片缩放、评论、反馈、深浅色菜单)默认关闭,主题不替站点做策略决定。从一份「完整配置」逐条删减,比按需添加更容易留下用不上的键。
- 没有主题总开关。不存在
oink.enabled,也没有 params.oink.* 命名空间,更没有在「Docsy 外壳」与「OINK 外壳」之间切换的选项。这一页查不到的开关即不存在。
- 非法值告警并回退到文档里写明的默认值。
params.ui.typography: solarized 报 invalid params.ui.typography "solarized" (allowed: technical | system) -- using "technical",站点照常构建;footer_style: thin、page_width: huge、section_index: grid 同理。一个笔误因此只降级一个设置,而不是让 hugo server 下每个 URL 都返回 HTTP 500。它也不会因此静悄悄上线:所有发布关卡都带 --panicOnWarning 构建,那条警告在那里仍然是硬失败。
- 仍有少数情况会中断构建,它们都属于「继续构建就会发布出错误内容」而非「发布出朴素内容」。需要外部端点的功能——PlantUML、Draw.io、Algolia——缺少端点时报错,因为主题不会代为连接公共服务;残缺的上游署名报错,因为半条声明读起来和完整的一模一样。
params.offline_search_index、release 事实,以及解析不到目标的内容引用同理。
页面级覆盖优先级
Hugo 的 .Param 查找让大部分参数可以逐页覆盖,优先级从高到低:
- 页面自己的 front matter;
- 祖先分区
_index.md 里的 cascade(离页面越近越优先);
- 站点
params。
写进 front matter 时要去掉 ui. 前缀。
站点上的 params.ui.scroll_spy 在页面里就写成 scroll_spy。front matter 里出现 ui:
块的话,里面的键没有人读,也没有人报错——某个设置看着没生效时,先对照页面参数核一遍键名。
---
title: 宽版参考
page_width: wide
navbar_enabled: false
footer_style: slim
scroll_spy: true
---
分区级用 cascade 一次设定整棵子树:
---
title: 文档
cascade:
type: docs
footer_style: slim
feedback: true
---
覆盖用于真实的内容差异。逐页重建一套视觉系统的配置,会在主题升级后失配。
三项 goldmark 前置
Hugo 不会 把主题模块的 markup 配置合并进站点,这三项必须写在站点自己的 hugo.yml 里,否则属性行、组件 HTML 与数学公式都不工作:
markup:
goldmark:
parser:
# 块级图片可以带属性行({caption=…}、编号图)
wrapStandAloneImageWithinParagraph: false
attribute:
block: true
renderer:
# `{{% … %}}` 型 shortcode 输出的 HTML 必须保留
unsafe: true
extensions:
passthrough:
enable: true
delimiters:
block: [['\[', '\]'], ['$$', '$$']]
inline: [['\(', '\)']]
highlight:
# 代码高亮用 class 输出,深浅色才能各用一套配色
noClasses: false
tableOfContents:
endLevel: 4
缺 attribute.block 时,{.fields} {.steps} {caption=…} 会原样显示成文字;缺 passthrough 时 \(x\) 不会变成公式;缺 unsafe 时步骤与卡片的结构会被转义。
renderer.unsafe: true 同时允许 Markdown 正文里的原始 HTML 通过,面向的是受信任的作者,不是投稿过滤器。内容来自不可信来源时,审查应放在提交流程里。
站点身份与品牌
Hugo 原生顶层键:
title
, string
- 站名,显示在顶栏、
<title> 与页脚
baseURL
, string
- 生产域名;子路径部署时带上路径段
copyright
, string
- 版权行的兜底值,
params.copyright 未设时按 HTML 原样渲染
enableGitInfo
, boolean
, defaultfalse
- 打开后才有「最后修改」与 commit 信息
enableRobotsTXT
, boolean
, defaultfalse
- 生成
robots.txt
enableEmoji
, boolean
, defaultfalse
- 允许
:smile: 简码
主题参数:
params.logo
, string
, defaulticons/logo.svg
- 品牌图标,可指向
assets/ 资源或 static/ 路径,见品牌外观
params.wordmark
, string
- 横向字标;设置后顶栏用它替代「图标 + 站名」
params.description
, string
- 站点描述,页面没有
description 时作为 meta 兜底
params.copyright
, string 或 map
- 字符串按 Markdown 渲染;map 接受
authors from_year to_year(present 表示今年)
params.author
, string 或 map
- RSS 的作者;map 接受
name 与 email
favicon 没有参数:主题按约定名扫描 static/(favicon.ico favicon.svg favicon-NxN.png apple-touch-icon.png apple-touch-icon-NxN.png),见品牌外观。
外壳类型与栏目根
外壳按 页面 type 生效,不看路径。文档可以放在任意目录,再用 cascade 给它 type: docs。
params.ui.shell_types
, list
, default[docs, book, blog, swagger]
- 哪些 type 使用带侧栏的阅读外壳,见布局与页面类型
params.ui.docs_section
, string
, defaultdocs
- 文档栏目的根目录名,只用于导航解析
params.ui.blog_section
, string
, defaultblog
- 博客栏目的根目录名
params.ui.quick_links
, list
, default[docs_section, blog_section]
- 命令面板空查询时列出的顶层菜单 identifier,见命令面板
params.ui.section_index
, enum
, defaultlist
- 栏目首页子页列表样式:
list 或 cards,可按分区覆盖
params.ui.section_index_columns
, integer
, default2
section_index: cards 时的列数
博客
三个键决定博客栏目的样子。它们作用于 params.ui.blog_section 指定的栏目,每一个都能通过博客根目录的 front matter 或 cascade 按栏目覆盖。
params.ui.featured_image
, enum
, defaultnone
- 文章正文里怎么渲染自己的题图:
none 不渲染,banner 在标题上方框出一张 16:9 的图,wash 把它铺在文章头部背后、只留十分之一的不透明度。用的就是这一页在卡片与 og:image 里已经在用的那张图,两处不会打架。没有题图的文章在两种模式下都不渲染任何东西
params.ui.blog_index
, enum
, defaultlist
- 博客栏目列表页的形态:
list 是行列表,cards 是内容卡片网格,卡片带 16:9 题图、日期与栏目行,以及三行摘要。按年分组、分页与 manual_link 在两种形态下行为一致
params.ui.blog_index_columns
, integer
, default3
blog_index: cards 时的列数;md 到 xl 之间恒为两列,md 以下一列,不受此值影响
作者与系列是 taxonomy 而不是参数,见分类法与写博客。
params.ui.navbar_enabled
, boolean
, defaulttrue
- 是否渲染站点顶栏,可用页面顶层
navbar_enabled 覆盖,见导航与菜单
params.ui.navbar_autohide
, boolean
, defaultfalse
- 顶栏收到视口上方,指针进入唤醒区才出现;小于 768px 或粗指针时不生效
params.ui.dark_mode
, boolean 或 map
, defaultfalse
true 同时启用深色调色板与主题控件;只要控件写 dark_mode: { show_menu: true }
params.ui.breadcrumb
, boolean
, defaulttrue
- 面包屑;设为
false 关闭。顶层分区本来就省略只有一级的面包屑
params.ui.github_stars
, string 或 number
- 顶栏 GitHub 徽标上的星数,本地常量,不发请求
params.ui.alt_site
, map
- 单语言站在页脚显示的姊妹站链接,必填
label 与绝对 http(s) 的 url
胖页脚的列数据来自 data/footer/<语言>.yaml,不是参数,见导航与菜单。
params.ui.taxonomy_icons
, map
- 按分类复数名指定右栏分组图标,例如
tags: fa-solid fa-tags
侧栏怎么用见布局与页面类型;目录树本身由 content/ 的结构决定,见组织内容。
目录 TOC
右栏大纲的层级由 Hugo 原生配置决定,主题只控制跟踪行为:
markup.tableOfContents.startLevel
, integer
, default2
- Hugo 原生:收录的最高标题级别
markup.tableOfContents.endLevel
, integer
, default3
- Hugo 原生:收录的最低标题级别
单页隐藏大纲用 front matter notoc: true,见页面参数。
翻页与页尾
页尾组件顺序固定为分享 → 反馈 → 页面信息 → 翻页 → 评论,五者独立开关。
params.ui.share
, list
, default[]
- 页尾分享目标,按给定顺序渲染,取值来自
x bluesky mastodon facebook linkedin reddit hackernews telegram whatsapp line pinterest weibo chatgpt claude email copy。为空则不出现分享栏。每一项都是纯粹的 intent 链接——没有 SDK、没有 iframe、没有第三方脚本、没有分享计数,见写博客。未知目标告警并丢弃
params.ui.annotation
, boolean
, defaulttrue
- 正文末尾的「最后修改」与出处区块;上游署名由页面的
upstream_link 一族键驱动,见页面参数
params.ui.translation_notice
, 语言代码或 false
, defaultfalse
- 权威版本的语言代码,译文页据此显示一条指回原文的说明;页面写
translation_notice: false 退出
params.ui.reading_time
, boolean
, defaultfalse
- 页面标题下显示阅读时长
params.ui.book_draft_banner
, boolean
, defaultfalse
- Book 草稿页开头额外加一条横幅
搜索与命令面板
本地搜索默认关闭;打开后命令面板才会出现(顶栏放大镜、Cmd/Ctrl+ 加 K、/、\)。
params.offline_search
, boolean
, defaultfalse
- 生成每语言一份本地索引并启用命令面板,见全文检索
params.offline_search_on_serve
, boolean
, defaulttrue
hugo server 预览时也构建索引,预览行为与线上一致;站点极大时设 false 跳过以加快本地重建
params.offline_search_index
, enum
, defaultcontent
- 索引范围,逐级累加:
title heading summary content。非法值构建失败
params.offline_search_summary_length
, integer
, default70
summary 档摘录截断的字数
params.offline_search_max_results
, integer
, default10
- 结果条数上限,同时约束 Lunr 与中文子串兜底
params.ui.landing_search
, boolean
, defaulttrue
layout: landing 页面是否保留搜索入口
params.ui.command_palette.commands
, list
, default[]
- 自定义命令,每条二选一:
url 或内置 action;见命令面板
params.gcs_engine_id
, string
- Google 可编程搜索引擎 ID,启用后引入外部服务
params.search.algolia
, map
- Algolia DocSearch,必须显式给出
appId apiKey indexName,缺一构建失败
自定义命令的每条记录只接受 id title description icon keywords url action 七个键;id 必须匹配 ^[a-z][a-z0-9_-]*$,且不能与内置动作 ID 重名。分语言的标题写在 languages.<lang>.params.ui.command_palette.commands。
键盘
params.ui.keyboard_nav
, boolean
, defaulttrue
- 单键导航(WASD/方向键走树、j/k 跳标题、q/e 翻页、面板与外壳开关)。设为
false 后运行时不进包,见键盘导航
图片缩放
params.ui.image_zoom
, boolean
, defaultfalse
- 允许正文图片点击放大;页面用 front matter
image_zoom 覆盖。非布尔告警并回退
哪些图片会成为缩放候选见图片。
字体排版
params.ui.typography
, enum
, defaulttechnical
technical 用随主题分发的 Inter / Chakra Petch / IBM Plex Mono;system 只用平台字体栈,不请求品牌字体。非法值告警并回退
params.page_width
, enum
, defaultnormal
- 外壳整体宽度:
normal wide full,可逐页覆盖
params.reading_width
, enum
, defaultnormal
- Book 页正文的阅读行宽:
slim normal wide,不影响外壳
自定义字体与配色走 SCSS 入口而不是 YAML,见品牌外观。
params.ui.feedback.enable
, boolean
, defaultfalse
- 页尾「这页有帮助吗」两个按钮;无后端,有
gtag 时记录结构化事件
params.ui.feedback.reasons
, boolean
, defaulttrue
- 选「否」后展开四个可选原因
四个 giscus 必填项缺任意一个,评论区就不渲染:不报错,也不出现。
仓库链接与页面信息
params.github_repo
, string
- 内容仓库 URL,解析「编辑本页」「查看历史」「新建子页」「提文档 issue」,见仓库与页面信息
params.github_project_repo
, string
, defaultgithub_repo
- 产品仓库 URL,用于「提项目 issue」与顶栏 GitHub 入口
params.github_branch
, string
, defaultmain
- 编辑链接指向的分支
params.github_subdir
, string
- 内容站在 monorepo 里的子目录
params.path_base_for_github_subdir
, string 或 map
- 源路径重写;map 形式接受
from 与 to
params.github_url
, —
, default—
- 已移除,改写
params.github_repo。那份负责提示替代键名的迁移登记表已经删掉,所以旧键现在只是一个没人读的键
params.ui.lastmod_commit
, enum
, defaultsubject
- 「最后修改」后面附什么:
subject commit 标题、hash 短哈希、none 不附。非法值告警并回退
params.images
, string 数组
, default—
- 站点级社交卡片:页面自己没有封面时用它填
og:image;只进元数据,不会渲染成列表缩略图
params.default_featured
, —
, default—
- 已移除,改写
params.images 或栏目 cascade 里的 images。同上,旧键现在只是一个没人读的键
内容运行时
Mermaid、KaTeX、ECharts、Infographic、Asciinema、Swagger UI 与 Redoc 按内容自动检测,页面用到才加载,没有站点开关。需要开关或外部端点的只有这几个:
params.markmap
, boolean
, defaultfalse
- 站点级启用思维导图围栏,见思维导图
params.mermaid
, map
- 透传给
mermaid.initialize() 的配置;键名全小写,深色模式自动覆盖 theme
params.plantuml.enable
, boolean
, defaultfalse
- 启用 PlantUML 围栏,见 PlantUML
params.plantuml.svg_image_url
, string
- PlantUML 服务的 SVG 端点,启用时必填,缺失构建失败
params.plantuml.svg
, boolean
- 用内联 SVG 而不是
<img> 渲染
params.drawio.enable
, boolean
, defaultfalse
- 启用
.drawio.svg 图片的编辑按钮,见 Draw.io
params.drawio.drawio_server
, string
- Draw.io 编辑器地址,启用时必填,缺失构建失败
params.highlight_classes
, boolean
, defaulttrue
- 代码高亮输出 Chroma class;设
false 回到 Hugo 的行内样式
params.ui.code_copy
, boolean
, defaulttrue
- 代码块的复制按钮;设为
false 全局去掉,围栏上的 copy= 仍然优先
数学公式不需要参数,只需要 passthrough 前置。
输出格式
主题声明了两种自定义输出格式,但 不替站点打开:要哪种就在 outputs 里写哪种。
outputs:
home: [HTML, markdown, LLMS]
page: [HTML, markdown]
section: [HTML, RSS, print, markdown]
打印输出的两个参数:
params.print.toc
, boolean
, defaulttrue
- 打印页开头生成目录;设为
false 不生成
params.print.section_break_wordcount
, integer
, default50
- 打印页中一节多少词以上才另起一页
多语言与版本
语言用 Hugo 原生的 languages 块定义,主题只读它建立的翻译关系:
defaultContentLanguage
, string
, defaulten
- 不带路径前缀的首要语言
languages.<lang>.label
, string
- 该语言的自称,显示在语言菜单里
languages.<lang>.locale
, string
- 完整 locale,用于
<html lang> 与 SEO
languages.<lang>.weight
, integer
- 语言顺序,也是点击语言图标时的循环顺序
languages.<lang>.title
, string
- 该语言的站名
languages.<lang>.languageDirection
, string
, defaultltr
- RTL 语言设为
rtl
写作侧的对等文件、锚点对齐与缺译回退见多语言。
版本相关参数:
params.version
, string
- 当前站点变体的版本标识(不一定是 Git ref),见多版本
params.versions
, list
- 版本条目:
version url kind,name: '---' 是分隔线
params.archived_version
, boolean
- 顶部显示「这是归档版本」横幅
params.url_latest_version
, string
- 归档横幅里指向最新版的链接
params.time_format_blog
, string
, defaultMonday, January 02, 2006
- 博客日期格式,按语言覆盖
其它
taxonomies
, map
- Hugo 原生:启用
tag: tags / category: categories,见分类体系
services.googleAnalytics.id
, string
- Hugo 原生:分析脚本只在生产构建注入,见分析与 SEO
module.hugoVersion.min
, string
, default0.160.1
- 主题声明的 Hugo 下限,低于它构建失败
module.hugoVersion.extended
, boolean
, defaulttrue
- 必须是 Hugo Extended(要编译 SCSS)
验证配置变更
改完配置跑一次严格构建:
hugo --printPathWarnings --panicOnWarning
输出 Total in … 且没有 ERROR / WARN 才算通过。常见报错与原因:
配置改动还要至少验证三件事:每种语言各一页、缺译页的回退、生产 baseURL 下的链接(子路径部署容易漏)。
主题声明的 Hugo 下限是 0.160.1,当前验证版本是 0.164.0。改动配置后按这两个版本各构建一次,可以及早发现只在新版本可用的特性:
# 下限版本的二进制
/path/to/hugo-0.160.1 --printPathWarnings --panicOnWarning
# 当前验证版本
hugo --printPathWarnings --panicOnWarning
下限版本写在主题的 hugo.yaml 与 theme.toml 里,站点自己的 module.hugoVersion.min 应与它一致。