惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
A
About on SuperTechFans
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
G
Google Developers Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Latest news
Latest news
I
Intezer
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
月光博客
月光博客
T
Threatpost
博客园 - 【当耐特】
S
Schneier on Security
P
Privacy International News Feed
G
GRAHAM CLULEY
T
Tenable Blog
AWS News Blog
AWS News Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
博客园 - Franky
Engineering at Meta
Engineering at Meta
美团技术团队
S
Secure Thoughts
T
Troy Hunt's Blog
Microsoft Security Blog
Microsoft Security Blog
SecWiki News
SecWiki News
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 唯知为之

Antigravity Skills 全局安装与配置指南 前端设计资源汇总 VitePress 添加友链界面 如何快速无缝的从 vscode 转向AI编辑器 cursor、kiro、trae 等 Vitepress 建站资源汇总 Vue3.5常用特性整理 巧用mask属性创建一个纯CSS图标库 给网站设置三级域名 vue3项目部署到Github JS脚本批量处理TS数据类型 常用TS总结 定制你的清爽Mac版Edge浏览器 uni-app+vue3会遇到哪些问题 你想要的龙年特效来了 uni-app+vue3+ts项目搭建完整流程 vue3+ts打开echarts的正确方式 Vite4+Typescript+Vue3+Pinia 从零搭建(7) - request封装 Github项目徽标 Vite4+Typescript+Vue3+Pinia 从零搭建(6) - 状态管理pina
VitePress 集成 Twikoo 评论
唯知为之 · 2025-05-15 · via 博客园 - 唯知为之

Twikoo 是一个简洁、安全、免费的静态网站评论系统。

主要特点:免费搭建,部署简单,功能很完善,隐私护安全,通知发邮件,管理有内嵌,总之免费又方便

关于后端部署,大家可以看官网,或者这篇 VitePress 资源汇总 - 使用 Twikoo 评论系统
推荐使用 Vercel 部署 (免费,需配置域名加速访问) 或者 Netlify 部署(免费)。

这篇主要讲 Vitepress 前端如何集成。

预览

image

集成步骤

1. 安装 twikoo

pnpm install twikoo

2. 初始化 twikoo 组件

<template>
  <div id="twikoo"></div>
</template>

<script setup lang="ts">
import { onMounted, watch } from 'vue'
import { useRoute } from 'vitepress'

const route = useRoute()

const initTwikoo = async () => {
  // 判断是否在浏览器环境中
  if (typeof window !== 'undefined') {
    const twikoo = await import('twikoo')
    twikoo.init({
      envId: 'https://twikoo.xxx.com/', // 换成你自己配置的域名
      el: '#twikoo'
    })
  }
}

// 监听路由刷新评论
watch(route, () => {
  initTwikoo()
})

onMounted(() => {
  initTwikoo()
})
</script>

3. 组件插入 Layout 插槽

<script setup lang="ts">
import DefaultTheme from 'vitepress/theme'
import Twikoo from './Twikoo' //评论组件
</script>

<template>
  <DefaultTheme.Layout>
    <template #doc-after>
      <Twikoo />
    </template>
  </DefaultTheme.Layout>
</template>

美化样式

1. 配置 twikoo

twikoo 配置面板里的插件页签,选择代码高亮主题 coy,代码复制插件 copyButton

image

2. 自定义 css

以下代码中使用的部分变量,可利用开发者工具在本站查找或自己配置。

.twikoo {
  .el-input-group__append,
  .el-input-group__prepend,
  .el-textarea__inner {
    border: 1px solid #DCDFE6;
    box-shadow: none;
  }
  .el-input-group__prepend {
    border-right: none;
  }
  .el-button--small {
    height: auto;
  }
  .el-textarea > .el-textarea__inner {
    min-height: 117px !important;
    border-radius: var(--weiz-border-radius);
    margin-top: var(--weiz-spacing-2xl);
  }
  .tk-preview-container {
    border-radius: var(--weiz-border-radius);
  }
  .tk-comments-count {
    font-size: var(--weiz-font-size-sm);
    color: var(--vp-c-text-2);
  }
  .tk-nick,
  .tk-replies .tk-nick-link {
    font-size: var(--weiz-font-size-st);
    margin-right: var(--weiz-spacing);
    color: var(--weiz-primary-color);
  }
  .tk-tag {
    margin-right: var(--weiz-spacing);
  }
  .tk-comments-container > .tk-comment {
    border: solid 1px #F3F4F6;
    border-radius: var(--weiz-card-border-radius);
    padding: var(--weiz-spacing-6xl);
    margin-top: 0;
    margin-bottom: var(--weiz-spacing-6xl);
    transition: var(--weiz-transition-3);
    &:hover {
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
    }
  }
  .tk-replies-expand > .tk-comment {
    border-top: solid 1px #f7f7f7;
    padding-top: var(--weiz-spacing-4xl);
  }
  .tk-content p {
    line-height: 1.6;
  }
  a {
    color: var(--weiz-primary-color);
    &:hover {
      color: var(--weiz-primary-color-light-1);
    }
  }
  // 代码块
  div.code-toolbar {
    border-radius: var(--weiz-border-radius);
    box-shadow: var(--vp-code-block-shadow);
    :not(pre)>code[class*=language-], pre[class*=language-] {
      background: var(--vp-code-block-bg);
      border-radius: var(--weiz-border-radius);
    }
    pre[class*=language-] {
      &::before, &::after {
        content: none;
      }
      &>code {
        padding: 0.5em;
        border-left: 4px solid var(--weiz-primary-color);
        border-radius: var(--weiz-border-radius);
        box-shadow: var(--vp-code-block-shadow);
      }
    }
    &>div.toolbar {
      z-index: 1;
      top: 8px;
      right: 8px;
      &>.toolbar-item>button {
        display: none;
        padding: 0 6px;
        font-size: 12px;
        color: black;
      }
    }
    &:hover>div.toolbar>.toolbar-item>button {
      display: block;
    }
  }
}
.dark .twikoo {
  .tk-comments-container > .tk-comment {
    border-color: #454545;
    &:hover {
      box-shadow: 0 4px 12px rgba(255, 255, 255, 0.15);
    }
  }
  .tk-replies-expand > .tk-comment {
    border-color: #343434;
  }
  // 代码块
  div.code-toolbar {
    pre[class*=language-] {
      &>code {
        filter: brightness(0.8);
      }
    }
  }
}

3. css 注入主题配置

// 全局样式
import './style/index.scss'

参考文档

Twikoo 官方文档

VitePress 集成 twikoo 参考解决方案