评论区搬家:从 Giscus 换成 Waline
目录
博客之前用的评论系统是 giscus,零成本零维护,缺点是评论必须要有 GitHub 账号才能留言,然后默认 UI 有点丑。想着换一个门槛更低、体验更完整的方案,但预算依然是:免费。
为什么最后选了 Waline
本来就只想在 Cloudflare 生态做的,没想到被 Gemini 虚晃了一枪,说 Artalk 可以配合CF worker + D1,结果开始接入才知道是坑,Artalk 并不支持这种方案,于是作罢。
调研了一圈,最后看中 Waline——功能齐全(Markdown、点赞、匿名评论、后台管理),UI 也不错,但官方只支持 Vercel、Netlify、Railway 这些平台,没有 Cloudflare。去官方仓库翻了下 discussion,作者原话是"Cloudflare Workers 的架构不太适合直接跑 Node",基本表态短期内不会官方支持。
好在社区已经有人把它整个重写了一遍:Waline_On_Worker,用 Cloudflare Workers + D1(Serverless SQLite)复刻了一套兼容 @waline/client 前端和 @waline/admin 管理面板的后端。作者自己也坦白这是"AI 辅助完成,无法保证和官方 Waline Server 行为完全一致",算是提前打了预防针。抱着"反正免费,试试也无妨"的心态开搞。
部署过程
整个流程走下来其实不复杂:
wrangler d1 create建一个 D1 数据库pnpm run db:init --remote把 schema 灌进去(一开始漏了--remote,结果灌进了本地模拟数据库,白忙一场)wrangler secret put JWT_SECRET设登录用的密钥pnpm run deploy部署 Worker,拿到一个*.workers.dev的地址- 博客这边加一个
waline.htmlpartial,换掉原来的giscus.html
理论上到这一步就该结束了,但真正好玩的部分才刚开始。
踩坑两连
坑一:CORS 不通过。 部署完用 curl 测试接口,发现无论用什么 Origin 请求,响应里都没有 Access-Control-Allow-Origin——包括我自己的域名。翻源码发现 CORS 白名单比较的是裸域名(xanderhang.com),但浏览器发过来的 Origin 头其实带协议(https://xanderhang.com),俩字符串永远对不上,等于白名单形同虚设。改成先用 URL() 解析出 hostname 再比较,问题解决。
坑二:评论组件加载不出来,控制台报 Uncaught SyntaxError: Unexpected token 'export'。 查了下才发现 @waline/client 新版本的 dist/waline.js 已经是 ESM 格式,用 <script src="..."> 直接引入必然报错——得用专门给普通 script 标签用的 dist/waline.umd.js。官方文档里的示例代码显然没跟上包本身的更新。
两个问题都属于"用久了大概率会有人踩到"的坑,索性把 CORS 的修复提了个 PR 回去,也算是薅了免费羊毛之余,顺手还了个人情,同时也感谢 Claude Code。
现在的配置
- 留言必须填邮箱,网站可选填
- 所有新评论先进"待审核"队列,我手动过一遍才会公开显示,避免垃圾评论直接刷屏
- 后台管理面板完全复用官方UI,体验上和真正的 Waline 没什么差别
回顾
AI 真香~ 评论区正式开张,欢迎在下面留言测试~