一、hexo添加评论区

  • hexo添加评论区还比较容易地,一共步

  我使用的是giscus,原理是使用github库中的discussions部分映射到你的博客中,你在博客的评论会储存到被映射库的discussions中.
  相同原理的也有utterances,它是使用github库中的issue部分映射的,但是utterances相对来说使用较为麻烦

1、为你的想要映射的库添加discussions

  你可以使用你博客的github.io,也可以新建一个库用于储存评论(如果你愿意的话)
点击这个库的setting

在general中直接往下滑,找到discussion,点击新建,就成功的为你这个库添加了discussion

2、在你的库中下载giscus

  点击giscus GitHub App进入,点击下载就ok,显示如下:

  如果之后再想加入新的仓库下载giscus进入就再个人-设置-Applications-configure加入新的仓库即可

3、启用 giscus

  点击giscus.app进入,

  输入你的用户名和仓库名,如果正确会显示
  (√,成功!该仓库满足所有条件。)
  下面的是映射反应,pathname和URL和title都相差不大,基于每个页面提供一个独特的标题
  如果你想要在一个页面里加入多个评论区,需要使用”Discussion 的标题包含特定字符串”
  Discussion 分类选择Announcements,最后参考下面的Js修改你的config.butterfly的comment部分

1
2
3
4
5
6
7
8
9
10
giscus:
enable: true
repo: "Morgenro/Morgenro.github.io"
repo_id: "Your_repo_id"
category: "Announcements"
category_id: "Your_category_id"
light_theme: light
dark_theme: dark
js:
option:

上述的是博客默认的评论区,如果你想要在其他页面添加comments,在md中加入js就好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="giscus-wrapper">
<script src="https://giscus.app/client.js"
data-repo="Morgenro/Morgenro.github.io"
data-repo-id="Your_data-repo-id"
data-category="Announcements"
data-category-id="Your_category-id"
data-mapping="specific"
data-term="diary-2023-07-14"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="bottom"
data-theme="light"
data-lang="zh-CN"
crossorigin="anonymous"
async>
</script>

到这里就实现了hexo添加评论区

二、为你的博客页面添加多个评论区

  当我直接在一个页面加入两个基于字符串的评论区时,发现只会显示最下面的评论区,原因是
  Giscus 插件(尤其是 Hexo 中的 giscus 插件)生成的是静态 HTML,只能在构建阶段加载一次脚本;
  多个实例无法动态挂载,因为 script 只执行一次,不支持多个容器同时绑定多个 Giscus 实例。
  这时候想到使用iframe,在一个网页中嵌入多个 iframe,分别加载不同的页面并在这些页面中各自加载 Giscus。尝试之后发现确实出现了两个评论区的轮廓,但是其中显示giscus.app未连接,原因可能是不支持跨域通信,也罢
  于是就干脆只显示一个评论区,在查看下一个评论区时将上面的评论区销毁即可,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
let currentGiscusContainer = null;

function loadGiscus(targetElement, term) {
// 清空之前的评论容器
if (currentGiscusContainer) {
currentGiscusContainer.innerHTML = '';
}

// 如果不存在容器则创建一个
let giscusDiv = targetElement.querySelector('.giscus-container');
if (!giscusDiv) {
giscusDiv = document.createElement('div');
giscusDiv.className = 'giscus-container';
targetElement.appendChild(giscusDiv);
}

currentGiscusContainer = giscusDiv;
giscusDiv.innerHTML = ''; // 清空旧的内容

const script = document.createElement('script');
script.src = 'https://giscus.app/client.js';
script.setAttribute('data-repo', giscusConfig.repo);
script.setAttribute('data-repo-id', giscusConfig.repoId);
script.setAttribute('data-category', giscusConfig.category);
script.setAttribute('data-category-id', giscusConfig.categoryId);
script.setAttribute('data-mapping', giscusConfig.mapping);
script.setAttribute('data-term', term);
script.setAttribute('data-strict', giscusConfig.strict);
script.setAttribute('data-reactions-enabled', giscusConfig.reactionsEnabled);
script.setAttribute('data-emit-metadata', giscusConfig.emitMetadata);
script.setAttribute('data-input-position', giscusConfig.inputPosition);
script.setAttribute('data-theme', giscusConfig.theme);
script.setAttribute('data-lang', giscusConfig.lang);
script.crossOrigin = 'anonymous';
script.async = true;

giscusDiv.appendChild(script);
}

document.addEventListener('DOMContentLoaded', function () {
const diaryItems = document.querySelectorAll('.diary-item');
if (diaryItems.length > 0) {
loadGiscus(diaryItems[0], diaryItems[0].getAttribute('data-term'));
}

diaryItems.forEach(item => {
item.addEventListener('click', () => {
const term = item.getAttribute('data-term');
loadGiscus(item, term);
item.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
});
});

于此就实现了在你需要的网页添加多个评论区
这里是点击触发,你也可以添加<bottom>来实现"展开评论"的按钮

7-18更新

  发现日记的评论区有时不会刷新在卡片中,而是刷新在网页的最下方,这是因为如果你在md文档中设置了comments= true,我使用的是loadGiscus函数动态加载,评论区脚本就会被被重复加载。导致评论区刷新位置出现问题。