本文主要记录在 Astro Fuwari 主题中集成 Twikoo 评论系统时遇到的一系列问题及其解决方案。关于 Twikoo 后端的云函数部署和 MongoDB 数据库配置,可直接参照官方文档,本文不再赘述。
问题一:深色模式下的显示问题
在参照《Astro 添加 Twikoo 评论 | 老麦笔记》一文的指引添加基础代码后,发现在深色模式下,评论区的文字颜色与背景色融为一体,导致内容无法阅读。

解决方案
通过查阅 fuwai_zyplj 项目的实现,发现需要在 Twikoo 的挂载点 div 外部再包裹一个 div,并应用主题的基础卡片样式 card-base。这样能确保评论区正确继承主题的样式,从而解决深色模式的适配问题。
<div class="card-base px-6 py-6 relative w-full text-90"> <div id="tcomment"></div></div>
问题二:评论区在页面加载和刷新时消失
另一个问题是,在首次进入文章页或刷新页面时,评论区偶尔会无法显示。
解决方案
这个问题与 Astro 的页面生命周期事件有关。在 Comment.astro 组件的脚本中,如果存在 document.addEventListener('astro:page-load', () => { ... }) 这样的事件监听器,可能会导致 Twikoo 在客户端路由切换时被重复或错误地初始化。
移除 astro:page-load 事件监听器,直接执行加载函数,可以解决此问题。
问题三:点击评论区按钮导致页面跳转到顶部
在解决了显示问题后,又遇到了一个新的交互问题:点击评论区的“点赞”或“回复”等按钮时,页面会强制滚动到顶部。
在查阅资料后,于《解决 Twikoo 在 Fuwari 主题下的页面乱滚问题 | RiseForever》一文中找到了根本原因:
这个问题出现的原因,是官方的 Twikoo JavaScript 文件中使用了带
href="#"的<a>标签。SSR(Astro)在前端脚本未完成水合(hydration)前,点击这种链接会触发默认导航行为,导致页面跳到顶部。
解决方案
最彻底的解决方案是修改 Twikoo 的源码,将导致问题的 href="#" 替换掉,然后重新构建出自己的 twikoo.min.js 文件。
具体流程如下:
-
Fork 源码: 访问 Twikoo 的 GitHub 仓库 并 Fork 一份到自己的账户下。
-
修改代码: 克隆你 Fork 的仓库到本地。在源码中全局搜索
href="#",主要修改以下两个文件:/src/client/view/components/TkAction.vue/src/client/view/components/TkComment.vue
将所有
href="#"替换为href="javascript:void(0)"。这样做可以在保留链接原有样式和功能的同时,禁用其默认的页面跳转行为。 -
构建项目: 在项目根目录运行以下命令来安装依赖并构建:
Terminal window yarn installyarn build构建完成后,在项目的
./dist/文件夹下即可找到新鲜出炉的twikoo.min.js文件。 -
替换文件: 在你的 Fuwari 项目中,创建
public/js/文件夹,并将刚刚构建好的twikoo.min.js文件放入其中。 -
更新引用: 修改
src/components/Comment.astro组件,将脚本的src地址从 CDN 改为本地路径。
最终代码
经过以上一系列的调整,最终得到稳定可用的组件代码。
文件路径:src/components/Comment.astro
<div class="card-base px-6 py-6 relative w-full text-90"> <div id="tcomment"></div></div>
<script> function loadTwikoo() { const commentsContainer = document.getElementById('tcomment'); if (commentsContainer) { const script = document.createElement('script'); // 更新为本地脚本路径 script.src = '/js/twikoo.min.js'; script.async = true; script.onload = () => { const initScript = document.createElement('script'); initScript.innerHTML = ` twikoo.init({ envId: 'https://YOUR_TWIKOO_ENV_ID', el: '#tcomment', }); `; document.body.appendChild(initScript); }; document.body.appendChild(script); } } loadTwikoo();</script>在文章页中引入:src/pages/posts/[...slug].astro
引入 Comment 组件并在合适的位置进行渲染,通常放在正文内容或版权声明之后
---// 引入 Comment 组件import Comment from "@components/Comment.astro";
---<!-- ... 其他页面布局和内容 ... -->
<div id="post-container" class="card-base z-10 px-6 md:px-9 pt-6 pb-4 relative w-full ">
<!-- 正文内容 --> <Markdown class="mb-6 markdown-content onload-animation"> <Content /> </Markdown>
<!-- 版权声明 --> {licenseConfig.enable && <License title={entry.data.title} slug={entry.slug} pubDate={entry.data.published} class="mb-6 rounded-xl license-container onload-animation"></License>}
<!-- 评论组件 --> <Comment />
</div>
<!-- ... 页面底部的导航链接等内容 ... -->至此,Twikoo 评论系统已完美集成到 Fuwari 主题中,所有已知问题均得到解决。