720 文字
4 分
ブログページにコメント機能が付けられる「giscus」をNext.jsで使う

お久しぶりです。私のブログにはコメントやリアクションを付けられる機能が無いので「giscus」を使ってコメント機能を実装してみました。

giscusとは#

GithubのDiscussion機能を活用したコメントシステムです。Githubアカウントがあればコメントやリアクションができるようになります。

giscus
A comments widget built on GitHub Discussions.
giscus favicon giscus.app
giscus

giscusの設定#

Next.jsでの使用方法

1. giscus Appのインストール#

  1. giscusを導入するリポジトリを公開設定(public)にする。

  2. 以下のリンクにアクセスしgiscusをインストールする

Build software better, together
GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.
Build software better, together favicon github.com
Build software better, together

img

  1. 対象のユーザを選択する。

    img

  2. Only select repositoriesを選択し、対象のリポジトリを選択し、Installをクリックする。

    img

  3. Okay, giscus was installed on the @xxxxxx account. と出てくれば Installは完了。

2. リポジトリのDiscussions機能を有効化する#

  1. Githubの対象リポジトリに移動する。

  2. Settingsに移動する

  3. General > Features > Discussionsのチェックを有効化する

3. giscusの設定を生成する#

  1. giscusにアクセスする。

  2. giscusの設定を生成する

名称パラメータ
リポジトリコメント機能を追加したいリポジトリ
ページとDiscussions連携設定Discussionのタイトルにページのpathnameを利用する
Discussionで使用するカテゴリAnnouncements
このカテゴリのみを検索します有効化
記事へのリアクションを有効にする有効化
テーマカラースキームに従う

Next.jsのスクリプトに適用する#

@giscus/reactライブラリを使用しています。
生成されたscriptを参考に設定する。

  1. ライブラリをインストールする。
Terminal window
npm install @giscus/react
  1. giscus.jsxを作成する。
    .envファイルにリポジトリ名、リポジトリID、カテゴリ、カテゴリIDを定義している。
    また、Light / Drak Modeに対応させるため、themeの部分は可変にしている。
giscus.jsx
import Giscus from "@giscus/react";
import { useTheme } from "next-themes";
import { useEffect, useState } from "react";
export const Comment = () => {
const { theme, systemTheme } = useTheme();
const [giscusTheme, setGiscusTheme] = useState("light");
useEffect(() => {
// themeが'system'の場合は、システムのテーマに基づいてGiscusのテーマを決定
const resolvedTheme = theme === "system" ? systemTheme : theme;
// Giscusのテーマを設定
setGiscusTheme(resolvedTheme === "dark" ? "dark" : "light");
}, [theme, systemTheme]);
return (
<Giscus
id="comments"
repo={process.env.NEXT_PUBLIC_GISCUS_REPO}
repoId={process.env.NEXT_PUBLIC_GISCUS_REPO_ID}
category={process.env.NEXT_PUBLIC_GISCUS_CATEGORY}
categoryId={process.env.NEXT_PUBLIC_GISCUS_CATEGORY_ID}
mapping="pathname"
reactionsEnabled="1"
emitMetadata="0"
inputPosition="bottom"
theme={giscusTheme} // 動的にテーマを変更
/>
);
};
  1. page.jsxに作成したコンポーネントを追加する。
page.jsx
const Giscus = dynamic(() => import("@/app/giscus").then((m) => m.Comment), {
ssr: false,
});
export default function Home() {
return (
<main>
<Giscus />
</main>
);
}
  1. 以下のように表示される。 img

参考にさせていただいたサイト#

giscus
A comments widget built on GitHub Discussions.
giscus favicon giscus.app
giscus
HugoのStackテーマのブログにgiscusを導入する
HugoのStackテーマのブログにgiscusを導入する favicon blog.k-bushi.com
HugoのStackテーマのブログにgiscusを導入する
giscus
/
giscus-component
Waiting for api.github.com...
00K
0K
0K
Waiting...