跳到主要内容

故障排除

本章汇总了 Hugo 使用过程中常见的问题和解决方案。

常见错误

功能不可用错误

错误信息this feature is not available in this edition of Hugo

原因:Hugo 有三个版本,不同版本支持的功能不同:

功能标准版扩展版扩展/部署版
WebP 图片编码✔️✔️
Sass/SCSS 转 CSS(内置 LibSass)✔️✔️
部署到云存储(S3、GCS、Azure)✔️

解决方案:根据需要安装对应版本。大多数用户应该安装扩展版:

# Windows (Chocolatey)
choco install hugo-extended

# Windows (Scoop)
scoop install hugo-extended

# macOS
brew install hugo

# Linux (Snap)
sudo snap install hugo

首页显示 404

原因:首页内容未发布,可能是以下情况:

  • content/_index.mddraft = true
  • date 设置在未来
  • publishDate 设置在未来
  • expiryDate 设置在过去

解决方案

修改 Front Matter,或使用命令行标志:

# 构建草稿
hugo --buildDrafts

# 构建未来日期内容
hugo --buildFuture

# 构建过期内容
hugo --buildExpired

页面未发布

原因:与首页 404 类似,检查页面的 Front Matter:

  • draft 是否为 true
  • date 是否在未来
  • publishDate 是否在未来
  • expiryDate 是否在过去

解决方案

# 检查所有草稿
hugo list drafts

# 检查未来内容
hugo list future

# 检查过期内容
hugo list expired

子页面不显示

原因:可能使用了 index.md 而不是 _index.md

区别

文件名类型说明
index.md叶子包(Leaf Bundle)单独的页面,有自己的 URL
_index.md分支包(Branch Bundle)列表页面,包含子页面

示例

content/posts/
├── _index.md # 博客列表页(分支包)
├── first-post.md # 单篇文章
└── my-series/
├── index.md # 系列介绍页(叶子包)
├── part-1.md
└── part-2.md

Partial 模板渲染异常

原因:调用 partial 时忘记传递上下文。

错误示例

{{ partial "pagination.html" }}

正确示例

{{ partial "pagination.html" . }}

第二个参数 . 是当前上下文,partial 模板内部通过 . 访问。

变量赋值困惑

问题:== 有什么区别?

解答

  • := 初始化变量
  • = 为已存在的变量赋值
{{/* 初始化 */}}
{{ $title := .Title }}

{{/* 赋值 */}}
{{ $title = .Site.Title }}

{{/* 错误:变量未初始化 */}}
{{ $name = "test" }} <!-- 报错 -->

{{/* 错误:变量重复初始化 */}}
{{ $x := 1 }}
{{ $x := 2 }} <!-- 报错 -->

分页过滤失效

问题:使用 where 过滤后分页,结果不符合预期。

原因:同一个页面多次调用 PaginatePaginator 方法。

错误示例

{{ $paginator := .Paginate (where .Pages "Type" "posts") }}
<!-- 其他地方又调用了一次 -->
{{ $paginator2 := .Paginate .Pages }}

正确做法

每个页面只调用一次 Paginate,将结果存储到变量中复用:

{{ $pages := where .Site.RegularPages "Type" "posts" }}
{{ $paginator := .Paginate $pages }}

{{ range $paginator.Pages }}
<!-- 内容 -->
{{ end }}

短代码语法选择

问题:什么时候用 {{< >}},什么时候用 {{% %}}

解答

  • {{< shortcode >}}:内容不渲染 Markdown
  • {{% shortcode %}}:内容渲染 Markdown

使用 {{< >}} 的场景

<!-- 代码块不需要 Markdown 渲染 -->
{{< highlight python >}}
def hello():
print("Hello") # **这不会被渲染为粗体**
{{< /highlight >}}

使用 {{% %}} 的场景

<!-- 内容包含 Markdown -->
{{% note %}}
这是 **粗体***斜体*,需要被渲染
{{% /note %}}

构建结果不一致

问题:每次构建输出不同。

可能原因

  1. 页面冲突:两个页面发布到同一路径
  2. 并发问题:模板存在竞态条件

排查方法

# 检查页面路径冲突
hugo --printPathWarnings

文件变更未检测

问题hugo server 没有检测到文件变化。

常见场景

  • WSL 中运行 Hugo,项目文件在 Windows 分区
  • 项目文件在可移动驱动器上
  • 项目文件在 NFS/SMB/CIFS 网络存储上

解决方案

使用 --poll 参数轮询文件变化:

hugo server --poll 700ms

Store 值丢失

问题:在父模板中无法获取 .Store 设置的值。

原因.Store 的值在页面内容渲染时才确定。如果在渲染前访问,值为空。

解决方案

触发内容渲染:

{{ $noop := .Content }}
{{ .Store.Get "mykey" }}

触发内容渲染的方法

