跳到主要内容

关于给ghost博客系统加点插件

· 阅读需 4 分钟

本来想给 Ghost 集成 Disqus 这个国外的公共留言系统,这样我的博客就可以拥有留言功能了,但是由于懒,我决定还是用别人做好的东西。

背景

Ghost 是一个很干净的博客系统,干净到连评论功能都没有内置。官方的态度也很明确:评论属于第三方服务的领域,博客系统只负责内容。这个设计我是认可的——评论系统涉及用户身份、反垃圾、数据存储,自己维护成本不低,交给专门的服务更省心。

所以问题就变成了:选哪家的评论服务,以及怎么把它接进 Ghost。

Ghost 接入第三方评论的原理

Ghost 虽然没有插件市场,但留了两个口子:

1)Code Injection(代码注入)。后台设置里可以直接往全站的 <head><body> 末尾插一段 HTML/JS,不用改主题文件。适合快速试验一个评论服务。

2)修改主题模板。把评论服务的嵌入代码写进主题的 post.hbs 文章模板里,只在文章页加载。这是更正式的做法,评论区的位置也更可控。

第三方评论服务的接入方式基本都一样:在页面里放一个占位的 div,再引入一段 JS,脚本会从服务商的服务器拉取评论数据并渲染到占位元素里。评论数据存在服务商那边,和博客本身完全解耦。

接入 Disqus

Disqus 是国外用得最多的评论服务,Ghost 官方文档里也是拿它当例子的。我看了下官方文档,配置非常简单:注册账号、创建站点拿到 shortname、把嵌入代码贴进文章模板,就完事了。

配置好之后,果然事情并不简单。

配置确实生效了——用能访问外网的网络打开博客,评论区正常显示。但换成国内的普通网络一看,评论区的位置是一片空白。原因很直接:Disqus 的嵌入脚本和接口域名在国内被墙了,脚本压根加载不出来,评论区自然渲染不了。

我就无语了。

对一个读者主要在国内的中文博客来说,这等于评论功能没做。更麻烦的是,加载失败的脚本还可能拖慢页面:浏览器会在那里等到超时才放弃。

代理方案的权衡

被墙的服务不是完全没救,社区里流行的思路是自建反向代理:用自己的服务器(或者 CDN、Serverless 函数)中转 Disqus 的接口请求,前端再配合改写一下嵌入脚本的请求地址。这样国内用户的请求先到你的代理,再由代理去访问 Disqus。

只好有空了去 GitHub 上找一下别人写好的代理代码。毕竟自己写也要花费点时间,找现成的还是不错滴。

不过冷静下来想想,这个方案有几个绕不开的问题:

  • 代理本身要部署、要维护,等于为了一个评论区多养一个服务;
  • 评论的登录授权流程也走 Disqus,代理要处理的接口不止一两个,容易漏;
  • Disqus 免费版本身还带广告。

为了评论功能背上这些负担,性价比不高。

换成 Valine

-2019-12-19 更新

我最后还是选择了一款国内可以直接用的评论系统 Valine,无广告,免费可用。

Valine 的思路和 Disqus 不太一样:它没有自己的后端服务,评论数据存在 LeanCloud 这类 BaaS 平台上,前端只需要引入一个 JS 文件、填上自己申请的应用 App ID 和 App Key 就能跑起来。没有强制登录,访客填个昵称就能留言,对个人博客来说足够轻量。

接入方式和前面说的一样,把初始化代码通过 Code Injection 或主题模板放进文章页即可。国内访问没有任何障碍,页面加载也不再被卡住。

提示

选评论系统之前,先用目标读者的网络环境实际打开一次页面。很多服务在开发者自己的网络下一切正常,换个环境就是另一回事。

小结

这次折腾下来的经验很简单:选第三方服务,可用性要放在功能前面。Disqus 功能再全,读者打不开就等于零;Valine 功能朴素,但对国内的中文博客反而是更务实的选择。Ghost 的 Code Injection 机制让这种更换成本很低,试错一轮也就半天的事。

评论 / COMMENTS