最近我使用了
Vitepress
来构建我的开源电子书 《Go 语言成长之路:从入门到精通》(Github 链接),并引入了Gitalk
评论插件。这里分享一下集成Gitalk
的实现步骤和心得体会,希望对有需要的人有所帮助。
VitePress
是一个静态站点生成器 (SSG
),非常适合用于个人博客或编写技术文档,深受很多开发者的喜爱。不过它缺少一个重要的功能——评论。
虽然 VitePress
没有内置评论功能,但它支持默认主题的扩展,并允许在 markdown
文件中嵌入 vue
代码。因此,我们可以自行集成评论功能。
本文将介绍如何在 Vitepress
站点中集成 Gitalk
插件,Gitalk
是一个基于 GitHub Issue
和 Preact
开发的评论插件。它支持使用 GitHub
登录、支持多语言 [en, zh-CN, zh-TW, es-ES, fr, ru, de, pl, ko, fa, ja]
、支持个人或组织、无干扰模式(设置 distractionFreeMode
为 true
开启)、快捷键提交评论 (cmd|ctrl + enter
)。
准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。
在集成 Gitalk
插件之前,我们需要创建一个新的 Github
仓库,用于存储评论信息(以 Issue
的形式进行存储)。当然,如果 Vitepress
站点项目存储在一个 Github
仓库里,我们也可以将它作为存储评论信息的仓库,就不用额外创建一个新的仓库了。
创建仓库的步骤在这里就不多说了,我相信这个操作对于大家来说简直是小菜一碟,直接跳过。
我们需要为 vitepress
站点创建一个 Oauth
应用,获取到一个 ClientId
和 Client Secret
,后续集成 gitalk
插件的时候用到。
setting
。Developer settings
并点击。Oauth Apps,点击
Register a new application` 按钮,进入到注册页面。site name comment
。URL
,例如 https://yourblog.com
。Homepage URL
相同,填写 https://yourblog.com
。如果你的 vitepress
项目部署在子路径下,需要填写完整路径,例如 https://yourblog.com/path
。OAuth
应用通过设备流(Device Flow
)来授权用户,本文介绍的使用场景不需要。Register application
提交信息,之后会得到一个 ClientId
和 Client Secret
。如果 Client Secret
没有自动生成,页面会显示生成该值的按钮,你可以手动点击按钮进行生成。离开或刷新页面之后,Client Secret
不会再次显示,因此你需要保存它。若忘记,只能重新生成。在配置 Gitalk
之前,确保你已经创建了一个 vitepress
项目。
npm i --save gitalk
完成以下配置后,相关的文件目录结构将包含以下部分:
├── .vitepress/
│ ├── theme
│ │ ├── index.ts
│ │ └── MyLayout.vue
│ └── gitalk.ts
.vitepress
目录下创建 gitalk.ts
文件,添加以下内容:import Gitalk from 'gitalk';
import 'gitalk/dist/gitalk.css';
export default function createGitalk(path: string) {
const gitalk = new Gitalk({
clientID: 'GitHub Application Client ID',
clientSecret: 'GitHub Application Client Secret',
repo: '仓库名',
owner: '填写你的 Username',
admin: ['填写管理员的 Username'],
id: path, // 确保唯一性和长度小于 50
distractionFreeMode: false // 类似 facebook 的无干扰模式
});
gitalk.render('gitalk-container');
}
上面设置了 clientID
和 clientSecret
等常用的属性,除了这些属性以外,还有一些可选属性可以设置,具体请参考 gitalk。
.vitepress
目录下创建 theme/MyLayout.vue
文件,添加以下内容,在每个文档末尾引入评论组件,以扩展默认主题:<template>
<Layout>
<template #doc-after>
<div id="gitalk-container"></div>
</template>
</Layout>
</template>
<script type="ts" setup>
import DefaultTheme from 'vitepress/theme'
const {Layout} = DefaultTheme
import {watch, nextTick, onMounted} from "vue";
import "gitalk/dist/gitalk.css";
import {useRouter} from "vitepress";
import createGitalk from "../gitalk";
let {route} = useRouter(); // 页面路由对象
// 初始化 Gitalk
const initGitalk = () => {
if (typeof window !== 'undefined') {
const container = document.getElementById('gitalk-container');
if (container) {
container.innerHTML = '';
createGitalk(route.path);
}
}
};
onMounted(() => {
// 初次加载时初始化 Gitalk
initGitalk();
// 监听路由变化
watch(
() => route.path,
(newPath) => {
nextTick(() => {
initGitalk();
});
}
);
});
</script>
其中 <template #doc-after>自定义内容</template>
的作用是在文档结尾处插入自定义内容。
由于 vitepress
初次访问时是静态的、预呈现的 HTML
,之后页面会变成 Vue SPA
。因此页面初次加载时直接调用 initGitalk()
函数初始化 Gitalk
评论组件,后续通过监听路由变化为新页面重新生成 Gitalk
评论组件。
.vitepress
目录下创建 theme/index.ts
文件,添加以下内容,使用扩展后的主题:import DefaultTheme from 'vitepress/theme';
import MyLayout from "./MyLayout.vue";
export default {
...DefaultTheme,
Layout: MyLayout,
}
Gitalk
已配置成功了:在前面的代码示例中,通过 new Gitalk({...})
创建 Gitalk
实例时,我们需要显式的设置一些属性值,其中就包括了 id
。
默认情况下,id
值为 location.href
,你也可以赋值为 route.path
,但这并非最佳实践,特别是在路径较长或复杂时。最佳做法是从 location.href
或 route.path
中提取关键且唯一的部分作为 id
。
例如,在我的 《Go 语言成长之路:从入门到精通》 开源电子书项目中,其中一篇文章的路由是 /book/go-basic/go-language-introduction.html
。我从中提取了 go-language-introduction
作为 id
,相关函数定义如下所示:
const generateId = (path) => {
return path
.split('/') // 按照 / 切分
.pop() // 取最后一个部分
.replace(/\.html$/, ''); // 去掉结尾的 .html
};
通过这种方式,我们可以确保 id
既简洁又唯一,便于管理和维护。
在我看来,首次访问文章时 Gitalk
应该自动创建相应的 issue
来保存评论信息,但我却看到了 “未找到相关的 Issues 进行评论,请联系 @xxx 初始化创建” 的提示。查阅 Gitalk
的说明文档后,我了解了具体原因。首先,createIssueManually
是创建 Gitalk
实例时的一个可选属性。Gitalk
官方提到:
createIssueManually BooleanDefault: false.如果当前页面没有相应的 isssue 且登录的用户属于 admin,则会自动创建 issue。如果设置为 true,则显示一个初始化页面,创建 issue 需要点击 init 按钮。
因此,当出现 “未找到相关的 Issues 进行评论” 的提示时,需要使用管理员 GitHub
账号登录,才能让 Gitalk
自动创建对应的 issue
;如果 createIssueManually
的值为 true
,则需要手动点击 init
按钮来创建 issue
。
在本文中,我们深入探讨了如何在 VitePress
站点中集成 Gitalk
评论插件,详细介绍了准备工作和集成步骤及其关键注意事项。
最关键的部分在于如何优雅地将评论组件引入文档中(使用扩展默认的 VitePress
主题的方式),以及设置有效的 ID
属性值。此外,我们还需了解 Gitalk
触发自动创建 issue
操作的前提条件。
你好,我是陈明勇,一名热爱技术、乐于分享的开发者,同时也是开源爱好者。
成功的路上并不拥挤,有没有兴趣结个伴?
关注我,加我好友,一起学习一起进步!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。