博客中开放了评论系统,目前评论系统使用的是 twikoo, 使用的是 vercel 方案,用的 mongodb.com 提供的免费储存。效果还不错,目前不会对所有的文章和页面开放评论。
嵌入 quartz 的过程中碰到了一些小问题:
由于 quartz 在 spa 模式下对于 空 hash 的情况没有考虑,所以嵌入以后如果点击评论将无法正常工作(会刷新页面)这里可以单独判断并跳过这个逻辑:
quartz/components/scripts/spa.inline.tsL128
if(isSamePage(url) && window.location.href.endsWith('#')) {
// 说明是没有正确设置 hash 的 a 标签,跳过即可
return;
}
对于嵌入评论的方法,可以参考下面这个代码实现:
function loadScript(url: string) {
return new Promise<void>((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.async = true;
script.onload = () => {
resolve();
};
script.onerror = () => {
reject(new Error(`Failed to load script: ${url}`));
};
document.head.appendChild(script);
});
}
async function init() {
await Promise.all([
loadScript('https://cdnjs.cloudflare.com/ajax/libs/twikoo/1.6.36/twikoo.min.js'),
loadScript("https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js")
.then(() => loadScript("https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/contrib/auto-render.min.js")),
]);
document.getElementById("tcomment")?.addEventListener('click', (event) => {
event.stopPropagation();
event.preventDefault();
return false
});
(window as any).twikoo?.init({
envId: 'https://comment.iceprosurface.com',
el: '#tcomment',
path: (window as any).__comment_id__
});
}
init();
document.addEventListener('nav', (event) => {
init();
});
将会在页面加载完成后重新加载,由于 script 不会重复加载的特性,所以即使重新 append 也是能吃到的缓存的,无脑设置即可。