博客搭好之后,一直没有配置评论系统。主要是本博客毕竟是一个自娱自乐的地方,没有干货内容,没有加入聚合平台,几乎没有流量,所以也没有必要配置评论系统。

但是如果不配置这种互动交流功能,确实又感觉少了点什么。哪怕真的没有人访问互动,有一个入口,也不至于需要的时候没有地方。

但是对于现在的评论系统,我都有点别扭。在每一个章节下面,增加一个评论区。访客通过评论区输入信息交流。有没有更简约、更私密的留言方式呢?

为什么不用现成的评论系统

市面上开源评论系统不少,但放在我的场景下,每个都有点别扭:

方案问题
Disqus国内访问困难,加载慢,隐私顾虑
Waline在之前的 Vuepress 博客架构中使用了该系统,部署在了 Vercel 上,没有问题,至今还在跑,只是没有使用
Artalk需要后端服务,且前端体积偏大
Giscus基于 GitHub Discussions,要求访客有 GitHub 账号,门槛高
Twikoo依赖腾讯云开发环境或 Docker,运维成本不可忽视

我目前的博客是基于 Hugo,部署在 Cloudflare Pages 上。这意味着我没有传统意义上的"后端服务器",只有一个域名和 CDN。所以核心约束很明确:后端是无服务器的,成本要趋近于零,维护成本也要趋近于零。

架构选型

基于上述条件,经过和 AI 讨论、脑力风暴,最终方案的整体思路是这样的:

访客在博客页面点击留言按钮 → 弹出输入弹窗→ 填写内容 → 数据发送到 Cloudflare Workers 后端 → 校验通过后写入 D1 数据库 → 同时异步发出邮件通知和推送消息。

选择 Cloudflare Workers + D1 作为后端主要有以下优势:

  • Workers 免费额度:每天 10 万次请求,对个人博客绰绰有余
  • D1 是 SQLite 兼容的:使用 SQL 语法,迁移成本低
  • 零运维:不用管服务器、不用管扩容、不用担心宕机

后端框架选了 Hono——一个轻量的 TypeScript Web 框架,对 Cloudflare Workers 的适配做得很好。整个 Worker 编译后的产物很小,冷启动快。

前端实现:双模式输入

留言功能的核心交互是一个弹窗。本来想借鉴一些优秀的设计,但是找了半天也没有找到满意的,只能自己构思了一个简单按钮弹窗,弹窗实现了两种输入模式:

短消息模式(140字以内)

适合快速留下一句话。类似于微博、朋友圈这类短输入场景。想打个卡、简短的留个言,用这个就够了。

长文模式(140字以上)

适合写点长一些的内容。详细的反馈、问题沟通,或者想分享点什么。

两种模式都支持 Markdown 语法。编辑器选的是 OverType——一个单文件的 WYSIWYG Markdown 编辑器,而不是更知名的 VDitor 或 Editor.js。原因很直接:它只需要一个 JS 文件,不需要 npm 安装一堆依赖,放到静态目录就能直接用。对于静态站点来说,这种"拿来即用"的特性非常关键。

20260624131827-tanchuang-0e1b93ad-rcvQO

后端实现:Worker + D1

后端的核心职责就三件事:接收并存储留言、防止被刷、通知博主有新留言。

数据存储用的是 Cloudflare D1,本质上是一个托管在的 SQLite 数据库。表结构不复杂——一张主表存留言内容(昵称、邮箱、IP、正文、来源页面等),一张频率限制表防刷,一张操作日志表记录管理员的审核动作。

反垃圾策略

没有登录系统就意味着任何人都能提交,所以反垃圾必须做在前面。用了三层防护:

第一层是 Cloudflare Turnstile 人机验证。这是 Cloudflare 出的验证码替代品,体验比 reCAPTCHA 好很多——大部分情况下用户完全无感知,只有在行为可疑时才会弹出挑战。免费、隐私友好、集成也简单。

第二层是 多维度频率限制,从三个维度分别控制:

  • IP 维度:同一 IP 地址 60 秒内最多提交 3 次
  • 邮箱维度:同一邮箱地址 10 分钟内最多提交 5 次
  • 全局维度:全站每分钟最多接受 20 条留言

三层限制互相独立,任意一层触发就直接拒绝。既能有效防刷,又不会误伤正常用户。

第三层是 内容审核标记。当 Turnstile 验证降级时(比如用户禁用了 JavaScript),系统会自动给这条留言打上"需重点审核"的标记,提醒管理员多看一眼。

通知机制

留言提交成功后,系统会异步发出两类通知:

邮件通知通过 Resend API 发送到博主邮箱,包含留言者昵称、内容摘要、来源页面等信息。邮件模板做了基础样式,手机上也能正常阅读。

PushPlus 推送则发到钉钉(或微信),适合即时知晓有人来访。PushPlus 支持多渠道分发,在后台配置一次就行。

同时可通过管理界面管理留言,针对留言进行精选、通过、垃圾标记、删除等操作。精选的留言将展示在博客的留言板页面。

20260624131827-liuyanban-4677dc8d-cjIxL

成本盘点

项目费用
Cloudflare Workers免费(10万请求/天)
Cloudflare D1免费(5GB 存储 / 2500万读 / 50万写 / 月)
Resend 邮件免费(3000封/月)
PushPlus 推送免费(200条/天)
Turnstile 验证免费(无限次)
合计0 元/月

唯一需要注意的是 D1 的写入限额——每月 50 万次。按每条留言触发约 2 次写入计算,每月能支撑约 25 万条留言。对个人博客来说,这个数字远超实际需求。

总结

从出现想法,到使用 AI 辅助生成代码,再到迭代完善、最终上线,由于每日工作量有限,大概花了一周时间。当前已经具备了前期想到的所有基本功能,暂时能用。

它不是一个功能完备的评论系统——没有回复、没有嵌套、没有头像。但足够轻量、足够简单、足够满足"让访客能留几句话"这个初衷。现阶段够用了。有时候,够用就是最好的状态。

如果以后有想法,可能还会继续增加功能。

参考资料