前言

本站点基础搭建与内容撰写流程已就绪。本篇聚焦「个性化配置与体验优化」,记录笔者在使用过程中的几项偏好设置。

重要说明:本文所有内容均为可选项,非必须步骤。更多是对个人配置优化的记录,读者可根据实际需求选择参考,或直接跳过本篇。


一、文章元数据优化:显示修改日期与分类链接

1.1 需求说明

默认 PaperMod 主题的文章元数据仅显示发布日期、阅读时长、字数等。笔者希望:

  1. 当文章有修改时,显示「更新于」日期
  2. 在元数据区域显示分类的可点击链接

1.2 实现步骤

layouts/partials/ 目录新建 post_meta.html

cmd
mkdir layouts\partials
notepad layouts\partials\post_meta.html

粘贴以下内容:

html
{{- $scratch := newScratch }}

{{- if not .Date.IsZero -}}
    {{- $scratch.Add "meta" (slice (printf "<span title='%s'>%s</span>" (.Date) (.Date | time.Format (default ":date_long" site.Params.DateFormat)))) }}
{{- end }}

{{- /* 仅在 front matter 手动声明了 lastmod 且与 date 不同时显示 */ -}}
{{- if and (not .Lastmod.IsZero) (ne .Lastmod .Date) -}}
    {{- $scratch.Add "meta" (slice (printf "<span title='%s'>更新于 %s</span>" (.Lastmod) (.Lastmod | time.Format (default ":date_long" site.Params.DateFormat)))) }}
{{- end }}

{{- if (.Param "ShowReadingTime") -}}
    {{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime)))) }}
{{- end }}

{{- if (.Param "ShowWordCount") -}}
    {{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "words" .WordCount | default (printf "%d words" .WordCount)))) }}
{{- end }}

{{- /* 分类链接 */ -}}
{{- with .GetTerms "categories" }}
    {{- $categoryLinks := slice }}
    {{- range . }}
        {{- $categoryLinks = $categoryLinks | append (printf "<a href='%s'>%s</a>" .RelPermalink .LinkTitle) }}
    {{- end }}
    {{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (delimit $categoryLinks " · "))) }}
{{- end }}

{{- if not (.Param "hideAuthor") -}}
    {{- with (partial "author.html" .) }}
        {{- $scratch.Add "meta" (slice (printf "<span>%s</span>" .)) }}
    {{- end }}
{{- end }}

{{- with ($scratch.Get "meta") }}
    {{- delimit . "&nbsp;·&nbsp;" | safeHTML -}}
{{- end -}}

1.3 启用自定义元数据

编辑 hugo.toml,在 [params] 下添加:

toml
[params]
  # ... 其他配置
  customPostMeta = true

注意:PaperMod 默认加载 partials/post_meta.html,若主题更新后未生效,可检查 themes/PaperMod/layouts/single.html 中是否引用了该 partial。

1.4 文章 Front Matter 示例

toml
+++
title = '示例文章'
date = 2026-05-31T12:00:00+08:00
lastmod = 2026-06-01T10:00:00+08:00
categories = ['Tech Notes']
+++

效果:元数据区域将显示「2026-05-31 · 更新于 2026-06-01 · 5 min · 1200 words · Tech Notes」


二、文章导航文案自定义:区分「上一篇」与「上一页」

2.1 需求说明

默认 PaperMod 中,文章详情页底部的「上一篇/下一篇」与列表页分页的「上一页/下一页」共用同一套 i18n 文案。笔者希望:

  • 文章导航:显示「上一篇」「下一篇」
  • 列表分页:保持「上一页」「下一页」

2.2 创建中文语言文件

i18n/ 目录新建 zh.yaml

cmd
mkdir i18n
notepad i18n\zh.yaml

粘贴以下内容(注意 YAML 缩进):

yaml
- id: prev_post
  translation: "上一篇"
- id: next_post
  translation: "下一篇"
- id: prev_page
  translation: "上一页"
- id: next_page
  translation: "下一页"

2.3 自定义文章导航模板

layouts/partials/ 新建 post_nav_links.html

cmd
notepad layouts\partials\post_nav_links.html

粘贴以下内容:

