Skip to content
Go back

为Docusaurus中的Blog启用评论功能

Edit page

为Docusaurus中的Blog启用评论功能

最近想在Docusaurus中启用评论功能, 但是官方并没有提供这个功能, 所以只能自己动手了.

目前的解决方案是通过Giscus来实现, 它是一个基于GithubDiscussions的评论系统实现的.
Discussions需要依赖Github账号来进行评论, 所以后续需要一个公共的仓库来存放评论数据.
如果你的博客是私有项目, 可以考虑创建一个新的公共的仓库用于存放评论数据, 这样可以确保原来的项目还可以为私有的.

以下内容会假设你拥有Github相关知识

配置Giscus

进入Giscus官网浏览文档, 然后根据文档中的要求进行配置.
主要有以下几个步骤:

以上是大致的配置步骤, 还有一些细节可以在刚才的官网页面中查看具体的配置说明. 例如:

验证配置

这些配置做好之后, 你需要对你的配置进行验证, 以确保你的配置是正确的.

giscus页面下的Repository提供了一个可以验证你的repo

获取参数

为了后续在Docusaurus中启用评论功能, 还需要获取一些参数, 这些参数后续会在Docusaurus中使用.

giscus页面下的Enable giscus会根据你的配置生成一段代码, 该代码包含了你需要的参数.
它看起来像这样:

<script
  src="https://giscus.app/client.js"
  data-repo="[ENTER REPO HERE]"
  data-repo-id="[ENTER REPO ID HERE]"
  data-category="[ENTER CATEGORY NAME HERE]"
  data-category-id="[ENTER CATEGORY ID HERE]"
  data-mapping="pathname"
  data-strict="0"
  data-reactions-enabled="1"
  data-emit-metadata="0"
  data-input-position="bottom"
  data-theme="preferred_color_scheme"
  data-lang="en"
  crossorigin="anonymous"
  async
></script>

安装Giscus

Giscus组件是一个React组件, 用于在Docusaurus中启用评论功能.
我们需要在项目中安装Giscus组件

npm install --save @giscus/react

组件扩展

Docusaurus中提供了Swizzling功能, 可以对Docusaurus 中的组件进行扩展并增加新的功能.
BlogPostItemDocusaurus中用于展示博客文章的组件, 该组件位于@theme-original/BlogPostItem中.
为了给在Docusaurus中启用评论功能, 需要对BlogPostItem进行扩展.

执行swizzle命令创建BlogPostItem组件

npm run swizzle @docusaurus/theme-classic BlogPostItem -- --wrap

该命令执行完成后src/theme/BlogPostItem/index.js文件会被创建

接下来对该文件进行编辑

注意: 该文件中的Giscus组件的xxx参数需要根据你的配置进行修改, 配置的参数在上一节中已经介绍过了

import React from "react";
import BlogPostItem from "@theme-original/BlogPostItem";
import Giscus from "@giscus/react";
import { useBlogPost } from "@docusaurus/theme-common/internal";
import { useColorMode } from "@docusaurus/theme-common";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";

export default function BlogPostItemWrapper(props) {
  const {
    i18n: { defaultLocale, localeConfigs },
  } = useDocusaurusContext();

  const { colorMode } = useColorMode();

  const { metadata, isBlogPostPage } = useBlogPost();
  return (
    <>
      <BlogPostItem {...props} />
      {isBlogPostPage && (
        <Giscus
          repo="xxx"
          repoId="xxx"
          category="xxx"
          categoryId="xxx"
          mapping="xxx"
          strict="xxx"
          reactionsEnabled="xxx"
          emitMetadata="xxx"
          inputPosition="xxx"
          theme={colorMode}
          lang={defaultLocale}
          crossorigin="anonymous"
          term="Welcome to @giscus/react component!"
          loading="lazy"
          async
        />
      )}
    </>
  );
}

最终效果

最终效果如下图所示:

enable-comment-in-docusaurus.png

参考资料


Edit page
Share this post on:

Previous Post
解决在Kotlin Coroutines中的命令行调用中出现Stream Closed异常
Next Post
Gitlab中常见的标签