---
title: "Docusaurus のブログページにコメント欄を追加する"
description: "Docusaurus の Swizzle 機能を使用して、Docusaurus のブログページに Giscus コメント欄を追加します。"
author: "xyspg"
lang: "ja"
published: "2023-02-19T13:30:00.000Z"
tags:
  - "日本語"
url: "https://xyspg.moe/blog/ja/add-comment-section-to-docusaurus"
image: "https://xyspg.moe/images/blog/69a2996aee7927fa94389f287408c1060b2b88e3-3826x2065.png"
translations:
  zh: "https://xyspg.moe/blog/add-comment-section-to-docusaurus"
  en: "https://xyspg.moe/blog/en/add-comment-section-to-docusaurus"
---

# Docusaurus のブログページにコメント欄を追加する

## 仕組み

Docusaurus の公式では、そのまま使えるコメントセクション用コンポーネントは提供されていませんが、[Swizzle](https://docusaurus.io/zh-CN/docs/swizzling) 機能を利用することでコンポーネントをカスタマイズして実装できます。

本文で使用するコメントシステムは [Giscus](https://giscus.app/zh-CN) です。これは GitHub Discussions をベースにしたオープンソースのコメントシステムです。

![Image](https://xyspg.moe/images/blog/707ea9c00131890700239e3790dad15591b0a798-1526x476.png)

## Giscus の設定を作成する

### リポジトリの設定

[GitHub](https://github.com/) で Docusaurus サイトのリポジトリページに移動し、リポジトリが公開（Public）に設定されていることを確認してください。

公開されていない場合は、Settings - General の一番下にある Danger Zone - Change repository visibility から変更できます。

リポジトリが公開状態であることを確認したら、Settings の Features タブ内にある Discussions にチェックを入れます。

![Image](https://xyspg.moe/images/blog/3bf4d985c3891b5c8c8fd8f6064f992c6fa72c4d-1262x132.png)

[Giscus GitHub App ページ](https://github.com/apps/giscus)に移動し、案内に従ってインストールします。必要に応じて Repository access の範囲を選択してください。

### Giscus の設定値を取得する

[Giscus 公式サイト](https://giscus.app/zh-CN)を開き、自分のリポジトリのアドレスを入力します。

![Image](https://xyspg.moe/images/blog/441d939dbd9a4ab9c4ef934e1453d616a5b34b45-1032x578.png)

「Discussion カテゴリ」で「📣 Announcements」を選択します。その他のオプションは必要に応じて設定してください。設定が完了すると、ページ下部に設定ファイルの内容が表示されます。

```javascript
<script
  src="https://giscus.app/client.js"
  data-repo="your-name/your-repo"
  data-repo-id="your-repo-id"
  data-category="Announcements"
  data-category-id="your-category-id"
  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="zh-CN"
  crossorigin="anonymous"
  async
/>
```

## Swizzle を使って Giscus コンポーネントを挿入する

まず、プロジェクトに Giscus React コンポーネントをインストールします。

`npm i @giscus/react`

`/src/components/` 配下に `GiscusComponent.js` ファイルを作成します。

以下のコードをコピーして貼り付けます。各 ID の値は先ほど取得した設定ファイルから探してください。

```javascript
// GiscusComponent.js
import React from "react";
import Giscus from "@giscus/react";
import { useColorMode } from "@docusaurus/theme-common";

export default function GiscusComponent() {
  const { colorMode } = useColorMode();

  return (
    <Giscus
      repo="" //这里填写你的repo
      repoId="" //你的repo id
      category=" " //你的category（默认 Announcement）
      categoryId="" //你的category id
      mapping="pathname"
      term="Welcome to @giscus/react component!"
      strict="0"
      reactionsEnabled="1"
      emitMetadata="1"
      inputPosition="top"
      theme={colorMode}
      lang="zh-CN"
      loading="lazy"
      crossorigin="anonymous"
      async
    />
  );
}
```

Swizzle を実行します。

`npm run swizzle`

使用しているテーマ設定を選択します（デフォルトは theme-classic）。

```sh
> docusaurus swizzle

? Select a theme to swizzle: › - Use arrow-keys. Return to submit.
❯   @docusaurus/theme-classic
    @docusaurus/plugin-debug
    [Exit]
```

下にスクロールして `BlogPostItem` を探し、Enter キーで確定します。

```sh
BlogListPage (Unsafe)
    BlogListPaginator (Unsafe)
❯   BlogPostItem (Unsafe)
    BlogPostItem/Container (Unsafe)
    BlogPostItem/Content (Unsafe)
```

Enter キーで `Wrap` と `YES: I know what I am doing!` を選択します。

```sh
? Which swizzle action do you want to do? › - Use arrow-keys. Return to submit.
❯   Wrap (Unsafe)
    Eject (Unsafe)
    [Exit]
```

`/src/theme/BlogPostItem/index.js` を開き、内容を以下のように修正します。

```javascript
// src/theme/BlogPostItem/index.js
import React from "react";
import { useBlogPost } from "@docusaurus/theme-common/internal";
import BlogPostItem from "@theme-original/BlogPostItem";
import GiscusComponent from "@site/src/components/GiscusComponent";
import useIsBrowser from "@docusaurus/useIsBrowser";

export default function BlogPostItemWrapper(props) {
  const { metadata } = useBlogPost();
  const isBrowser = useIsBrowser();

  const { frontMatter, slug, title } = metadata;
  const { enableComments } = frontMatter;

  // 防止 ReferenceError: window is not defined 错误 (https://docusaurus.io/docs/advanced/ssg)
  var isCurrentUrlBlog = false;
  if (isBrowser) {
    isCurrentUrlBlog = window.location.pathname === "/blog";
  }

  return (
    <>
      <BlogPostItem {...props} />
      {enableComments && !isCurrentUrlBlog && <GiscusComponent />}
    </>
  );
}
```

次に、対象となるブログ記事の冒頭（Front Matter）に `enableComments: true` を追加します。例：

```markdown
---
title: 一个标题
authors: 作者
tags: [标签]
enableComments: true
---
```

swizzle を再実行するとコンポーネントが元に戻ってしまうため、再度修正が必要になることに注意してください。
