FastComments.com

Add Comments to Your SolidJS App

์ด๊ฒƒ์€ FastComments์˜ ๊ณต์‹ SolidJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

SolidJS ์•ฑ์— ์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€, ์ฑ„ํŒ… ๋ฐ ๋ฆฌ๋ทฐ ์œ„์ ฏ์„ ์ž„๋ฒ ๋“œํ•˜์„ธ์š”.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ

GitHub์—์„œ ๋ณด๊ธฐ


์„ค์น˜ Internal Link

npm install fastcomments-solidjs

์‚ฌ์šฉ๋ฒ• Internal Link

import { FastCommentsCommentWidget } from 'fastcomments-solidjs';

export default function App() {
  return <FastCommentsCommentWidget tenantId="demo" urlId="some-page-id" />;
}

์„ค์ • ๋ณ€๊ฒฝ์— ๋ฐ˜์‘ํ•˜๊ธฐ (๋ช…๋ นํ˜• ํ•ธ๋“ค) Internal Link

Solid์€ ์ž„์˜ ๊ฐ์ฒด์˜ ๊นŠ์€ ๋ณ€๊ฒฝ์„ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฒซ ๋ Œ๋” ์ดํ›„์˜ config ๋ณ€๊ฒฝ์€ ๋ช…์‹œ์ ์œผ๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ„์ ฏ์€ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋Š” apiRef๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค; ๋ฐ˜์‘์„ฑ์„ ๊ตฌ๋™ํ•˜๋ ค๋ฉด createEffect์—์„œ handle.update(partial)๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”:

import { createEffect, createSignal } from 'solid-js';
import { FastCommentsCommentWidget, type FastCommentsCommentWidgetHandle } from 'fastcomments-solidjs';

export default function Paginated() {
  const [page, setPage] = createSignal(0);
  let handle: FastCommentsCommentWidgetHandle | undefined;
  createEffect(() => handle?.update({ urlId: `product-${page()}` }));

  return (
    <>
      <button onClick={() => setPage(page() + 1)}>next</button>
      <FastCommentsCommentWidget
        apiRef={(h) => (handle = h)}
        tenantId="demo"
        urlId={`product-${page()}`}
      />
    </>
  );
}

update()๋Š” ์–ธ์ œ๋“ ์ง€ ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค:

  • Before the script has loaded: the partial is stashed and applied at init.
  • During an async init (reviews-summary, user-activity-feed): the partial is queued and applied when the callback resolves.
  • After init: it forwards straight to the live widget's .update() method.

๋ช…๋ นํ˜• ํ•ธ๋“ค API

interface WidgetHandle<Config> {
  getInstance: () => WidgetInstance | null;   // ์ตœ์‹  ๋ผ์ด๋ธŒ ์ธ์Šคํ„ด์Šค(๋˜๋Š” ๋งˆ์šดํŠธ ์ „์—๋Š” null)
  onInstance: (cb: (instance: WidgetInstance) => void) => void; // ์ธ์Šคํ„ด์Šค๊ฐ€ ์ค€๋น„๋˜๋ฉด ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋จ
  update: (partial: Partial<Config>) => void; // ๊ตฌ์„ฑ ๋ณ‘ํ•ฉ ๋ฐ ํ‘ธ์‹œ
}

.update()๋กœ ๋‹ค๋ฃจ์–ด์ง€์ง€ ์•Š๋Š” ๋ช…๋ นํ˜• ๋™์ž‘์—๋Š” getInstance()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ: openProfile:

const openProfile = () =>
  (handle?.getInstance() as { openProfile?: (o: { userId: string }) => void } | null)
    ?.openProfile?.({ userId: 'demo' });

์ปดํฌ๋„ŒํŠธ Internal Link

fastcomments-react์˜ ๋ชจ๋“  ์œ„์ ฏ์€ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

