如何在 VitePress 站点中集成 Gitalk 评论插件及其关键注意事项

你好,我是陈明勇,一名热爱技术、乐于分享的开发者,同时也是开源爱好者。

成功的路上并不拥挤,有没有兴趣结个伴?

个人网站:https://chenmingyong.cn

文章持续更新,如果本文能让您有所收获,欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog,欢迎大家 Star 催更并持续关注。

最近我使用了 Vitepress 来构建我的开源电子书 《Go 语言成长之路:从入门到精通》(Github 链接),并引入了 Gitalk 评论插件。这里分享一下集成 Gitalk 的实现步骤和心得体会,希望对有需要的人有所帮助。

前言

VitePress 是一个静态站点生成器 (SSG),非常适合用于个人博客或编写技术文档,深受很多开发者的喜爱。不过它缺少一个重要的功能——评论。

虽然 VitePress 没有内置评论功能,但它支持默认主题的扩展,并允许在 markdown 文件中嵌入 vue 代码。因此,我们可以自行集成评论功能。

本文将介绍如何在 Vitepress 站点中集成 Gitalk 插件,Gitalk 是一个基于 GitHub IssuePreact 开发的评论插件。它支持使用 GitHub 登录、支持多语言 [en, zh-CN, zh-TW, es-ES, fr, ru, de, pl, ko, fa, ja]、支持个人或组织、无干扰模式(设置 distractionFreeModetrue 开启)、快捷键提交评论 (cmd|ctrl + enter)。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

程序员陈明勇.jpeg

创建一个 github 仓库

在集成 Gitalk 插件之前,我们需要创建一个新的 Github 仓库,用于存储评论信息(以 Issue 的形式进行存储)。当然,如果 Vitepress 站点项目存储在一个 Github 仓库里,我们也可以将它作为存储评论信息的仓库,就不用额外创建一个新的仓库了。

创建仓库的步骤在这里就不多说了,我相信这个操作对于大家来说简直是小菜一碟,直接跳过。

注册 Github OAuth application

