Skip to content
xyspg
Go back

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

166
この記事はAIによって中国語から翻訳されました。 原文を見る
Docusaurus のブログページにコメント欄を追加する

Docusaurus の Swizzle 機能を使用して、Docusaurus のブログページに Giscus コメント欄を追加します。

仕組み

Docusaurus の公式では、そのまま使えるコメントセクション用コンポーネントは提供されていませんが、Swizzle 機能を利用することでコンポーネントをカスタマイズして実装できます。

本文で使用するコメントシステムは Giscus です。これは GitHub Discussions をベースにしたオープンソースのコメントシステムです。

Image

Giscus の設定を作成する

リポジトリの設定

GitHub で Docusaurus サイトのリポジトリページに移動し、リポジトリが公開(Public)に設定されていることを確認してください。

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

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

Image

Giscus GitHub App ページに移動し、案内に従ってインストールします。必要に応じて Repository access の範囲を選択してください。

リポジトリの API KEY を取得する

Giscus 公式サイトを開き、自分のリポジトリのアドレスを入力します。

Image

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

<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/ 配下に GiscussComponents.js ファイルを作成します。

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

// GiscussComponent.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)。

> docusaurus swizzle

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

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

BlogListPage (Unsafe)
    BlogListPaginator (Unsafe)
   BlogPostItem (Unsafe)
    BlogPostItem/Container (Unsafe)
    BlogPostItem/Content (Unsafe)

Enter キーで WrapYES: I know what I am doing! を選択します。

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

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

// 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 を追加します。例:

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

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



Next Post
Pretext Matteflow Demo

评论

No comments yet

支持 Markdown