修复 Giscus 与 Pjax 不兼容的问题

历史

在18年那次博客大改中,因为 Disqus 无法使用,我把评论系统切换成了基于 GitHub Issue 的 utterances。 但是,它最大的问题在于和 Pjax 无法兼容。在开启 Pjax 之后,当我们点进下一个网页的时候,显示的依然是上一个页面对应的评论。因此,当我发现 DisqusJS 支持自建之后,就切换成了 DisqusJS,一直沿用至今。

但是,由于 Disqus 不支持 Markdown 和 MathJax,所以我其实一直希望能够切换回来。NexT 曾宣称解决了 Pjax 的兼容性问题,但是我当时实际测试之后发现还是不行。

而且令人奇怪的是,utterances 和其它评论系统引入的方式是完全一样的,但就是它和 gitalk 不能支持 Pjax ,其它的都没有问题。乃至于后来许多文章在对比 NexT 的几个评论系统的时候,就直接将 utterances 说成无法支持 Pjax。

在 Github Discussion 出现之后,又诞生了基于 discussion 的 giscus。结果我试了之后,还是同样的问题,切换页面后评论不变。这个问题 从21年一直拖到23年,NexT 的插件终于宣称支持了 Pjax。但是我实测之后发现,表现和原来是一摸一样的。😢

曙光

直到最近,我无意中搜到了这篇文章,里面提到了通过搜索关键字 new Pjax({ 找到出问题的地方。于是我也试着在 NexT 主题中尝试寻找,终于发现了问题所在。

source/js/pjax.js 中,定义了 Pjax 需要刷新的内容,其中就包括了加载评论的部分。这个时候我突然意识到,giscus 确实在新的页面刷新了,但是我设置的是通过 og:title 来对应文章和评论,而在新的页面中, og:title 并没有更新!​​

这也就解释了为什么插件宣称支持 Pjax 而我实测不行了。因为插件默认通过文章的链接路径来对应文章和评论,因此在进入新的页面之后,链接自动刷新,评论就能够正常加载了。另外如果通过 title 来对应也没有问题,因为 <title> 会被Pjax刷新。而唯独我是用的 og:title 这个方法不行。😠

终章

找到了问题所在,解决方法也就很简单了,只需要在 pjax.js加一行,把 og:title 也刷新就可以了~😅