方法说明
.Content完整内容
.ContentWithoutSummary不含摘要的内容
.Summary摘要
.Plain纯文本
.PlainWords纯文本单词
.WordCount字数
.FuzzyWordCount模糊字数
.ReadingTime阅读时间
.Len内容长度
.Truncated是否截断

模板调试

打印变量内容

使用 debug.Dump 函数:

<pre>{{ debug.Dump .Params }}</pre>
<pre>{{ debug.Dump .Site }}</pre>

检查模板是否存在

{{ if templates.Exists "partials/header.html" }}
<!-- 模板存在 -->
{{ end }}

性能分析

启用模板性能指标:

templateMetrics = true
templateMetricsHints = true

运行 hugo 后,会输出每个模板的执行时间和内存使用情况。

查找未使用的模板

printUnusedTemplates = true

常见警告

翻译缺失警告

警告信息i18n|MISSING_TRANSLATION

解决方案

  1. 确保翻译文件存在:i18n/zh-cn.toml
  2. 检查翻译键是否正确
  3. 或启用配置显示占位符:
enableMissingTranslationPlaceholders = true

路径冲突警告

警告信息:多个页面输出到同一路径

排查

hugo --printPathWarnings

检查输出,找出冲突的页面。

隐藏警告

对于已知的非关键警告,可以隐藏:

ignoreLogs = ['warning-id-1', 'warning-id-2']

使用 warnidferroridf 函数可以创建可抑制的警告和错误。

构建问题

内存不足

症状:构建时崩溃或变慢

解决方案

# 清理未使用资源
hugo --gc

# 减少并发(如果内存有限)
HUGO_NUMWORKERMULTIPLIER=1 hugo

构建超时

错误信息timeout during render

原因:页面渲染耗时过长,可能是复杂的图片处理或远程数据获取。

解决方案

# 增加超时时间
timeout = '120s'

内容循环依赖

症状:构建卡住不动

原因:内容或模板存在循环引用

排查

  1. 检查 .GetPage 是否引用自身
  2. 检查相关内容查询是否造成无限循环
  3. 使用 hugo --templateMetrics 找出问题模板

开发环境问题

热重载不工作

检查项

  1. 是否在项目根目录运行 hugo server
  2. 文件是否在正确的 content/layouts/ 等目录
  3. 是否有语法错误导致构建失败

解决方案

# 强制完全重建
hugo server --disableFastRender

浏览器缓存

症状:修改后浏览器显示旧内容

解决方案

  1. 强制刷新:Ctrl + Shift + R(Windows)或 Cmd + Shift + R(macOS)
  2. 清除浏览器缓存
  3. 使用无痕模式测试

端口被占用

错误信息bind: address already in use

解决方案

# 使用其他端口
hugo server --port 1314

# 或找到占用进程并关闭

部署问题

CSS/JS 不加载

原因baseURL 配置错误

解决方案

确保 hugo.toml 中的 baseURL 正确:

baseURL = 'https://example.org/'  # 注意末尾斜杠

子目录部署问题

场景:部署到 https://example.com/blog/

配置

baseURL = 'https://example.com/blog/'

相对 URL:在模板中使用 relURLRelPermalink

<link rel="stylesheet" href="{{ "css/style.css" | relURL }}">
<a href="{{ .RelPermalink }}">{{ .Title }}</a>

资源 404

原因:资源文件位置错误

检查

  1. 静态文件放在 static/ 目录
  2. 需要处理的资源放在 assets/ 目录
  3. 页面资源放在页面目录中

区分

static/
├── images/logo.png → /images/logo.png

assets/
├── css/main.css → 需要通过 resources.Get 获取

content/posts/my-post/
├── index.md
└── cover.jpg → 页面资源,通过 .Resources.Get 获取

查找帮助

Hugo 论坛

Hugo 论坛 是最活跃的 Hugo 社区,有超过 20,000 个话题。提问前请:

  1. 搜索是否有类似问题
  2. 提供完整的错误信息
  3. 提供最小可复现示例
  4. 说明 Hugo 版本和操作系统

提供版本信息

提问时提供以下信息:

# 获取版本信息
hugo version
hugo env

# 输出示例
hugo v0.121.1+extended windows/amd64 BuildDate=2024-01-01
GOOS="windows"
GOARCH="amd64"

最小可复现示例

创建一个最小示例帮助他人理解问题:

  1. 创建新的空站点:hugo new site test
  2. 添加必要的配置和模板
  3. 描述问题步骤
  4. 提供完整的错误信息

小结

本章介绍了 Hugo 常见问题的解决方法:

  1. 功能不可用:选择正确的 Hugo 版本
  2. 页面不显示:检查 draft、date 等字段
  3. 模板问题:注意上下文传递和变量赋值
  4. 调试技巧:使用 debug.Dump 和性能分析
  5. 部署问题:确认 baseURL 和资源位置

遇到问题时,优先搜索 Hugo 论坛,大部分问题都有解决方案。