前言

静态博客虽然快速、安全,但缺少评论功能一直是个痛点。今天我要介绍的 Giscus 是一个基于 GitHub Discussions 的评论系统,完美解决了这个问题。

为什么选择 Giscus?

相比其他评论系统,Giscus 有以下优势:

  • 完全免费 - 基于 GitHub,无需付费
  • 无广告 - 没有任何广告干扰
  • 隐私友好 - 不跟踪用户数据
  • 支持 Markdown - 代码高亮、表情、图片都支持
  • 易于管理 - 所有评论在 GitHub Discussions 中统一管理
  • 开源 - 代码完全开源,可自定义
  • 主题适配 - 支持深色/浅色模式自动切换

前置要求

  • 一个 Hugo 博客
  • GitHub 账号
  • 一个公开的 GitHub 仓库(用于存储评论)

第一步:创建评论仓库

首先需要创建一个专门用于存储评论的 GitHub 仓库。

1.1 创建新仓库

  1. 登录 GitHub,访问 https://github.com/new
  2. 填写仓库信息:
    • Repository name: blog-comments(可以自定义名称)
    • Description: “博客评论系统”
    • Visibility: ⚠️ 必须选择 Public(公开仓库)
  3. 点击 Create repository 创建

注意:Giscus 只支持公开仓库,私有仓库无法使用。

1.2 启用 Discussions 功能

  1. 进入刚创建的仓库
  2. 点击顶部的 Settings 标签
  3. 向下滚动找到 Features 部分
  4. ✅ 勾选 Discussions 选项
  5. 保存设置

此时你会在仓库顶部看到新增的 Discussions 标签。


第二步:安装 Giscus App

Giscus 需要通过 GitHub App 来访问你的仓库。

2.1 安装应用

  1. 访问 Giscus App 页面:https://github.com/apps/giscus
  2. 点击绿色的 Install 按钮
  3. 选择安装位置:
    • 如果你有多个组织,选择你的个人账号或组织
  4. 选择仓库访问权限:
    • 选择 Only select repositories(仅选择特定仓库)
    • 在下拉列表中选择刚创建的 blog-comments 仓库
  5. 点击 Install 完成安装

提示:安装后,Giscus 可以读取你的仓库信息和 Discussions,但无法修改代码。


第三步:配置 Giscus

现在需要获取 Giscus 的配置信息。

3.1 访问配置页面

打开 Giscus 官方配置页面:https://giscus.app/zh-CN

3.2 填写仓库信息

配置 部分填写:

仓库:你的用户名/blog-comments
例如:c-x-x/blog-comments

如果配置正确,会看到:

  • 成功!此仓库满足所有条件。

如果出现 ❌ 错误,检查:

  • 仓库是否为公开
  • Discussions 是否已启用
  • Giscus App 是否已安装

3.3 选择映射方式

Discussion 分类映射方式 决定了文章如何关联到 Discussions:

推荐选择:

  • 🎯 pathname(路径名)- 使用文章的 URL 路径

其他选项:

  • url - 完整 URL(更改域名会断开关联)
  • title - 文章标题(更改标题会断开关联)
  • og:title - Open Graph 标题

推荐理由:pathname 最稳定,只要文章路径不变,评论就不会丢失。

3.4 选择 Discussion 分类

Discussion 分类 下拉框中选择:

推荐选择:

  • 🎯 Announcements(公告)

特点:

  • 只有仓库维护者可以创建新 Discussion
  • 防止他人随意创建无关话题
  • 保持评论区整洁

3.5 选择主题

主题 部分选择:

  • 🎯 preferred_color_scheme(跟随系统偏好)

这样评论区会自动适配你的博客主题(深色/浅色)。

3.6 获取配置代码

滚动到页面底部 启用 giscus 部分,你会看到类似这样的代码:

<script src="https://giscus.app/client.js"
        data-repo="c-x-x/blog-comments"
        data-repo-id="R_kgDOS5n9Lw"
        data-category="Announcements"
        data-category-id="DIC_kwDOS5n9L84C_FGp"
        ...>
