utterances
๋ ๊ฐ์ธ ๊ธฐ์ ๋ธ๋ก๊ทธ์์ ๋ง์ด ์ฌ์ฉ๋๋ ์คํ์์ค ๋๊ธ ์๋น์ค์
๋๋ค. ๊นํ ์คํ์ผ
์ ๊น๋ํ ๋์์ธ๊ณผ ๋คํฌ ๋ชจ๋
๋ฅผ ์ง์ํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ต๊ทผ์๋ ๋์ดํธ ๋ชจ๋์ ๋คํฌ๋ชจ๋๋ฅผ ๋ค์ด๋๋ฏน
ํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ์ฌ์ดํธ๊ฐ ๋ง์์ง๊ณ ์์ต๋๋ค. ์ ๋ธ๋ก๊ทธ ๋ํ ์ด๋ฌํ ๋ฐฉ์์ด๋ฏ๋ก utterances
์ ํ
๋ง๋ฅผ ๋ค์ด๋๋ฏนํ๊ฒ ์ ์ฉํด์ผ ํ์ต๋๋ค.
๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ํด์ ์ธ๊ธํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฒ ํฌ์คํ ์์๋ utterances์ ํ ๋ง๋ฅผ ๋ค์ด๋๋ฏนํ๊ฒ ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ค์ ์ผ๋ก ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
Utterances ์ ์ฉ ๋ฐฉ๋ฒ
๋จ์ผ ํ ๋ง ์ ์ฉ
์น์ฌ์ดํธ๊ฐ ํ๋์ ํ ๋ง๋ง ์ ์ฉ๋ ๋๋ ์๋์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋๊ธ ๊ธฐ๋ฅ์ ์ ์ฉํ์ฌ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
- ๋๊ธ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ณ ์ ํ๋ ๋ ํฌ๋ฅผ
public
์ผ๋ก ์ค์ - ๊นํ์ utterances app ์ค์น
- utterances ์ฌ์ดํธ์ ์ ์
repo
์theme
๋ฅผ ์ง์ ํด์ฃผ๊ณ ํ๋จ์ ์์นํ ์คํฌ๋ฆฝํธ ๋ณต์ฌ- ๋๊ธ์ ์์น์ํฌ ๋ถ๋ถ์ ํด๋น ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐ
utterances app์ ์ค์นํ ๋, ๋ชจ๋ ๋ ํฌ ํน์ ๋๊ธ ๊ธฐ๋ฅ์ด ํ์ํ ๋ ํฌ๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
๋ค์ด๋๋ฏน ํ ๋ง ์ ์ฉ
๋คํฌ๋ชจ๋์ ๋์ดํธ๋ชจ๋๋ฅผ ๋ชจ๋ ์ง์ํ๋ ์ฌ์ดํธ์ ๊ฒฝ์ฐ, Utterances
๋ํ ์ฌ๊ธฐ์ ๋ง์ถฐ์ ํ
๋ง๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๋์์ธ์ ์ธ ํต์ผ์ฑ์ ์๊ฒ ๋ฉ๋๋ค.
๋๊ธ์ ์ ์ฉํ ์์น ์ ์
/layouts/partials/comments.html
{{- /* Comments area start */ -}}
<div class="comments">
<script>
<!-- ์๋ฐ์คํฌ๋ฆฝํธ ์์ฑ -->
</script>
</div>
{{- /* Comments area end */ -}}
์ฐ์ ๋๊ธ์ ๋ฃ์ ๋ถ๋ถ์ ์ฐพ์ต๋๋ค. ์ ๋ธ๋ก๊ทธ์ ์ฌ์ฉ๋ hugo์ ๊ฒฝ์ฐ ํ
๋ง๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ
๋ง๋ฅผ ์ ์ํ๋ ๋ถ๋ค๋ ์ด๋ฌํ ๊ฒ์ ๊ณ ๋ คํ์ฌ ์ค๋ฒ๋ผ์ด๋ฉํ ์ ์๋๋ก ํ์ผ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ก๋๋ค. ๊ทธ๋์ ์ ๋ comments.html
์ด๋ผ๋ ํ์ผ๋ง์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ๋๊ธ ๊ธฐ๋ฅ์ ์ ์ฉํ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฑ
loadComment();
const callback = (mutationsList) => {
mutationsList.forEach(mutation => {
if (mutation.attributeName === "class" && document.querySelector('.utterances-frame')) {
const message = {
type: 'set-theme',
theme: getTheme()
};
const iframe = document.querySelector('.utterances-frame');
iframe.contentWindow.postMessage(message, 'https://utteranc.es');
}
})
}
const mutationObserver = new MutationObserver(callback);
mutationObserver.observe(document.body, { attributes: true });
function getTheme() { // ์ฌ์ดํธ์ ํ
๋ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋
var theme = window.localStorage && window.localStorage.getItem("pref-theme");
if (theme == null) {
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
return theme === 'dark' ? 'github-dark' : 'github-light';
}
function loadComment() {
let s = document.createElement('script');
s.src = 'https://utteranc.es/client.js';
s.setAttribute('repo', 'junghoon-vans/vanslog'); // ๋ณธ์ธ ๋ ํฌ ์ง์
s.setAttribute('issue-term', 'pathname');
s.setAttribute('theme', getTheme());
s.setAttribute('crossorigin', 'anonymous');
s.setAttribute('async', '');
document.querySelector('div.comments').innerHTML = '';
document.querySelector('div.comments').appendChild(s);
}
์ ์ฝ๋๋ loadComments
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ utterances
๋๊ธ์ ๋ถ๋ฌ์จ ์ดํ, mutationObserver
๊ฐ DOM์ ์ํ ๋ณ๊ฒฝ์ ์ธ์งํ์ฌ utterances์ ํ
๋ง๋ฅผ ๋ณ๊ฒฝ์ํต๋๋ค. getTheme
๋ฉ์๋๋ ํ์ฌ ์ฌ์ดํธ๊ฐ ์ด๋ค ๋ชจ๋์ธ์ง๋ฅผ ํ์ธํด์ ๋๊ธ์ ์ ์ฉํ ํ
๋ง๋ฅผ ์ง์ ํฉ๋๋ค.
์ ๋ธ๋ก๊ทธ ํ
๋ง์ธ papermod
๋ ํ์ฌ ๋ชจ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ pref-theme
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ํตํด ํ์ฌ ๋คํฌ ๋ชจ๋์ธ์ง ๋ผ์ดํธ ๋ชจ๋์ธ์ง๋ฅผ ํ์ธํ์์ต๋๋ค. ๋ํ ํ
๋ง๋ฅผ ์ง์ ์ง์ ํ ์ ์ด ์๋ค๋ฉด ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ํด๋น ๊ฐ์ด null
์ผ ์ ์์ผ๋ฏ๋ก, ์ด๋ฌํ ๊ฒฝ์ฐ ์๋์ผ๋ก ์์คํ
์ค์
์ ๋ฐ๋ผ๊ฐ๋๋ก ํ์์ต๋๋ค.
ํน์๋ผ๋ ์ด ๊ธ์ ์ฐธ๊ณ ํ์ฌ ๋ณธ์ธ ๋ธ๋ก๊ทธ์ ์ ์ฉํ๋ ค ํ์๋ ค๋ ๋ถ์ด ๊ณ์๋ค๋ฉด ๋ค์์ ์ ์ํ์๋ฉด ๋ฉ๋๋ค.
getTheme
๋ฉ์๋์ ๊ฒฝ์ฐ ์ฌ์ดํธ์ ๋ฐ๋ผ ์์ ๋ชจ๋๋ฅผ ์ง์ ํ๋ ๋ฐฉ์์ด ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก, ๊ผญ ๋ชจ๋๋ฅผ ์ง์ ํ๋ ๋ณ์๊ฐ ์ด๋ค ๊ฒ์ธ์ง๋ฅผ ํ์ธํ์ ์ผ ํฉ๋๋ค. ๋์งธ๋กloadCommant
๋ฉ์๋์์ ๋ ํฌ์งํ ๋ฆฌ ์ง์ ์ ๋ณธ์ธ์ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ์ ์ผ ํฉ๋๋ค.
๋ง์น๋ฉฐ
๋ธ๋ก๊ทธ๋ฅผ ์ง์ ์ปค์คํ ํ๋ ๊ณผ์ ์์ ํ๋ก ํธ์๋ ์์ค์ฝ๋์ ์์ ๋๊ฒ ๋์์ต๋๋ค. ์ด์ ๊น์ง ์ ์ ์์ญ์ ๋ฐฑ์๋์ ํ์ ๋์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ, ๋ง์ ํด๋ณด๋ ํ๋ก ํธ์๋๋ ์ฌ๋ฏธ์๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์์ ์ ํ๊ณ๋ฅผ ์ ์ค์ค๋ก ์ค์ ํ๊ณ ์์๋ ๊ฒ์ ์๋์ง์ ๋ํด์ ์๊ฐ์ ํ๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ผ๋ก๋ ์กฐ๊ธ ๋ ์ด๋ฆฐ ๋ง์์ผ๋ก ์ฌ๋ฌ ๋ฐฉ๋ฉด์ผ๋ก ๊ณต๋ถํ๋ ๋ง์๊ฐ์ง์ ๊ฐ์ ธ์ผ ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์์ต๋๋ค.