html
{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
{{- if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="paginav">
  {{- with $pages.Next . }}
  <a class="prev" href="{{ .Permalink }}">
    <span class="title">« {{ i18n "prev_post" }}</span>
    <span>{{- .Name -}}</span>
  </a>
  {{- end }}
  {{- with $pages.Prev . }}
  <a class="next" href="{{ .Permalink }}">
    <span class="title">{{ i18n "next_post" }} »</span>
    <span>{{- .Name -}}</span>
  </a>
  {{- end }}
</nav>
{{- end }}

2.4 确保模板被引用

检查 themes/PaperMod/layouts/single.html,确认底部导航引用的是 post_nav_links

html
{{- if (.Param "ShowPostNavLinks") }}
  {{- partial "post_nav_links.html" . }}
{{- end }}

若主题文件中引用的是其他 partial 名称,可将上述代码直接替换原内容,或通过 layouts/single.html 覆盖主题模板。


三、代码块体验优化:常驻复制按钮 + 语言标签

3.1 需求说明

  • 复制按钮始终可见,无需鼠标悬停(对键盘/屏幕阅读器用户更友好)
  • 在代码块左上角显示语言类型,便于快速识别

3.2 常驻复制按钮:扩展 CSS

assets/css/extended/ 新建 blank.css

cmd
mkdir assets\css\extended
notepad assets\css\extended\blank.css

粘贴以下内容:

css
/* 让代码块复制按钮始终可见 - 视障用户友好配置 */

/* 为绝对定位创建包含块 */
.post-content .highlight {
    position: relative;
}

/* 合并后的按钮常驻样式 */
.post-content .highlight .copy-code {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
    position: absolute !important;
    top: 8px !important;
    right: 8px !important;
    z-index: 10 !important;
}

/* 关键优化:为复制按钮留出顶部空间,避免遮挡代码第一行 */
.post-content .highlight pre {
    padding-top: 2.5rem !important;
}

/* 复制成功后的反馈文字 */
.copy-code.copied::after {
    content: " 已复制" !important;
}

说明:!important 用于覆盖主题默认样式;padding-top 确保按钮不遮挡代码内容。

3.3 显示代码语言标签:自定义渲染模板

layouts/_markup/ 新建 render-codeblock.html

cmd
mkdir layouts\_markup
notepad layouts\_markup\render-codeblock.html

粘贴以下内容:

html
<!-- 让代码块前面显示代码语言类型 -->

{{ $lang := .Type | default "text" }}
<div class="highlight" data-lang="{{ $lang }}">
    <div class="code-lang-label">{{ $lang }}</div>
    {{ transform.Highlight .Inner $lang .Options }}
</div>

3.4 为语言标签添加基础样式(可选)

assets/css/extended/blank.css 末尾追加:

css
/* 代码块语言标签样式 */
.highlight {
    position: relative;
}

.code-lang-label {
    position: absolute;
    top: 4px;
    left: 12px;
    font-size: 0.75rem;
    color: var(--secondary);
    opacity: 0.8;
    pointer-events: none;
    z-index: 5;
}

/* 确保语言标签不与复制按钮重叠 */
.copy-code {
    right: 8px !important;
    left: auto !important;
}

3.5 验证效果

启动 hugo server 后,代码块应显示:

text
[cmd] ← 左上角语言标签
┌─────────────────
│ :: 命令内容
│ echo Hello
└─────────────────
[📋] ← 右上角常驻复制按钮

四、图片渲染优化:自动添加宽高属性

4.1 需求说明

图片加载时若未指定宽高,页面会发生布局偏移(Cumulative Layout Shift, CLS),影响阅读体验。通过自定义图片渲染模板,可自动注入宽高属性。

4.2 创建渲染模板

layouts/_markup/ 新建 render-image.html

cmd
notepad layouts\_markup\render-image.html

粘贴以下内容:

html
<img src="{{ .Destination | safeURL }}"
     {{ with .Title }}alt="{{ . }}"{{ end }}
     loading="lazy"
     {{ with .Width }}width="{{ . }}"{{ end }}
     {{ with .Height }}height="{{ . }}"{{ end }}>

4.3 效果说明

  • loading="lazy":图片进入视口时再加载,提升首屏速度
  • width / height:浏览器预留空间,避免布局抖动
  • alt:若图片有 Title 属性,自动作为替代文本,提升可访问性

注意:此优化仅对本地图片(/images/xxx.jpg)生效;外链图片需手动添加宽高或使用 CDN 服务。


五、构建验证与问题排查

5.1 重新构建站点

cmd
:: 清理缓存并强制重建
hugo --gc --minify --force

:: 启动预览(含草稿)
hugo server -D -F --disableFastRender

5.2 常见问题速查

现象 可能原因 解决方案
修改日期未显示 文章未设置 lastmod 或与 date 相同 检查 Front Matter,确保 lastmod 存在且值不同
分类链接不显示 文章未设置 categories 在 Front Matter 添加 categories = ['xxx']
复制按钮仍隐藏 CSS 被主题更新覆盖 确认 assets/css/extended/blank.css 被加载,或检查 Hugo extended 版本
语言标签位置错乱 代码块嵌套层级特殊 调整 .code-lang-labeltop/left
图片宽高未生效 图片为外链或构建时未处理 本地图片需放在 static/assets/ 目录

5.3 屏幕阅读器友好性验证

  • 导航至代码块区域,应能直接读到「复制代码」按钮
  • 按钮可通过 TabB 键聚焦,空格键触发复制
  • 图片的 alt 属性会被屏幕阅读器朗读

小结

本篇记录的优化项汇总:

  1. 元数据增强:显示修改日期 + 分类链接,提升文章信息密度
  2. 导航文案区分:文章页用「上一篇」,列表页保持「上一页」,语义更清晰
  3. 代码块体验:常驻复制按钮 + 语言标签,兼顾可视与无障碍用户
  4. 图片渲染:自动添加宽高,减少布局偏移,提升加载体验

再次强调:以上均为个人偏好配置,非必须步骤。若追求极简,可跳过本篇直接使用默认主题。


参考资源


优化原则:先可用,再好用。每次只改一处,验证通过后再继续。毕竟,配置是为了服务内容,而非反过来。