</script>

重要:记录下这两个 ID:

  • data-repo-id → 仓库 ID
  • data-category-id → 分类 ID

第四步:集成到 Hugo 博客

现在开始将 Giscus 集成到你的 Hugo 博客中。

4.1 创建评论组件

在你的主题目录下创建评论组件文件:

themes/你的主题名/layouts/partials/comments.html

粘贴以下代码:

<!-- Giscus Comments Component -->
{{ if .Site.Params.giscus.enabled }}
<div class="comments-section">
  <div class="container" style="max-width: 900px; margin: 3rem auto; padding: 2rem;">
    <h3 class="section-title" style="font-size: 1.5rem; margin-bottom: 2rem;">💬 评论</h3>

    <div class="comments-wrapper">
      <script src="https://giscus.app/client.js"
              data-repo="{{ .Site.Params.giscus.repo }}"
              data-repo-id="{{ .Site.Params.giscus.repoId }}"
              data-category="{{ .Site.Params.giscus.category }}"
              data-category-id="{{ .Site.Params.giscus.categoryId }}"
              data-mapping="pathname"
              data-strict="0"
              data-reactions-enabled="1"
              data-emit-metadata="0"
              data-input-position="top"
              data-theme="preferred_color_scheme"
              data-lang="zh-CN"
              data-loading="lazy"
              crossorigin="anonymous"
              async>
      </script>
    </div>
  </div>
</div>

<style>
.comments-section {
  margin-top: 4rem;
}

.comments-wrapper {
  background: var(--color-bg-card, #ffffff);
  border-radius: 16px;
  border: 1px solid var(--color-border, #e5e7eb);
  padding: 2rem;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}

/* 如果你的主题支持毛玻璃效果 */
.comments-wrapper {
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.giscus, .giscus-frame {
  width: 100%;
}

@media (max-width: 768px) {
  .comments-wrapper {
    padding: 1rem;
  }
}
</style>

<script>
// 监听主题切换,同步 Giscus 主题
function updateGiscusTheme() {
  const theme = document.documentElement.getAttribute('data-theme');
  const iframe = document.querySelector('iframe.giscus-frame');

  if (!iframe) return;

  const giscusTheme = theme === 'dark' ? 'dark' : 'light';

  iframe.contentWindow.postMessage(
    {
      giscus: {
        setConfig: {
          theme: giscusTheme
        }
      }
    },
    'https://giscus.app'
  );
}

// 监听主题变化
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.attributeName === 'data-theme') {
      setTimeout(updateGiscusTheme, 500);
    }
  });
});

observer.observe(document.documentElement, {
  attributes: true,
  attributeFilter: ['data-theme']
});

// 首次加载后更新主题
window.addEventListener('load', () => {
  setTimeout(updateGiscusTheme, 1000);
});
</script>
{{ end }}

4.2 在文章模板中引入评论

编辑文章单页模板:

themes/你的主题名/layouts/_default/single.html

在文章内容的底部添加:

<article>
  <!-- 文章内容 -->
  <div class="article-content">
    {{ .Content }}
  </div>

  <!-- 添加评论组件 -->
  {{ partial "comments.html" . }}
</article>

4.3 配置 Hugo 站点

编辑站点配置文件 hugo.toml(或 config.toml),添加 Giscus 配置:

[params.giscus]
  enabled = true
  repo = "你的用户名/blog-comments"
  repoId = "R_kgDOS5n9Lw"  # 替换为你的 repo-id
  category = "Announcements"
  categoryId = "DIC_kwDOS5n9L84C_FGp"  # 替换为你的 category-id

重要:将 repoIdcategoryId 替换为第三步获取的实际值。


第五步:测试评论系统

5.1 启动本地服务器

hugo server -D

5.2 访问文章页面

打开浏览器访问任意文章,滚动到底部,你应该能看到评论区。

5.3 发布评论

  1. 点击 Sign in with GitHub 登录
  2. 授权 Giscus 访问你的 GitHub 账号
  3. 输入评论内容(支持 Markdown)
  4. 点击 Comment 发布

