Published on
Web Development

แชร์วิธีการเพิ่ม Giscus Comment System ให้กับ Static Website

how-to-add-giscus-to-blog
Discord

หากใครทำเว็บ JAM Stack ไม่ว่าจะเป็น Gatsby, Next.js หรือ Static Site อื่นๆ ก็คงต้องมองหา Comment System ให้กับเว็บไซต์ของเรา ไม่เหมือน Wordpress ที่มีระบบ Comment ติดมาด้วย

ซึ่งพอเป็น JAMStack ตัว Comment ที่นิยมกัน ก็คงหนีไม่พ้น Disqus ซึ่งเวอร์ชั่นฟรี เราก็สามารถใช้งาน เพียงแต่ ต้องยอมให้มีการโหลดโฆษณา หรือติด Ads link บางหน้าเว็บเรา (กรณียืนยอม)

ซึ่งผมรู้สึกว่า ผมไม่อยากให้มันโหลดโฆษณา ทำเว็บช้าด้วย ก็เลยมองหาตัวเลือกอื่นๆ หลายตัว Commento, Isso, Giscus, Remark42, utterances สุดท้ายจบที่การเลือก giscus นั่นเอง

Giscus คืออะไร?

Giscus เป็น Comment System ที่ใช้ Github Discussions เป็นตัวเก็บข้อมูล เวลาที่เราแสดงความคิดเห็น ก็เชื่อมกับ Github ส่วนหน้าเว็บเรา ก็ทำการ Embded ตัว Discussion มาแสดง นั่นเอง

ข้อดีคือ

  • Open Source
  • ไม่มีโฆษณากวนใจ ไม่โดน tracking
  • ไม่ต้องใช้ Database ใดๆ ขอแค่มี github repo
  • หรือถ้าอยากโฮสเอง ก็ทำได้เช่นกัน

วิธีการใช้งาน

สามารถเข้าไปกดเลือก ใช้งานหน้าเว็บ Giscus ได้เลย โดยเงื่อนไขที่เราต้องมีคือ 3 ข้อ

  1. ตัว repository เราต้องเป็น Public
  2. ต้องติดตั้งแอพ giscus (ตัวที่อยู่ใน marketplace)
  3. เปิดใช้งาน Discusstions ที่อยู่ในส่วน Settings ของ repo เรา

Page <-> Discussions Mapping

เราสามารถเลือกได้ว่าจะให้ Embeded Comment เราทำการ Mapping ด้วยอะไร เช่น pathname หรือ URL หรือ title ของเว็บ ก็ได้

สรุป สิ่งที่ผมตั้งค่าคือ

  1. สร้าง repository ขึ้นมาใหม่ เป็นแบบ Public
  2. เปิดใช้งาน Discussions และก็ติดตั้งแอพ giscus
  3. หน้า giscus ใส่ชื่อ repo เราลงไป format คือ username/reponame
  4. Mapping เลือก pathname
  5. Discussion Category เลือก Announcements
  6. Theme เลือกแล้วแต่เรา light / dark หรือใครจะเลือก system ก็ตามสะดวก
  7. ที่เหลือไม่ได้ปรับแก้

สุดท้าย เราก็จะได้ script หน้าตาประมาณนี้

<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-reactions-enabled="1"
  data-emit-metadata="0"
  data-theme="light"
  data-lang="en"
  crossorigin="anonymous"
  async
></script>

ก็แค่นำ script ไปใส่ในเว็บ ก็สามารถมี comment บนเว็บเราได้แล้ว

เวลาที่ User จะคอมเม้น ตัวแอพ giscus จะขอสิทธิ์ Permission ของเรานะครับ การใช้งานก็แค่มี user github ก็ใช้งานได้เลย

ทำเป็น React Component

เนื่องจากว่าเว็บไซต์ผมเขียนด้วย Gatsby ฉะนั้น ก็เลยอยากแปลงเป็น React Component เพื่อนำไปใช้งานง่ายๆ โดยสิ่งที่ต้องทำคือ เพิ่ม <script> นั่นเอง ใช้ DOM ธรรมดาได้เลย

const script = document.createElement('script')
    script.setAttribute('data-repo', '')
    script.setAttribute('data-repo-id', '')
    ...
    ...

จะได้ Component เหมือนโค๊ดด้านล่าง

GiscusComment.jsx
import React, { useState, useEffect, useCallback } from 'react'

const GiscusComment = ({ mapping }) => {
  const [isShowComment, setIsShowComment] = useState(true)

  const COMMENTS_ID = 'comments-container'

  const config = {
    repo: '',
    repoId: '',
    category: '',
    categoryId: '',
    reactions: '1',
    metadata: '0',
    theme: ''
  }

  const fetchComments = useCallback(() => {
    setEnabledLoadComments(false)
    const script = document.createElement('script')
    script.src = 'https://giscus.app/client.js'
    script.setAttribute('data-repo', config.repo)
    script.setAttribute('data-repo-id', config.repoId)
    script.setAttribute('data-category', config.category)
    script.setAttribute('data-category-id', config.categoryId)
    script.setAttribute('data-mapping', mapping)
    script.setAttribute('data-reactions-enabled', config.reactions)
    script.setAttribute('data-emit-metadata', config.metadata)
    script.setAttribute('data-theme', config.theme)
    script.setAttribute('crossorigin', 'anonymous')
    script.setAttribute('data-lang', 'en')
    script.async = true

    const comments = document.getElementById(COMMENTS_ID)
    if (comments) comments.appendChild(script)

    return () => {
      const comments = document.getElementById(COMMENTS_ID)
      if (comments) comments.innerHTML = ''
    }
  }, [giscusTheme, mapping])

  // Reload on theme change
  useEffect(() => {
    const iframe = document.querySelector('iframe.giscus-frame')
    if (!iframe) return
    fetchComments()
  }, [fetchComments])

  return (
    <div>
      {enableLoadComments && (
        <button onClick={fetchComments}>
          Load Comments
        </button>
      )}
      <div className="giscus" id={COMMENTS_ID} />
    </div>
  )
}

export default GiscusComment

ทีนี้เวลาใช้งาน ก็แค่เรียก Component

import GiscusComment from './GiscusComment'

// pathname
<GiscusComment mapping={location.pathname} />

// url
<GiscusComment managing={location.href} />

ตัว React Component ผมนำโค๊ดมาจากที่นี่ครับ Tailwind Next.js Starter Blog

เป็นอันเรียบร้อย ลองใช้งานโดยการคอมเม้นด้านล่างดูได้ครับ :)

Authors
Discord