Table of Contents

概要

Giscusは、静的ウェブサイトにコメントフォームを埋め込むためのGitHub Discussions上に構築されたコメントシステムです。

メリット:

  • 無料、軽量、見た目がクール
  • コメントは自分のリポジトリのGitHub Discussionsに保存される
  • コメントするにはGitHubログインが必要(スパム防止)

デメリット:

  • GitHubアカウントを持たない訪問者はコメントできない(しかし技術ブログには問題なし)

Giscus vs utterances

Giscusはutterancesから強くインスパイアされています。主要なコンセプトと使用方法はほぼ同じですが、いくつかの違いがあります。

  • Gisccus
    • コメントを保存するためにGitHub Discussionsを使用
    • utterancesよりも豊富な機能(例:リアクション、投票)
  • utterances
    • コメントを保存するためにGithub Issuesを使用

私はこのブログにGiscusを採用しました。なぜなら、GitHub IssuesよりもGitHub Discussionsの方がコメントを保存するのに適していると感じたからです。

インストール

インストール手順:

  1. リポジトリでDiscussions機能を有効にする(GitHub documentを参照)(giscus-botがこのリポジトリのDiscussionsにコメントを書き込みます。ブログリポジトリを使用するか、コメント専用の新しいリポジトリを作成してください)
  2. リポジトリにGiscus Appをインストールします。
  3. giscus.appでjavascriptを作成します。いくつかのオプションをカスタマイズできます。
  4. スクリプトをコピーしてブログコードに追加します。

スクリプトの例は以下のようになります:

<script
  src="https://giscus.app/client.js"
  data-repo="user/repository"
  data-repo-id="xxxxxxx"
  data-category="Comments"
  data-category-id="xxxxxx"
  data-mapping="pathname"
  data-strict="0"
  data-reactions-enabled="1"
  data-emit-metadata="0"
  data-input-position="top"
  data-theme="dark"
  data-lang="en"
  crossorigin="anonymous"
  async
></script>

動的なテーマ変更

ページテーマの変更に合わせてGiscusのテーマを動的に変更するには、いくつかのコーディングが必要です。

私は、Hugoで動作する私のブログにこの機能を実装するために、Issueのこのコメントを参照しました。

以下のコードをhtmlに追加しました。

<script>
    var theme = localStorage.getItem('data-theme') == null ? 'dark' : 'light';
</script>

<div class="comments">
    <script src="https://giscus.app/client.js"
        data-repo="user/repository"
        data-repo-id="xxxxxxx"
        data-category="Comments"
        data-category-id="xxxxxx"
        data-mapping="pathname"
        data-strict="0"
        data-reactions-enabled="1"
        data-emit-metadata="0"
        data-input-position="top"
        data-theme="dark"
        data-lang="en"
        crossorigin="anonymous"
        async>
    </script>
</div>

<script>
    document.querySelector('script[src="https://giscus.app/client.js"]').setAttribute('data-theme', theme);
</script>

その後、javascriptのテーマ変更機能にこのスクリプトも追加しました。

    const initTheme = (state) => {
        if (state === THEMES.DARK) {
            document.documentElement.classList.add(THEMES.DARK);
            document.documentElement.classList.remove(THEMES.LIGHT);
+            setGiscusTheme(THEMES.DARK);
        } else if (state === THEMES.LIGHT) {
            document.documentElement.classList.remove(THEMES.DARK);
            document.documentElement.classList.add(THEMES.LIGHT);
+            setGiscusTheme(THEMES.LIGHT);
        }
    };

+    function setGiscusTheme(theme) {
+        var iframe = document.querySelector('.giscus-frame');
+
+        if (iframe) {
+        var url = new URL(iframe.src);
+        url.searchParams.set('theme', theme);
+        iframe.src = url.toString();
+        }
+    }

詳細については私のブログテーマリポジトリを参照してください。

GitHub Discussions

Giscusシステムはこのブログのコメントを私のブログリポジトリのDiscussionsに保存します。