为 Hugo 创建新主题

May 24, 2026 ·

创建一个新的 Hugo 主题是一个涉及多个步骤的过程,它允许您完全控制网站的外观和感觉。这个过程需要对 HTML、CSS 和 Go 模板语言有基本的了解。以下是创建新 Hugo 主题的详细指南:

1. 主题结构概览

Hugo 的主题遵循特定的目录结构。当您创建一个新主题时,Hugo 会在 themes/your-theme-name 目录下查找文件。关键的子目录包括:

  • layouts/: 包含您的主题的布局文件。这是定义页面结构和内容渲染的地方。
    • _default/: 包含默认布局,如 single.html (用于单个页面) 和 list.html (用于列表页面,如博客文章索引)。
    • partials/: 包含可重用的模板片段,如页眉、页脚和导航菜单。
    • index.html: 首页的自定义布局。
  • static/: 包含静态文件,如 CSS、JavaScript 和图像。这些文件将直接复制到站点的根目录。
  • assets/: 用于 Hugo Pipes 的文件,例如 Sass 编译、图像处理等。
  • data/: 包含数据文件 (JSON、YAML、TOML),可用于在模板中动态生成内容。
  • i18n/: 包含国际化 (i18n) 翻译文件。
  • content/: 通常不在此目录下创建文件,除非您想为主题提供示例内容。

2. 初始化您的主题

您可以使用 hugo new theme <theme-name> 命令来生成主题的骨架。例如:

hugo new theme myawesome theme

这将创建一个名为 myawesome-theme 的目录,并在其中包含上述标准的 Hugo 主题目录结构。

3. 配置您的站点以使用主题

创建主题后,您需要告诉 Hugo 在构建您的网站时使用它。这通常在您的站点根目录下的 config.toml (或 config.yaml/config.json) 文件中完成:

baseURL = "http://example.org/"
languageCode = "en-us"
title = "My New Hugo Site"

theme = "myawesome-theme"

4. 创建核心布局

4.1. layouts/_default/baseof.html

这是您主题的“基础”布局。它定义了整个网站的通用结构,例如 HTML 声明、<head> 部分以及页眉和页脚。其他布局将继承自这个基础布局。

<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    {{ .Hugo.Generator }}
    <title>{{ .Title }} - {{ .Site.Title }}</title>
    {{/* 引入 CSS 文件 */}}
    {{ $styles := resources.Get "css/style.css" | minify | fingerprint }}
    <link rel="stylesheet" href="{{ $styles.Permalink }}">
</head>
<body>
    {{/* 引入页眉 */}}
    {{ partial "header.html" . }}

    <main>
        {{ block "main" . }}
            {{ .Content }}
        {{ end }}
    </main>

    {{/* 引入页脚 */}}
    {{ partial "footer.html" . }}
</body>
</html>

4.2. layouts/_default/single.html

此布局用于渲染单个页面,例如博客文章或关于页面。它通常会调用 baseof.html 并使用 {{ block "main" . }} 来定义特定于页面的内容区域。

{{ define "main" }}
<article>
    <h1>{{ .Title }}</h1>
    <div>
        {{ .Content }}
    </div>
</article>
{{ end }}

4.3. layouts/_default/list.html

此布局用于渲染列表页面,如博客文章的索引页。它会遍历内容并显示每个项目的摘要。

{{ define "main" }}
<h1>{{ .Title }}</h1>
<ul>
    {{ range .Pages }}
    <li>
        <h2><a href="{{ .Permalink }}">{{ .Title }}</a></h2>
        <p>{{ .Summary }}</p>
    </li>
    {{ end }}
</ul>
{{ end }}

5. 创建可重用组件 (Partials)

可重用组件(partials)允许您将常见的 HTML 片段(如导航菜单、页眉、页脚)放在单独的文件中,然后在多个布局中引用它们。

5.1. layouts/partials/header.html

<header>
    <nav>
        <a href="{{ .Site.BaseURL }}">Home</a>
        {{ range .Site.Menus.main }}
            <a href="{{ .URL }}">{{ .Name }}</a>
        {{ end }}
    </nav>
</header>

5.2. layouts/partials/footer.html

<footer>
    <p>&copy; {{ now.Year }} {{ .Site.Title }}. All rights reserved.</p>
</footer>

6. 添加静态文件

static/css/ 目录下创建一个 style.css 文件,并添加您的 CSS 样式。

/* static/css/style.css */
body {
    font-family: sans-serif;
    margin: 20px;
}
header {
    background-color: #f0f0f0;
    padding: 10px;
    margin-bottom: 20px;
}
nav a {
    margin-right: 15px;
    text-decoration: none;
}
article {
    border: 1px solid #ccc;
    padding: 20px;
}

7. 使用 Hugo Pipes 进行更高级的功能

Hugo Pipes 是 Hugo 的一个强大功能,允许您在构建过程中处理静态文件。这包括:

  • Sass/SCSS 编译: 您可以在 assets/scss/ 目录下创建 Sass 文件,然后使用 resources.GettoCSS 进行编译。
  • JavaScript 压缩: 类似地,您可以压缩 JavaScript 文件。
  • 图像处理: 调整图像大小、裁剪、应用滤镜等。

例如,在 baseof.html 中,我们使用了 resources.Get "css/style.css" | minify | fingerprint 来处理 CSS。这里的 fingerprint 会生成一个带哈希值的文件名,以确保浏览器缓存失效。

8. 考虑主题的配置选项

一个好的主题应该允许用户通过 config.toml 进行一些自定义。您可以在 layouts/partials/ 中创建用于配置的模板,并在 baseof.html 中根据配置选项动态加载资源或修改布局。

9. 组织内容类型 (Archetypes)

如果您计划支持多种内容类型(如博客文章、项目),您可以在 archetypes/ 目录下创建对应的文件(例如 archetypes/posts.md)。当您使用 hugo new posts/my-first-post.md 命令时,Hugo 会使用该文件作为模板。

10. 国际化 (i18n)

对于支持多语言的网站,您需要在 i18n/ 目录下创建语言文件(例如 i18n/en.toml, i18n/zh-cn.toml),并在模板中使用 {{ T "key" }} 来引用翻译的文本。

11. 测试和迭代

在开发过程中,不断使用 hugo server 命令在本地预览您的网站,并根据需要进行迭代。Hugo 的热重载功能可以实时反映您的更改。

结论

创建一个 Hugo 主题是一个学习和实践 Web 开发技术的好机会。通过理解 Hugo 的目录结构、布局系统和模板语言,您可以构建出完全符合您需求的专业网站。记住,这是一个循序渐进的过程,从基础的 HTML 和 CSS 开始,然后逐渐深入到 Hugo 的高级功能。