§ 背景
博客此前使用 Valine(LeanCloud 后端 + MiniValine UI)作为评论系统。LeanCloud 预计 2027 年 1 月停止服务,为获得更可控的评论数据、支持邮件通知,以及更现代化的评论体验,决定迁移到自部署的 Twikoo[1][2][3](部署在 CloudFlare,反代到 white-album.top/twikoo/backend)。
§ 迁移架构
博客用户 → 前端 Twikoo 客户端 (twikoo.nocss.js @ 1.7.7) → 后端 API (https://white-album.top/twikoo/backend) → Serverless (CloudFlare Workers) + 数据库 (Cloudflare D1) + 云存储 (Cloudflare R2)
§ 修改的文件与目录
§ 一、博客仓库(llxlr/blog)
| # | 文件/目录 | 改动内容 |
|---|---|---|
| 1 | source/twikoo/ | Twikoo 独立测试页面,用于调试评论组件,不参与全局评论渲染 |
| 2 | source/twikoo/index.md | 引入 Twikoo CDN,初始化 twikoo.init(),envId 指向 white-album.top/twikoo/backend |
| 3 | scripts/tags/test.js | 早期测试:通过 hexo.extend.injector.register('head_end', ...) 注入 Twikoo CDN,现已弃用(主题已内置 vendor 加载) |
| 4 | scripts/injectors/global.js | 全局注入器,未做修改——Twikoo 的脚本加载完全由主题的 vendorJs('twikoo', ...) 处理 |
| 5 | _config.shoka.yml | 添加 twikoo 配置段,设置 enable: true / mode: vercel / envId;同时更新了 Valine 的 AppId/Key |
§ 二、主题仓库(llxlr/hexo-theme-shoka,子模块)
主题层面经历了 5 次迭代,最终改动了以下文件目录:
tree . | ||
themes/shoka/ | ||
├── _config.yml ─ 主题默认配置 + vendor CDN | ||
├── layout/ | ||
│ ├── _macro/ | ||
│ │ ├── comment.njk ─ 评论区域模板 | ||
│ │ └── widgets.njk ─ 侧边栏"最近评论" | ||
│ └── _partials/ | ||
│ ├── layout.njk ─ 全局 LOCAL 对象注入 | ||
│ ├── post/footer.njk ─ 文章底部访问量统计 | ||
│ └── third-party/twikoo.njk ─ [已删除] 早期内联脚本 | ||
├── scripts/generaters/script.js ─ 全局 CONFIG 对象生成 | ||
└── source/ | ||
├── js/_app/ | ||
│ ├── pjax.js ─ Pjax 刷新 + Twikoo 核心初始化 | ||
│ └── page.js ─ 评论区懒加载 | ||
└── css/ | ||
├── comment.styl ─ 评论 CSS 入口 | ||
└── _common/components/third-party/ | ||
└── twikoo.styl ─ Twikoo 完整样式表 (2063行) |
§ 主题迭代时间线
§ 第一阶段:添加 Twikoo 支持(2025-08-31)
commit 4b80e2b — 8 文件改动,+117/-20
_config.yml:新增twikoo配置段(enable: false/mode: vercel/envId: ""),vendors.js中加入twikoo: npm/twikoo@1.6.44/dist/twikoo.min.jscomment.njk:根据theme.twikoo.enable条件渲染——启用时输出<div id="tcomments">并内联twikoo.init();否则沿用 Valine 的<div id="comments">widgets.njk:添加id="twikoo_comment"的<ul>容器用于展示最近评论layout.njk:向LOCAL全局对象注入twikoo: page.twikoo页面级覆盖;引入twikoo.njkpartialfooter.njk:文章底部新增#twikoo_visitors用于显示访问量twikoo.njk[新建]:内联twikoo.getRecentComments()渲染侧边栏最近评论script.js:条件生成CONFIG.twikoo全局对象,同时将 valine 也改为条件注入pjax.js:siteRefresh()中加入 Twikoo 初始化逻辑,调用window.initTwikoo(options)(注意:早期 Twikoo 是initTwikoo全局函数)
§ 第二阶段:重构评论模板(2025-10-18)
commit f83055c — 1 文件改动
comment.njk:将内联 HTML 提示语封装为可复用宏commentHead(),Valine 和 Twikoo 共用
§ 第三阶段:修正 API 调用(2025-11-02)
commit d2eb7e2 — 3 文件改动,+4/-12
comment.njk:删除了内联的twikoo.init()脚本,统一由pjax.js接管script.js:将twikoovendor JS 路径加入CONFIG.jspjax.js:API 从window.initTwikoo()改为window.twikoo.init()(Twikoo 1.6.44+ 的模块化 API)
§ 第四阶段:重构评论加载流程(2026-04-19)
commit 7547757 — 9 文件改动,+63/-54
_config.yml:vendor 升级到twikoo@1.7.7layout.njk:删除twikoo.njkpartial 引入(最近评论逻辑已迁移至 pjax.js)footer.njk:修正 Valine visitor 的enable条件判断- 删除
twikoo.njk:最近评论渲染逻辑移入pjax.js的siteRefresh() script.js:将twikooCSS 路径加入CONFIG.css- 新建
twikoo.styl(15 行):基础容器与图片样式 comment.styl:添加@import "_common/components/third-party/twikoo"page.js:loadComments()兼容#tcomments容器;vendorCss支持twikoo;transition动画支持#tcommentspjax.js:重写 Twikoo 初始化——合并CONFIG.twikoo与LOCAL.twikoo,调用twikoo.getRecentComments()生成侧边栏最近评论 HTML,调用twikoo.init(options)渲染评论框。Pjax selector 加入.twikoo
§ 第五阶段:完善样式与 vendor 优化(2026-05-01)
commit bee0115 — 4 文件改动,+2071/-27
_config.yml:vendor 从twikoo.min.js(含 CSS)改为twikoo.nocss.js(不含 CSS,由主题自定义样式控制)twikoo.styl:从 15 行的基础样式扩展到 2063 行,包含:- Element UI 组件样式(Button、Input、Textarea、Loading)
- OwO 表情选择器样式
- Twikoo 全部组件样式(头像、输入区、评论列表、回复、管理面板、暗黑模式覆盖等)
comment.styl:改为条件编译——仅在twikoo.enable为true时引入 twikoo 样式pjax.js:postFancybox图片灯箱从.v(Valine)改为.twikoo
§ 关键设计决策
nocss 方案:最终选择
twikoo.nocss.js而非twikoo.all.min.js,将样式控制权完全交给主题,便于定制和暗黑模式适配(通过twikoo.styl覆盖默认样式)Pjax 兼容:博客使用 Pjax 局部刷新,评论组件需在每次 Pjax 导航后重新初始化。
pjax.js的siteRefresh()中检查 DOM 元素存在后重新调用twikoo.init(),Pjax selector 中注册.twikoo以保留评论 DOM双系统共存:Valine(
enable: false)和 Twikoo(enable: true)的代码同时保留,仅通过配置开关切换,Valine 的配置保留以备未来回退最近评论:从独立的 Nunjucks 模板内联脚本 → 迁移到
pjax.js中统一处理,使用twikoo.getRecentComments()API 异步获取数据并插入 DOM
§ 相关提交
| 仓库 | Commit | 日期 | 说明 |
|---|---|---|---|
| 博客 | 301fcd6 | 2025-08-19 | ✨ 测试twikoo |
| 博客 | f30c322 | 2025-08-20 | ✅ 测试调整twikoo资源引用位置 |
| 主题 | 4b80e2b | 2025-08-31 | ✨ 添加twikoo支持 |
| 主题 | f83055c | 2025-10-18 | 🎨 调整评论模板 |
| 博客 | 5d76198 | 2025-09-20 | 🔧 更新友链和评论配置 |
| 主题 | d2eb7e2 | 2025-11-02 | 🐛 修改 twikoo 配置 |
| 主题 | 7547757 | 2026-04-19 | 🐛 修复 twikoo 评论系统 |
| 主题 | bee0115 | 2026-05-01 | 🧱 调整 twikoo 配置 |