我们需要为 vitepress 站点创建一个 Oauth 应用,获取到一个 ClientIdClient Secret,后续集成 gitalk 插件的时候用到。

  • 1、进入开发者设置页面

    • 点击右上角的头像,然后选择 setting
      在这里插入图片描述

    • 在左侧菜单中,找到 Developer settings 并点击。
      在这里插入图片描述

  • 2、注册新的 OAuth 应用

    • 选择 Oauth Apps,点击 Register a new application` 按钮,进入到注册页面
      在这里插入图片描述

    • 填写应用信息

      • Application name: 应用名称,例如 site name comment
      • Homepage URL: 站点主页 URL,例如 https://yourblog.com
      • Application description: 应用描述。
      • Authorization callback URL: 一般与 Homepage URL 相同,填写 https://yourblog.com。如果你的 vitepress 项目部署在子路径下,需要填写完整路径,例如 https://yourblog.com/path
      • Enable Device Flow:是否允许 OAuth 应用通过设备流(Device Flow)来授权用户,本文介绍的使用场景不需要。
        在这里插入图片描述
  • 3、提交信息
    最后点击 Register application 提交信息,之后会得到一个 ClientIdClient Secret。如果 Client Secret 没有自动生成,页面会显示生成该值的按钮,你可以手动点击按钮进行生成。离开或刷新页面之后,Client Secret 不会再次显示,因此你需要保存它。若忘记,只能重新生成。

在 Vitepress 项目中集成 Gitalk

在配置 Gitalk 之前,确保你已经创建了一个 vitepress 项目。

安装 Gitalk

npm i --save gitalk

配置 Gitalk

完成以下配置后,相关的文件目录结构将包含以下部分:

├── .vitepress/
│   ├── theme
│   │   ├── index.ts
│   │   └── MyLayout.vue
│   └── gitalk.ts
  • 1、在 .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,      // 确保唯一性和长度小于 50distractionFreeMode: false  // 类似 facebook 的无干扰模式});gitalk.render('gitalk-container');
    }
    

    上面设置了 clientIDclientSecret 等常用的属性,除了这些属性以外,还有一些可选属性可以设置,具体请参考 gitalk。

  • 2、在 .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(() => {// 初次加载时初始化 GitalkinitGitalk();// 监听路由变化watch(() => route.path,(newPath) => {nextTick(() => {initGitalk();});});
    });
    </script>
    

    其中 <template #doc-after>自定义内容</template> 的作用是在文档结尾处插入自定义内容。

    由于 vitepress 初次访问时是静态的、预呈现的 HTML,之后页面会变成 Vue SPA。因此页面初次加载时直接调用 initGitalk() 函数初始化 Gitalk 评论组件,后续通过监听路由变化为新页面重新生成 Gitalk 评论组件。

  • 3、在 .vitepress 目录下创建 theme/index.ts 文件,添加以下内容,使用扩展后的主题:

    import DefaultTheme from 'vitepress/theme';
    import MyLayout from "./MyLayout.vue";export default {...DefaultTheme,Layout: MyLayout,
    }
    
  • 4、验证
    接下来访问某篇文章,如果看到类似下面图片的渲染效果,说明 Gitalk 已配置成功了:

在这里插入图片描述

如何有效设置 ID 属性值

在前面的代码示例中,通过 new Gitalk({...}) 创建 Gitalk 实例时,我们需要显式的设置一些属性值,其中就包括了 id

默认情况下,id 值为 location.href,你也可以赋值为 route.path,但这并非最佳实践,特别是在路径较长或复杂时。最佳做法是从 location.hrefroute.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 既简洁又唯一,便于管理和维护。

未找到相关的 Issues 进行评论

在我看来,首次访问文章时 Gitalk 应该自动创建相应的 issue 来保存评论信息,但我却看到了 “未找到相关的 Issues 进行评论,请联系 @xxx 初始化创建” 的提示。查阅 Gitalk 的说明文档后,我了解了具体原因。首先,createIssueManually 是创建 Gitalk 实例时的一个可选属性。Gitalk 官方提到:

  • createIssueManually Boolean

    Default: false.

    如果当前页面没有相应的 isssue 且登录的用户属于 admin,则会自动创建 issue。如果设置为 true,则显示一个初始化页面,创建 issue 需要点击 init 按钮。

因此,当出现 “未找到相关的 Issues 进行评论” 的提示时,需要使用管理员 GitHub 账号登录,才能让 Gitalk 自动创建对应的 issue;如果 createIssueManually 的值为 true,则需要手动点击 init 按钮来创建 issue

小结

在本文中,我们深入探讨了如何在 VitePress 站点中集成 Gitalk 评论插件,详细介绍了准备工作和集成步骤及其关键注意事项。

最关键的部分在于如何优雅地将评论组件引入文档中(使用扩展默认的 VitePress 主题的方式),以及设置有效的 ID 属性值。此外,我们还需了解 Gitalk 触发自动创建 issue 操作的前提条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547311.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OJ在线评测系统 后端 用策略模式优化判题机架构

判题机架构优化(策略模式) 思考 我们的判题策略可能会有很多种 比如 我们的代码沙箱本身执行程序需要消耗时间 这个时间可能不同的编程语言是不同的 比如沙箱执行Java要额外花费2秒 我们可以采用策略模式 针对不同的情况 定义不同独立的策略 而不是把所有情况全部放在一个i…

二分图算法模板以及简单应用

染色法判断二分图 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行&#xff0c;每行包含两个整数 u 和 v&#xff0c;表示点 u 和点 v 之间存在一条边。 输出格式 …

Matplotlib | 一文搞定Matplotlib从入门到实战演练!

文章目录 1 什么是Matplotlib1.1 Matplotlib的安装1.2 Matplotlib的基本使用 2 绘制直线3 绘制折线设置标签文字和线条粗细设置中文标题风格的设置 4 绘制曲线绘制曲线yx^2绘制正弦曲线和余弦曲线画布分区 5 绘制散点图绘制不同种类不同颜色的线 6 绘制条形图&#xff08;柱状&…

1. Linux系统(CentOS7.9)安装

toc 一、Linux概述介绍 1、Linux系统介绍 Linux, 一类操作系统的统称 部署在服务器上&#xff0c;部署项目、应用 服务器: 硬件设备, 柜式服务器&#xff0c;(华为、浪潮、联想) 提供服务的机器 2、Linux的优势 开源, open source , 开放源代码稳定性最大化发挥硬件资源 …

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?

在一个IC卡切换的工装板(一切多)中,设计需求是一张PCB(充当活动卡片)插入读卡器,将卡片中的所有信号引出通过连接器连接到后级设备。 比如下图所示是一种IC卡压力测试设备,使用钢片卡片将压力信号通过连接器引入测试设备。 最后根据ISO/IEC 7816-2标准中我们看到…

Mortise AI编程智能体产品 | OPENAIGC开发者大赛企业组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

c++ 杂项

简答题 1、什么是虚函数&#xff1f;什么是纯虚函数&#xff1f; 虚函数是在类中定义函数时&#xff0c;在函数前加 virtual 关键字。父子类中只有一个该函数。 如果子类中没有重写该虚函数。那么父子类空间中使用的都是父类定义的该函数。 如果子类中重写了该虚函数&#xff…

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…

9.26作业

C 面试题 1,什么是虚函数?什么是纯虚函数? 虚函数&#xff1a;父子类中&#xff0c;在父类中的函数需要在子类中进行重写&#xff0c;重写后父子类空间中使用的都是重写后的函数&#xff0c;该函数就是虚函数&#xff0c;虚函数的声明需要在函数前加virtual。 纯虚函数&…

从自身经历浅谈对于C++/Java的认识

1.声明 因为一些其他的原因&#xff0c;我决定从C转到java方向学习&#xff0c;后期可能就要换方向了&#xff0c;以后主要学习这个java相关的这个技术了&#xff0c;起码暂时不会学习这个C里面的内容了&#xff1b; 2.我的感慨 当时选方向的时候&#xff0c;我自己就是选的…

详解 Spring Boot 的 RedisAutoConfiguration 配置

引言 带大家分析 Spring Boot 内置的有关 Redis 的自动配置类【RedisAutoConfiguration】。 1. Spring Data Redis Spring Data Redis 是 Spring Data 家族的一部分&#xff0c;它提供了从 Spring 应用程序中轻松配置和访问 Redis 的功能。 我们来看看官方介绍的特性&#xff…

超60%项目聚焦智能体,百度“文心杯”创业大赛卷起来了

“通过AI Native工具AI Native工作流AI Native创作者协同&#xff0c;我们将传统A级漫画的创作成本降低了62%。”水母智能创始人兼CEO苗奘表示&#xff0c;“4月份决定报名参加‘文心杯’创业大赛&#xff0c;除了百度提供的奖金和资源外&#xff0c;更吸引我的是Robin的理念&a…

Synchronized对字符串上锁?

HTTP去请求就会像上面那种自动加个new String&#xff08;&#xff09;&#xff0c;就会导致锁的线程不是同一个对象&#xff0c;可以通过获取对应常量达到效果 但还有个问题&#xff0c;字符串常量是存在JVM的常量池中。常量池是全局的。所以在其他地方有引用到相关常量时&…

OCI 简介:Kubernetes 环境下从代码到容器的全流程

OCI 简介 在容器化技术的演进中&#xff0c;OCI&#xff08;Open Container Initiative&#xff09;提供了一套标准化的规范&#xff0c;帮助统一容器的构建、分发和运行。OCI 规范包含三个部分&#xff1a; OCI Image-spec&#xff1a;定义了容器镜像的结构&#xff0c;确保…

WAF,全称Web Application Firewall,好用WAF推荐

WAF&#xff0c;全称Web Application Firewall&#xff0c;即Web应用防火墙&#xff0c;是一种网络安全设备&#xff0c;旨在保护Web应用程序免受各种Web攻击&#xff0c;如SQL注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#xff08;CSRF&#xff09;等。 WAF通…

STM32堆栈溢出Bug

可以看到x和buf交换位置后&#xff0c;x处于0x200006B0地址上是不会被函数B影响到的&#xff0c;实际上B函数对buf赋值的过程是出现了越界行为的&#xff0c;所以导致了x在buf地址之后的话会被意外修改掉值。

海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?

在当今瞬息万变的经营环境中&#xff0c;突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力&#xff0c;国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…

Nacos笔记

nacos注册中心&#xff1a; nacos注册中心得单击非持久化搭建&#xff1a; 单机&#xff1a;指的是 Nacos 运行在单个实例上&#xff0c;通常用于开发和测试环境。非持久化&#xff1a;表示注册的信息&#xff08;如服务实例、元数据等&#xff09;不会被保存在数据库中。Nac…

Python 从入门到实战29(目录的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了文件的打开、创建、关闭、读取的相关知识。今天…

智慧政务助力实现服务民生新突破

在数字化转型的浪潮中&#xff0c;中国移动紧密结合人工智能&#xff08;AI&#xff09;技术&#xff0c;推动政务服务的智能化升级。近日&#xff0c;中国移动正式发布政务大模型3.0版本&#xff0c;以科技创新提升政务效率&#xff0c;实现服务民生的新突破。 为什么…