Skip to content

VitePress 集成 Disqus

概述

  VitePress 本身只提供了博客系统,没有提供评论相关的功能。如果想在博客系统中添加评论功能,增加与访客的互动性,可以选择集成 Disqus 评论系统。

  Disqus[链接]是一个第三方的评论留言系统,提供了 Facebook、Twitter、Google 等常用的统一登录留言功能,还提供了评分、树状留言等功能。本文档主要记录一下 VitePress 如何集成 Disqus 系统。

  在开始下面的步骤前,需要为你的博客提前注册一个 Disqus 帐号,获取到系统的唯一标识(Shortname)。

  本文档是在冰冻大西瓜的方案[链接]的基础上做了一些优化。

环境

  • VitePress:1.3.1

步骤

创建 Disqus 组件

  在 .vitepress/theme 目录下,创建 components 目录,并在该目录下创建 Disqus.vue 文件,文件内容如下:

vue
<script setup>
import { onMounted, onBeforeUnmount } from 'vue'

const ID = '_disqus_js'

onMounted(() => {
  const s = document.createElement('script')
  s.id = ID
  s.src = 'https://<shortname>.disqus.com/embed.js'
  s.setAttribute('data-timestamp', +new Date())
  document.body.appendChild(s)
})

onBeforeUnmount(() => {
  document.getElementById(ID)?.remove()
})
</script>

<template>
  <br/>
  <div id="disqus_thread" />
</template>

  上面的 Vue 组件是根据 Disqus 给的集成脚本翻译过来的,原脚本如下:

html
<div id="disqus_thread"></div>
<script>
    /**
    *  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
    *  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables    */
    /*
    var disqus_config = function () {
    this.page.url = PAGE_URL;  // Replace PAGE_URL with your page's canonical URL variable
    this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
    };
    */
    (function() { // DON'T EDIT BELOW THIS LINE
    var d = document, s = d.createElement('script');
    s.src = 'https://<shortname>.disqus.com/embed.js';
    s.setAttribute('data-timestamp', +new Date());
    (d.head || d.body).appendChild(s);
    })();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>

提示

  注意高亮部份,将 <shortname> 替换成注册 Disqus 系统时的唯一标识。

修改主题配置

  修改 .vitepress/theme/index.ts 文件,内容如下:

typescript
// https://vitepress.dev/guide/custom-theme
import {h} from 'vue'
import type {Theme} from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import Disqus from './components/Disqus.vue'
import './style.css'

export default {
    extends: DefaultTheme,
    Layout: () => {
        return h(DefaultTheme.Layout, null, {
            // https://vitepress.dev/guide/extending-default-theme#layout-slots
            // 在文档后面插入 Disqus 评论系统
            'doc-after': () => h(Disqus) 
        })
    },
    enhanceApp({app, router, siteData}) {
        // ...
    }
} satisfies Theme

提示

  VitePress 支持在文档的不同位置插入内容,具点插入点(Slot)参考 VitePress 的文档[链接]。

查看效果

  完成以上步骤后,重启博客系统就可以看到效果了。在 Disqus 后台系统还可以配置留言系统的样式及功能,具体功能可以详细探索 Disqus 的后台配置选项。


Released under the MIT license.