VitePress 使用 Gitalk 添加评论功能

LibraHeresy
• 阅读 473

前言

一个优质的博客怎么能没有评论功能呢,没有评论怎么和同志们的思想激情 ♂ 碰撞,获得新的收获。

Ah, That's good.

那么用什么方案呢,看来看去,不用自己搭建后端服务的方案都大同小异,都是利用 Githubissues 模块实现的。

其中的佼佼者是 GitmentGitalk ,只可惜这两个库是难兄难弟,基本上都停更了。

Gitment 最后更新日期为 2018.04.05, Gitalk 最后更新日期为 2022.07.18。

最后还是确定使用 Gitalk ,引用了大神 @lesonky 修改以后的 Gitalk 库,参考了博客《vitepress 配置评论(gitalk)》

环境

node: 16.15.1

Gitalk: 1.7.2

实现

注册 OAuth

这一步是为了使用 Github 提供的 OAuth2(第三方登录服务)。

1. 来到 Github Application 创建页面

VitePress 使用 Gitalk 添加评论功能

2. 配置参数注册 OAuth

VitePress 使用 Gitalk 添加评论功能

VitePress 使用 Gitalk 添加评论功能

3. 查看生成的 Client IDClient secrets

VitePress 使用 Gitalk 添加评论功能

VitePress 使用 Gitalk 添加评论功能

安装 Gitalk

根据上文博客评论区大神的说法,还是推荐直接从 Github 安装 Gitalk

因为我一直安装不成功大神的库,所以我直接 fork 了大神 Gitalk 仓库,把地址改成了自己的仓库地址,你们也可以直接用我的。

具体配置如下

"devDependencies": {
  "gitalk": "https://github.com/LibraHeresy/gitalk.git",
  "vitepress": "^1.0.0-alpha.72"
},

然后npm直接安装就行了。

挂载 Gitalk 组件

docs/.vitepress 路径下,新建 theme 文件夹,在该文件夹下新建 index.jsMyLayout.vue

index.js

index.js 文件内导入 VitePress 默认主题配置,再导入自己写的布局组件,覆盖默认主题对象的 Layout 属性,最后导出该文件。

import DefaultTheme from "vitepress/theme";
import MyLayout from "./MyLayout.vue";

export default {
  ...DefaultTheme,
  Layout: MyLayout,
};

MyLayout.vue

这里和上文的博客说法完全不一样,折腾了很久才知道,VitePress 有一个默认的 Layout 组件, Layout 组件内有负责渲染文本的 Content 组件,我们需要的只是在 Layout 组件上挂载一个评论组件而已。

但是按照博客的写法,不出意外我们只能收获一个只有评论组件的页面,所以就要导入原有的 Layout 组件,并使用 Vue3 的新写法,直接写一个子组件渲染挂载评论组件到 Layout 组件上。

<template>
  <Layout />
</template>

<script setup>
import DefaultTheme from "vitepress/theme";
const { Layout } = DefaultTheme;
import { watch, nextTick, onMounted } from "vue";
import "gitalk/dist/gitalk.css";
import Gitalk from "gitalk";
import { useRouter } from "vitepress";

let { route } = useRouter(); // 页面路由对象

onMounted(() => {
  watch(
    () => route.path, // 监听路由变化,重新挂载评论组件
    () => {
      nextTick(() => {
        if (typeof window !== undefined) {
          const content_div = document.querySelector(".content-container"); // 查找页面内容DOM节点,此节点只有layout为Page(默认layout属性)的md文档才有
          if (content_div) {
            const before_s_div = document.getElementById("gitalk-page-container") // 获取页面评论组件DOM节点
            if(before_s_div) { 判断是否已有评论组件节点,有则删除,重新创建。
              content_div.removeChild(before_s_div)
            }
            const s_div = document.createElement("div"); // 创建节点
            s_div.setAttribute("id", "gitalk-page-container"); // 设置id
            content_div.appendChild(s_div); // querySelector的节点可自己根据自己想加载的地方设置
            const gitment = new Gitalk({
              id: route.data.title, // 可选,推荐设置为页面标题,因为会作为标签传给Github issues,且issues标签有长度限制。
              owner: "LibraHeresy", // GitHub repository 所有者
              repo: "vite-press", // GitHub repository
              clientID: "", // 自己的clientID
              clientSecret: "", // 自己的clientSecret
              admin: ["LibraHeresy"], // GitHub repository 所有者
              labels: ["Gitalk"], // GitHub issue 的标签
              createIssueManually: false, //如果当前页面没有相应的 isssue 且登录的用户属于 admin,则会自动创建 issue。如果设置为 true,则显示一个初始化页面,创建 issue 需要点击 init 按钮。
            });
            gitment.render("gitalk-page-container");
          }
        }
      })
    },
    { immediate: true }
  );
});
</script>

