FastComments.com

ํ™•์žฅ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

๊ฐœ์š”

FastComments๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ™•์žฅ(Extensions)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

An Extension์€ ๋Œ“๊ธ€ ์œ„์ ฏ์— ์ถ”๊ฐ€ ๋งˆํฌ์—…์„ ๋”ํ•˜๊ณ , ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ํ™•์žฅ ์˜ˆ์ œ๋“ค๊ณผ ํ™•์žฅ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ Internal Link


๊ฐ ํ™•์žฅ ๊ธฐ๋Šฅ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋Œ“๊ธ€ ์œ„์ ฏ์ด ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€ ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ, ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ extension ๊ฐ์ฒด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค:

  • config - config ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ.
  • translations - translations ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ.
  • commentsById - ID๋ณ„ ๋ชจ๋“  ๋Œ“๊ธ€์— ๋Œ€ํ•œ ์ฐธ์กฐ.
  • root - ๋ฃจํŠธ DOM ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ.

ํ™•์žฅ ๊ธฐ๋Šฅ์€ ๋Œ“๊ธ€ ์œ„์ ฏ์ด ์ ์ ˆํ•œ ์‹œ์ ์— ํ˜ธ์ถœํ•  ์›ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์ •์˜ Internal Link

๊ฐ€์žฅ ์ž‘์€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๊ฐ„๋‹จํ•œ ํ™•์žฅ
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6})();
7

์ด ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด, ์ด๊ฒƒ์„ my-extension.js๋กœ ์ €์žฅํ•˜๊ณ  https://example.com/my-extension.min.js์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์„ธ์š”.

์ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋กœ๋“œ๋  ๋•Œ ์ฝ”์–ด ๋Œ“๊ธ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ ํ™•์žฅ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด Extension ๊ฐ์ฒด๋Š” ์‹ฑ๊ธ€ํ†ค์ด๋ฉฐ ๋‹ค๋ฅธ ํ™•์žฅ๊ณผ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, ํ™•์žฅ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋Œ“๊ธ€ ์œ„์ ฏ์— ์ด๋ฅผ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

Using a Custom Extension
Copy CopyRun External Link
1
2<script async src="https://cdn.fastcomments.com/js/embed-v2-async.min.js"></script>
3<div id="fastcomments-widget"></div>
4<script>
5window.fcConfigs = [{
6 "tenantId": "demo",
7 "extensions": [
8 {
9 "id": "my-extension",
10 "path": "https://example.com/my-extension.min.js"
11 }
12 ]
13}];
14</script>
15

์‹ค์šฉ์ ์ธ ์˜ˆ์ œ๋Š” ๋‹ค์Œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.


ํ™•์žฅ ๊ฐ์ฒด Internal Link

ํ™•์žฅ ๊ฐ์ฒด๋Š” ๋‹ค์Œ ์ •์˜๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

