Hexo 评论系统

发布时间 2023-04-09 21:00:08作者: 苏木川

Hexo 评论系统

上一篇文章博客搭建教程搭建了一个博客的基本框架,但是没有解决博客评论问题,本文填充一下这部分欠缺。

Hexo 博客系统是静态博客,本身无法支持评论等动态的功能,但是可以通过第三方的评论系统让 Hexo 博客支持评论功能。常见的评论系统包括:Valine、Disqus、Gitment、Giscus 等,本文主要介绍 Giscus 的使用。

giscus 简介

giscus是由 GitHub Discussions 驱动的评论系统。让访客借助 GitHub 在你的网站上留下评论和反应,该项目受 utterances 启发。包括以下特性:

  • 开源;
  • 无跟踪,无广告,永久免费;
  • 无需数据库,全部数据均储存在 GitHub Discussions 中;
  • 支持自定义主题;
  • 支持多种语言;
  • 高度可配置;
  • 自动从 GitHub 拉取新评论与编辑;
  • 可自建服务;

运作原理

giscus 加载时,会使用 GitHub Discussions 搜索 API 根据选定的映射方式(如 URL、pathname<title> 等)来查找与当前页面关联的 discussion。如果找不到匹配的 discussion,giscus bot 就会在第一次有人留下评论或回应时自动创建一个 discussion。

要评论,访客必须按 GitHub OAuth 流程授权 giscus app 代表他发帖。或者访客也可以直接在 GitHub Discussion 里评论。你可以在 GitHub 上管理评论。

在 Hexo 中配置 giscus

Step 1:新建 Github 仓库,确保:

  1. 此仓库是公开的,否则访客将无法查看 discussion。
  2. giscus app 已安装否则访客将无法评论和回应。
  3. Discussions功能已在你的仓库中启用

Step 2:Hexo 配置

在你的 Hexo 博客目录中执行以下命令,安装 hexo-next-giscus 插件。

npm install hexo-next-giscus --save

然后在 Hexo 的 _config.yml 配置文件添加如下内容:

giscus:
  enable: true
  repo: # Github repository name
  repo_id: # Github repository id
  category: # Github discussion category
  category_id: # Github discussion category id
  # Available values: pathname | url | title | og:title
  mapping: pathname
  # Available values: 0 | 1 
  reactions_enabled: 1
   # Available values: 0 | 1 
  emit_metadata: 1
  # Available values: light | dark | dark_high_contrast | transparent_dark | preferred-color-scheme
  theme: light
  # Available values: en | zh-C
  lang: en
  # Available value: anonymous
  crossorigin: anonymous

或者在主题的配置文件 _config.themename.yml 中对应项添加即可,例如 butterfly 主题:

giscus:
 repo:    # uername/repo_name
 repo_id: 
 category_id: 
 theme:
  light: light
  dark: dark
 option:

repo_id是托管博客的代码仓库的一个标识值,category是该仓库Issues里面对应的分类(或者说是主题)。一个仓库默认具有下面几个分类:Announcements、General、Ideas、Q&A、Show and tell。这里我选择General作为评论的分类。最后的category_id类似repo_id也是对该分类的一个标识值。

如何快速的获取这些数据呢,可以通过GitHub官方的GraphQL API Explorer查询到。这里把查询所用的语句进行记录。

query {
  repository (name: "repo_name", owner: "owner_name")  {
    id
    discussionCategories (first: 5) {
      nodes {
        name
        id
      }
    }
  }
}

然后将查询数据填入对应项即可。

推荐使用公告(announcements)类型的分类,以确保新 discussion 只能由仓库维护者和 giscus 创建。

参考资料

[1] Giscus

[2] Giscus的基础设置

[3] How does one find out one's own Repo ID?