5.4 查看评论

评论发布后,你可以在两个地方看到:

  1. 博客文章页面 - 评论直接显示在文章下方
  2. GitHub Discussions - 访问 https://github.com/你的用户名/blog-comments/discussions

高级配置

自定义主题同步

如果你的博客有自定义主题切换功能,可以监听主题变化并同步到 Giscus:

// 假设你的主题切换按钮会改变 data-theme 属性
document.querySelector('.theme-toggle').addEventListener('click', () => {
  // 切换主题
  const newTheme = toggleTheme();
  
  // 同步到 Giscus
  const iframe = document.querySelector('iframe.giscus-frame');
  if (iframe) {
    iframe.contentWindow.postMessage({
      giscus: {
        setConfig: {
          theme: newTheme === 'dark' ? 'dark' : 'light'
        }
      }
    }, 'https://giscus.app');
  }
});

懒加载优化

为了提升页面加载速度,可以实现评论区懒加载:

// 仅当评论区进入视口时加载
const commentsSection = document.querySelector('.comments-section');

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 加载 Giscus 脚本
      loadGiscus();
      observer.unobserve(entry.target);
    }
  });
});

observer.observe(commentsSection);

自定义样式

根据你的博客主题调整评论区样式:

/* 调整评论区背景 */
.comments-wrapper {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border-radius: 20px;
}

/* 调整评论框边距 */
.giscus {
  padding: 1rem;
}

/* 移动端适配 */
@media (max-width: 768px) {
  .comments-section {
    padding: 1rem;
  }
}

常见问题

Q1: 评论区不显示?

检查清单

  • ✅ 仓库是否为公开
  • ✅ Discussions 是否已启用
  • ✅ Giscus App 是否已安装
  • hugo.toml 中的配置是否正确
  • repoIdcategoryId 是否正确

Q2: 评论无法发布?

可能原因:

  • GitHub 登录状态过期 - 重新登录
  • Giscus App 权限不足 - 重新安装
  • 网络问题 - 检查网络连接

Q3: 如何删除评论?

作为仓库管理员:

  1. 访问 GitHub Discussions
  2. 找到对应的评论
  3. 点击评论右上角的 ... 菜单
  4. 选择 Delete

Q4: 评论会丢失吗?

不会!评论存储在 GitHub Discussions 中,只要仓库不删除,评论就永久保存。

Q5: 可以导出评论吗?

可以!评论以 Discussion 形式存储在 GitHub,你可以:

  • 通过 GitHub API 导出
  • 手动复制保存
  • 使用第三方工具备份

Q6: 支持匿名评论吗?

不支持。评论者必须有 GitHub 账号并登录。这也是优点,可以有效防止垃圾评论。

Q7: 如何接收评论通知?

  1. 进入 GitHub Settings → Notifications
  2. 确保勾选了 Discussions 相关通知
  3. 有新评论时会收到邮件通知

总结

通过本教程,你应该已经成功为 Hugo 博客添加了 Giscus 评论系统。这个方案:

  • ✅ 完全免费
  • ✅ 易于维护
  • ✅ 数据安全
  • ✅ 功能强大

优点总结

  1. 基于 GitHub - 利用已有生态,无需额外服务
  2. Markdown 支持 - 代码、图片、表情全支持
  3. 主题适配 - 自动跟随博客主题
  4. 易于管理 - GitHub Discussions 统一管理
  5. 数据安全 - 数据存储在 GitHub,永不丢失

下一步

  • 🎨 自定义评论区样式,匹配你的博客主题
  • 📧 配置邮件通知,及时收到评论提醒
  • 🤖 考虑添加 GitHub Actions 自动化管理
  • 📊 使用 GitHub API 统计评论数据

参考资源

  • Giscus 官网:https://giscus.app/
  • Giscus GitHub:https://github.com/giscus/giscus
  • Hugo 文档:https://gohugo.io/
  • GitHub Discussions:https://docs.github.com/discussions

如果这篇教程对你有帮助,欢迎在下方评论区留言!👇

看,评论系统已经在工作了!😄