静态博客实现高性能评论插件的几点实践
2023-12-09 12:47:10
从第三方评论到原生评论的转变
第三方评论系统的优势在于即用即得,而且不需要我们去关心评论的任何技术细节。但随之而来的问题也显而易见。
- 接口延迟:调取第三方接口获取评论,相比于静态博客中的直出评论体验,这种做法实际上会带来一些延迟。
- 隐私泄露:接入第三方评论,评论接口就掌握了我们网站访问者的访问记录,这就是隐私泄露。
- 功能受限:第三方评论系统受限于服务方的功能,这使得我们很难满足特殊的定制化需求。
所以我们想自己写一套静态博客的评论插件。当然,相比于第三方评论系统的即用即得,我们势必会面对大量的工程问题。
从评论方案到工程落地
我们先来看一下我们是如何实现评论功能的。
评论方案选型
首先我们需要选定一个评论方案,我这里提供一个参考方案。方案主要围绕数据库的选型与数据模型展开。
评论数据的存储需要满足高性能与弹性扩展两个需求。主流的方案主要有关系型数据库方案与NoSQL方案。
关系型数据库方案这里主要指的是传统的MySQL。关系型数据库方案的特点是数据存储有严格的约束关系,数据具有强一致性,数据操作的成本相对较高。
NoSQL方案主要指的是Redis与MongoDB。NoSQL数据库的特点是数据结构灵活性强,可以自定义数据模型,其高性能的特性也满足我们对性能的苛刻需求。
在综合考虑了数据存储的特点,以及实际的工程落地情况之后,我们选择了Redis方案。
数据结构的设计
接着我们需要设计数据结构,评论涉及到的数据主要包括:评论本身的数据、评论的作者信息、评论回复的信息等。为了避免我们常用的E-R模型在Redis里难以实现的情况,所以这里采用了键值对模型。
评论本身的数据与作者的信息,我们直接存储成一个JSON字符串。这里的一个考量是基于Redis是内存数据库,我们的数据都需要在内存中才能发挥其优势。
回复的信息我们则采用双向链表的形式存储。一个回复的评论是它对应的链表的父节点,而回复它的评论是它的子节点。
双向链表的实现原理是:每个节点存储着指向它的父节点与子节点的指针。我们采用一个特殊的值,比如-1,作为根节点的值。这样,我们便可以很方便的遍历整条链表。
如何将评论插件应用到静态博客
静态博客一般会使用SSG框架,我们以Hexo为例来说明我们如何将评论插件应用到静态博客。
- 将评论插件的代码复制到Hexo的plugins文件夹。
- 在Hexo的配置文件中,启用评论插件。
- 将评论插件的CSS文件复制到Hexo的主题文件夹。
- 在Hexo的主题文件中,引入评论插件的CSS文件。
- 然后我们就可以在Hexo的文章中使用评论插件了。
我们只需在文章的markdown中添加hexo_comment
即可开启评论功能。
hexo_comment
是一个容器标签,我们可以在其中放置评论区想要添加的内容,比如评论表单、评论列表等。
当我们访问文章页面时,Hexo会自动加载评论插件,并将评论区的内容渲染到页面中。
评论插件的潜在优势
性能优势
由于评论插件是直接集成到静态博客中的,所以评论的渲染速度会非常快。
隐私优势
由于评论插件是自建的,所以评论数据不会被第三方服务方收集。
功能优势
由于评论插件是自己开发的,所以我们可以根据自己的需求定制评论插件的功能。
结语
以上就是我分享的关于静态博客实现高性能评论插件的一些经验。希望对大家有所帮助。