从零搭建博客留言系统,一个不依赖第三方评论方案的实现
博客搭好之后,一直没有配置评论系统。主要是本博客毕竟是一个自娱自乐的地方,没有干货内容,没有加入聚合平台,几乎没有流量,所以也没有必要配置评论系统。
但是如果不配置这种互动交流功能,确实又感觉少了点什么。哪怕真的没有人访问互动,有一个入口,也不至于需要的时候没有地方。
但是对于现在的评论系统,我都有点别扭。在每一个章节下面,增加一个评论区。访客通过评论区输入信息交流。有没有更简约、更私密的留言方式呢?
为什么不用现成的评论系统
市面上开源评论系统不少,但放在我的场景下,每个都有点别扭:
| 方案 | 问题 |
|---|---|
| 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 安装一堆依赖,放到静态目录就能直接用。对于静态站点来说,这种"拿来即用"的特性非常关键。

后端实现:Worker + D1
后端的核心职责就三件事:接收并存储留言、防止被刷、通知博主有新留言。
数据存储用的是 Cloudflare D1,本质上是一个托管在的 SQLite 数据库。表结构不复杂——一张主表存留言内容(昵称、邮箱、IP、正文、来源页面等),一张频率限制表防刷,一张操作日志表记录管理员的审核动作。
反垃圾策略
没有登录系统就意味着任何人都能提交,所以反垃圾必须做在前面。用了三层防护:
第一层是 Cloudflare Turnstile 人机验证。这是 Cloudflare 出的验证码替代品,体验比 reCAPTCHA 好很多——大部分情况下用户完全无感知,只有在行为可疑时才会弹出挑战。免费、隐私友好、集成也简单。
第二层是 多维度频率限制,从三个维度分别控制:
- IP 维度:同一 IP 地址 60 秒内最多提交 3 次
- 邮箱维度:同一邮箱地址 10 分钟内最多提交 5 次
- 全局维度:全站每分钟最多接受 20 条留言
三层限制互相独立,任意一层触发就直接拒绝。既能有效防刷,又不会误伤正常用户。
第三层是 内容审核标记。当 Turnstile 验证降级时(比如用户禁用了 JavaScript),系统会自动给这条留言打上"需重点审核"的标记,提醒管理员多看一眼。
通知机制
留言提交成功后,系统会异步发出两类通知:
邮件通知通过 Resend API 发送到博主邮箱,包含留言者昵称、内容摘要、来源页面等信息。邮件模板做了基础样式,手机上也能正常阅读。
PushPlus 推送则发到钉钉(或微信),适合即时知晓有人来访。PushPlus 支持多渠道分发,在后台配置一次就行。
同时可通过管理界面管理留言,针对留言进行精选、通过、垃圾标记、删除等操作。精选的留言将展示在博客的留言板页面。

成本盘点
| 项目 | 费用 |
|---|---|
| Cloudflare Workers | 免费(10万请求/天) |
| Cloudflare D1 | 免费(5GB 存储 / 2500万读 / 50万写 / 月) |
| Resend 邮件 | 免费(3000封/月) |
| PushPlus 推送 | 免费(200条/天) |
| Turnstile 验证 | 免费(无限次) |
| 合计 | 0 元/月 |
唯一需要注意的是 D1 的写入限额——每月 50 万次。按每条留言触发约 2 次写入计算,每月能支撑约 25 万条留言。对个人博客来说,这个数字远超实际需求。
总结
从出现想法,到使用 AI 辅助生成代码,再到迭代完善、最终上线,由于每日工作量有限,大概花了一周时间。当前已经具备了前期想到的所有基本功能,暂时能用。
它不是一个功能完备的评论系统——没有回复、没有嵌套、没有头像。但足够轻量、足够简单、足够满足"让访客能留几句话"这个初衷。现阶段够用了。有时候,够用就是最好的状态。
如果以后有想法,可能还会继续增加功能。