全部配置好,就可以收获一个有评论功能的博客了。

VitePress 使用 Gitalk 添加评论功能

遇到的问题

打包报错,提示找不到 windowdocument 对象

因为在打包的时候,项目处于 node 环境,当然就没有 windowdocument 对象,所以和两个对象有关的方法要放在 onMounted 生命周期方法内,这是 VitePress 的规则。

切换首页后评论组件消失

这是因为当你首页设置layouthome时,页面是没有 .content-container 节点的,所以评论组件会和.content-container这个节点一起被删除。

而当你切回博客页面时,挂载方法是写在 onMounted 生命周期方法内,也不会再挂载评论组件了。

这个时候我们要用 watch 函数监听路由变化,重新执行挂载方法。

切换页面评论组件没有刷新

这是因为页面本身没有变化,变得只是 Content 组件渲染的文本内容而已,原因是 VueSPA 模式。

所以我们需要手动删除原有的评论组件 DOM 节点,重新挂载一个新的评论组件。

点赞
收藏
评论区
推荐文章
Aidan075 Aidan075
3年前
收藏这些API,获取网易云音乐数据超轻松
汇总了常见的网易云音乐API,墙裂建议点击右上角收藏下面是常见的网易云音乐get请求的API。简单介绍一下它们:评论http://music.163.com/api/v1/resource/comments/RSO4歌曲ID?limit20&offset0这应该是最最最常见的了,毕竟80%的网易云音乐的爬虫/数据分析文章都是关于评论数据使用技
冴羽 冴羽
2年前
VuePress 博客优化之增加 Vssue 评论功能
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。本篇讲讲如何使用Vssue快速的实现评论功能。主题内置因为我用的是vuepressthemereco主题,主题内置评论插件@vuepressreco/vuepressplugincomments,可以根据自己的喜好选择Valine或者Vssue。那我们来介绍下Vss
冴羽 冴羽
2年前
VuePress 博客优化之增加 Valine 评论功能
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。本篇讲讲如何使用Valine快速的实现评论功能。主题内置因为我用的是vuepressthemereco主题,主题内置评论插件@vuepressreco/vuepressplugincomments,可以根据自己的喜好选择Valine或者Vssue。本篇讲讲使用Val
Python进阶者 Python进阶者
2年前
一篇文章教会你使用Python定时抓取微博评论
【Part1——理论篇】大家好,我是皮皮。试想一个问题,如果我们要抓取某个微博大V微博的评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。但是很不幸,该接口频率受限,抓不了几次就被禁了,还没有开始起飞,就凉凉了。接下来小编又选择微博的移动端网站,先登录,然后找
Stella981 Stella981
3年前
Hexo+gitment
Gitment是一个基于GitHub问题的评论系统,可以在没有任何服务器端实现的前端使用。演示页面(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fimsun.github.io%2Fgitment%2F)中文简介(https://www.oschina.net/action
Stella981 Stella981
3年前
Github和Azure DevOps的代码同步
【前言】Github和AzureDevOps都提供了Git代码库功能,那么有没有办法将两边的代码库进行同步呢,答案是肯定的。这里的操作我都是用AzureDevOps的Pipelines功能来完成的,当然用Github的Actions应该也能达到类似的效果,其他小伙伴们不妨尝试一下。 【从AzureDevOps到Github】
Stella981 Stella981
3年前
Gitalk
Gitalk是一个基于GithubIssue和Preact开发的评论组件。特性使用Github登录支持多语言\en,zhCN,zhTW\支持个人或组织项目无干扰模式(设置distractionFreeMode为true开启)
Wesley13 Wesley13
3年前
mysql5.7.26 基于GTID的主从复制环境搭建
mysql5.7.26基于GTID的主从复制环境搭建时间:2019090616:10:21    阅读:20    评论:0    收藏:0    \点我收藏\标签:connect(https://www.oschina.net/action/GoToLink?
Stella981 Stella981
3年前
Gravatar头像介绍 镜像地址大全
介绍当我们在很多博客或者网站留言,评论的时候会看到有的人头像很酷很个性化,但是这个博客和网站本身并没有提供设置头像的功能,感觉有点神奇,那么是怎么做到的呢?其实这是使用了Gravatar。Gravatar,全称GloballyRecognizedAvatar。翻译成中文为全球通用头像。Gravatar的概念首先是在国外的独立Word
LibraHeresy LibraHeresy
1年前
Gitalk 自动初始化评论
前言Gitalk非常好用,但是一直有个问题困扰着我,评论不能自动初始化。我在网上看了一些文章,都是Hexo这个博客框架,然后什么sitemap,网站文件地图,看的我云里雾里。前几天突然灵光一闪,我其实只需要把Gitalk自身自带的初始化评论功能,在我的项目