์ปดํฌ๋„ŒํŠธ ํ•ธ๋“ค ํƒ€์ž… ๋กœ๋“œ๋œ ์ž„๋ฒ ๋“œ
FastCommentsCommentWidget FastCommentsCommentWidgetHandle ์ฃผ๋ ฅ ์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€ ์œ„์ ฏ
FastCommentsCommentCountWidget FastCommentsCommentCountWidgetHandle ์ธ๋ผ์ธ ๋Œ“๊ธ€ ์ˆ˜ ๋ฐฐ์ง€
FastCommentsLiveChatWidget FastCommentsLiveChatWidgetHandle ์ŠคํŠธ๋ฆฌ๋ฐ ๋ผ์ด๋ธŒ ์ฑ„ํŒ… ์œ„์ ฏ
FastCommentsCollabChatWidget FastCommentsCollabChatWidgetHandle ํ…์ŠคํŠธ ์•ต์ปค ๊ธฐ๋ฐ˜ ํ˜‘์—… ์ฑ„ํŒ…
FastCommentsImageChatWidget FastCommentsImageChatWidgetHandle ์˜์—ญ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ๋Œ“๊ธ€
FastCommentsRecentCommentsWidget FastCommentsRecentCommentsWidgetHandle ์ตœ๊ทผ ๋Œ“๊ธ€ ํ”ผ๋“œ
FastCommentsRecentDiscussionsWidget FastCommentsRecentDiscussionsWidgetHandle ์ตœ๊ทผ ํ† ๋ก  ํ”ผ๋“œ
FastCommentsReviewsSummaryWidget FastCommentsReviewsSummaryWidgetHandle ๋ณ„์  ์š”์•ฝ
FastCommentsTopPagesWidget FastCommentsTopPagesWidgetHandle ๋Œ“๊ธ€ ์ตœ๋‹ค ํŽ˜์ด์ง€ ์ˆœ์œ„
FastCommentsUserActivityFeedWidget FastCommentsUserActivityFeedWidgetHandle ์‚ฌ์šฉ์ž๋ณ„ ํ™œ๋™ ํƒ€์ž„๋ผ์ธ

๊ธฐ์กด ์š”์†Œ์— ์ฒจ๋ถ€๋˜๋Š” ์œ„์ ฏ

FastCommentsCollabChatWidget์™€ FastCommentsImageChatWidget์€ ํ˜ธ์ถœ์ž๊ฐ€ ์ œ๊ณตํ•œ ์š”์†Œ์— ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์šดํŠธ๋œ ํ›„ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” targetRef ์ ‘๊ทผ์ž๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”:

import { FastCommentsImageChatWidget } from 'fastcomments-solidjs';

export default function ImageChat() {
  let img: HTMLImageElement | undefined;
  return (
    <>
      <img ref={img} src="/screenshot.png" alt="" />
      <FastCommentsImageChatWidget
        tenantId="demo"
        urlId="my-image"
        targetRef={() => img}
      />
    </>
  );
}

๋ฆฌ์ „

region="eu"๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์œ„์ ฏ ํŠธ๋ž˜ํ”ฝ์ด EU ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค.

์‡ผ์ผ€์ด์Šค Internal Link

์ „์ฒด ์‡ผ์ผ€์ด์Šค ์•ฑ์€ examples/example-showcase/์— ์žˆ์Šต๋‹ˆ๋‹ค. React ์‡ผ์ผ€์ด์Šค๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ ๋ชจ๋“  ๋ชจ๋“  ์œ„์ ฏ๊ณผ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„(๋‹คํฌ ๋ชจ๋“œ, ํŽ˜์ด์ง€๋„ค์ด์…˜, SSO, ์ฝœ๋ฐฑ)์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

cd examples/example-showcase
npm install
npm run dev

๋นŒ๋“œ Internal Link

npm install
npm run build       # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -> dist/
npm test            # vitest ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ
npm run build:demo  # ์‡ผ์ผ€์ด์Šค -> demo-dist/

๋„์›€์ด ํ•„์š”ํ•˜์‹ ๊ฐ€์š”?

SolidJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธ์ด ์žˆ์œผ์‹œ๋ฉด, ๋‹ค์Œ์„ ์ด์šฉํ•˜์„ธ์š”:

๊ธฐ์—ฌํ•˜๊ธฐ

๊ธฐ์—ฌ๋Š” ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์—ฌ ์ง€์นจ์€ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.