ํ™•์žฅ ๊ฐ์ฒด JSDoc
Copy CopyRun External Link
1
2/**
3 * The FastCommentsUI extension object. Used for lazy-loading certain components. For example, the review system is not
4 * used by all customers, so we only load that extension when we want it.
5 *
6 * @typedef {Object} FastCommentsUIExtension
7 * @property {string} id
8 * @property {Element} scriptNode
9 * @property {Element} root - ์œ„์ ฏ ๋ฃจํŠธ DOM ๋…ธ๋“œ.
10 * @property {string} [css]
11 * @property {Object} config - FastComments ๊ตฌ์„ฑ ๊ฐ์ฒด.
12 * @property {Object} commentsById - ID๋ณ„ ๋ชจ๋“  ๋Œ“๊ธ€์„ ๋‹ด๊ณ  ์žˆ๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ.
13 * @property {Object} translations - ๋ชจ๋“  ๋ฒˆ์—ญ์— ๋Œ€ํ•œ ์ฐธ์กฐ.
14 * @property {Function} reRenderComment - ๋Œ“๊ธ€์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ.
15 * @property {Function} removeCommentAndReRender - ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋Œ“๊ธ€์„ ์ œ๊ฑฐํ•˜๊ณ  DOM์˜ ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ.
16 * @property {Function} newBroadcastId - ์ƒˆ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฌด์‹œํ•  ๋กœ์ปฌ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ID ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ.
17 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
18 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving]
19 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
20 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - ๋Œ“๊ธ€ ์˜์—ญ์˜ HTML์„ ํ•„ํ„ฐํ•ฉ๋‹ˆ๋‹ค.
21 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - ๋ Œ๋”๋ง ์‹œ ์ „์ฒด ์œ„์ ฏ์˜ HTML์„ ํ•„ํ„ฐํ•ฉ๋‹ˆ๋‹ค.
22 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - ๋ Œ๋”๋ง ์ „์— ๊ฐ ๋Œ“๊ธ€์˜ HTML์„ ํ•„ํ„ฐํ•ฉ๋‹ˆ๋‹ค.
23 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - ๊ฐ ๋Œ“๊ธ€ ๋ฉ”๋‰ด๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— HTML์„ ํ•„ํ„ฐํ•ฉ๋‹ˆ๋‹ค.
24 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - ๋ Œ๋”๋ง ์‹œ ์ „์ฒด ์œ„์ ฏ์˜ HTML์„ ํ•„ํ„ฐํ•ฉ๋‹ˆ๋‹ค.
25 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (LEGACY) ๋‹ต๊ธ€ ์˜์—ญ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•  HTML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) ์œ„์ ฏ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•  HTML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) ๋Œ“๊ธ€ ์š”์†Œ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•  HTML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) ๋Œ“๊ธ€ ์š”์†Œ ํ•˜๋‹จ์— ์ถ”๊ฐ€ํ•  HTML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
29 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) ๊ฐ ๋Œ“๊ธ€์˜ ๋ฉ”๋‰ด ์š”์†Œ ํ•˜๋‹จ์— ์ถ”๊ฐ€ํ•  HTML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
30 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
31 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
32 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
33 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
34 */
35
36/**
37 * @callback FastCommentsUIExtensionSetupEventHandlers
38 * @param {Element} element - ๋ฃจํŠธ ์š”์†Œ.
39 * @param {Object.<string, Function>} clickListeners - ํด๋ž˜์Šค ์ด๋ฆ„๋ณ„ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ, ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
40 * @returns void
41 */
42
43/**
44 * @callback FastCommentsUIExtensionWidgetTopCallback
45 * @param {Object} moduleData
46 * @returns {string}
47 */
48
49/**
50 * @callback FastCommentsUIExtensionWidgetFilter
51 * @param {Object} moduleData
52 * @param {Object} html
53 * @returns {string}
54 */
55
56/**
57 * @callback FastCommentsUIExtensionCommentTopCallback
58 * @param {Object} comment
59 * @returns {string}
60 */
61
62/**
63 * @callback FastCommentsUIExtensionCommentTopFilter
64 * @param {Object} comment
65 * @param {string} html
66 * @returns {string}
67 */
68
69/**
70 * @callback FastCommentsUIExtensionCommentBottomCallback
71 * @param {Object} comment
72 * @returns {string}
73 */
74
75/**
76 * @callback FastCommentsUIExtensionMenuBottomCallback
77 * @param {Object} comment
78 * @returns {string}
79 */
80
81/**
82 * @callback FastCommentsUIExtensionMenuFilter
83 * @param {Object} comment
84 * @param {string} html
85 * @returns {string}
86 */
87
88/**
89 * @callback FastCommentsUIExtensionRenderCallback
90 * @returns {string}
91 */
92
93/**
94 * @callback FastCommentsUIExtensionConnectionStatusCallback
95 * @param {boolean} isConnected
96 * @returns {void}
97 */
98
99/**
100 * @callback FastCommentsUIExtensionInitialRenderCallback
101 * @returns {void}
102 */
103
104/**
105 * @callback FastCommentsUIExtensionReplyAreaTop
106 * @param {Object|null} currentUser
107 * @param {boolean} isSaving
108 * @param {boolean} isReplyOpen
109 * @param {string|null} parentId
110 * @returns {string}
111 */
112
113/**
114 * @callback FastCommentsUIExtensionReplyAreaFilter
115 * @param {Object|null} currentUser
116 * @param {boolean} isSaving
117 * @param {boolean} isReplyOpen
118 * @param {string|null} parentId
119 * @param {string|null} html
120 * @returns {string}
121 */
122
123/**
124 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
125 * @param {Object} comment
126 * @param {string} parentId
127 */
128
129/**
130 * @callback FastCommentsUIExtensionNewCommentCallback
131 * @param {Object} comment
132 */
133
134/**
135 * @callback FastCommentsUIExtensionPresenceUpdateCallback
136 * @param {Object} update
137 */
138

ํ™•์žฅ API Internal Link

Extension๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋˜๊ธธ ์›ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ •์˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•ž์˜ ์˜ˆ์ œ์—์„œ ์ด์–ด์„œ, ๊ฐ ๋Œ“๊ธ€์˜ ์ƒ๋‹จ์— HTML์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค:

๊ฐ„๋‹จํ•œ ํ™•์žฅ - ๊ณ„์†
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6
7 extension.commentFilter = function(comment, html) {
8 return `<h3>The user's name is ${comment.commenterName}!</h3>` + html;
9 }
10})();
11

์ด์™€ ๊ฐ™์ด HTML์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, dom-diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด UI์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€์„ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ

์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ reRenderComment๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋Œ“๊ธ€์„ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๋Œ“๊ธ€ ์žฌ๋ Œ๋”๋ง
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6
7 let renderCount = 0;
8
9 extension.commentFilter = function(comment, html) {
10 renderCount++;
11 return `<h3>The render count is ${renderCount}!</h3>` + html;
12 }
13
14 extension.onInitialRenderComplete = function() {
15 setInterval(function() {
16 extension.reRenderComment(extension.commentsById[Object.keys(extension.commentsById)[0]], function renderDone() {
17 console.log('Comment re-render done.');
18 });
19 }, 2000); // timeout not required, just an example.
20 }
21})();
22