博客系统重写、迁移之路

前言

我的博客小站从 2019 年建站,到现在已经三年了。之前博客一直都是使用 WordPress 搭建的,WordPress 开箱即用以及各种丰富的插件和扩展也给我带来了很多的便利。在三年之间虽然没有产出过多少文章,但是网站好歹是一直在维护着的。在这期间也有换博客的想法,有看过 php 实现的其他博客系统比如说 typecho,也有看过静态的博客系统比如说 hexo 等等。

但是作为一个开发者,我还是感觉自己去实现一个博客系统来做自己的博客会更合适一些,我比较喜欢代码的逻辑都能够在心里掌握的这种感觉。毕竟自己写的逻辑,对内部实现肯定也更清楚。

其实在之前,我也有过想自己去实现博客系统的想法,那会我还在上大学,趁着学习 django 的时间,也实现了一套简单的博客后端系统。那会对前端了解得不是很多(苦手),就也没有做相应的前端,最后这套代码也就没有再维护了,权当是给自己练手了。

是什么时候开始有重写一套博客系统的想法呢?大概是后来学习了react和vue,学习了现代化的前端是怎么构建的之后,就开始萌生出了这样的想法。同时因为工作原因,开始学习和在工作中使用golang,重新写一套博客系统,学习新的语言的同时给自己带来一些成就感想法就愈演愈烈了。于是在今年4月份的时候开始 新建文件夹 了,开始了自己博客系统的编写之旅。

技术选型

后端

web 框架选择

后端这里理所当然的选择了使用 golang 语言来做开发语言,理由在前面也提及到:通过实践来巩固下自己的 golang 技术。

不过在选择框架的时候还是有一些纠结的。当然自己也有”要不自己去开发一个简单的框架来写吧,就基于标准库中的http“这样的想法,不过想了下自己对语言本身的熟悉程度不够,估计开发出来的框架也是 一坨 **,于是便开始在 github 上浏览各式各样的框架。通过一段时间的了解之后,发现 gin 框架是比较流行的 golang web 框架,于是想选择这个来做自己博客的开发框架,但是在学习 gin 的过程中,又发现 fasthttp 号称 "fasthttp server is up to 10 times faster than net/http",而 gin 是基于 net/http 的。看到 fasthttp 这样的宣传语之后,心中不免会去想,要不用更快一些的框架好了,于是便去看基于 fasthttp 开发的 web 框架。因为一个一个的对比不是很直观,于是我去 https://www.techempower.com/benchmarks/#section=data-r21 看了下 golang 的 web 框架排名,基于文档的完善程度和使用人数的考量(主要是看 github 上的 star 数hhh),最终选择了 fiber 框架来编写。(顺便附一张 benchmark 的图)image.png

可以看到 fiber 只是比原生的 fasthttp 慢了一点点。

(我在选择 web 框架上并没有经过很多严谨的实验,只是凭着自己的喜好选了一个看起来很棒的框架hhh)

相对于框架的性能来说,在业务上的代码逻辑可能对性能的损耗会更大,这个就比较看写的逻辑了。

数据库

一开始是打算使用最顺手的 mysql 的,因为一直用 mysql 比较多,所以在选择的时候也理所当然的考虑了 mysql。

不过最后实际上我选择了 postgresql,主要是想体验一下看看,”最先进的数据库“使用起来的感觉是什么样的。

前端

在前端的选择上,一开始都是选择的react来写。这里我把前端分成了两个项目,一个是博客内容的展示,另一个则是后台管理。

博客展示

在一开始的开发的时候,选择的是使用现代的前端框架 react 来写的。后来考虑到 seo 的影响,最后博客展示页面这里,我还是选择了使用模板渲染的方式。

在模板渲染的时候也发生了变动,一开始是用的 go 默认的 template 渲染方式,后来发现默认的template在自带的函数上不够方便(虽然我也没有用到很多的高级功能),还有一个原因是我不太喜欢它的结构体方法的调用方式,它是这样调用的:struct.method "param",总感觉有些不太符合观感。并且如果如果发生了 panic 或者错误,并没有很好的提示出错误来(虽然可以自行修改打出来,懒惰了),于是在调研之后,最后选用了 jet 作为模板渲染引擎。它的结构体方法在模板中的调用是这样的:struct.method("param")。这样的调用方式我感觉就很符合我的习惯。

在性能上,我参考了这个测试模板性能的仓库(https://github.com/SlinSo/goTemplateBenchmark),可以在这个仓库里面看到,jet 的性能在非编译模板中还是比较好的。不过我实际自己测试起来的性能和 net/http 里面的差不多,也许是 fiber 使用的时候引入了一些额外的特性导致的一些差异,也有可能是因为sql的时间消耗消耗远大于模板选择。

后台管理

后台管理页面这里使用 react + antd 的方案来构建,目前的样式如下图所示(还有一些功能依然在开发中)

image.png

功能基本上都在上面图中展示出来了,这里也不再过多介绍了。不过仪表盘那里还是一个空的页面,未来希望在里面加入一些统计等数据展示方便的功能,同时也会支持自定义的主题更换能力,不过这些都需要后面在花时间来开发了。

文章的评论功能也在开发中(后端已经ready了,但是还没想好要怎么去展示,不过估计最后也是仿照 WordPress 来展示了)

文章编辑的详情页如下:

image.png

个人感觉写文章的体验还是挺不错的。(这里需要感谢 vditor 编辑器,带来了很好的 markdown 文章编辑体验)

总结

陆陆续续的总算是把自己想做的博客的坑给填上了,这时间跨度拉得也是够长的hhhh。

虽然目前博客系统还有很多不完善的地方,也有不少小bug(我自己使用发现的),不过总的来说,功能上还是符合我的预期的,性能上也是如此,至少说比起之前使用的WordPress还是快了不少的,当然这也和我博客目前的功能比较少有关系。

不管怎么说,个人还是比较满足的,至于那些不完善的地方,后面在花时间慢慢填坑吧。

之后会再写一篇博客功能的详细介绍和后续开发的一个简单计划。