Helloqiu's Blog

helloqiu 的博客

记一次失败的技术尝试

之前有一段时间没有什么事情做,突然突发奇想,想要自己写一个 static blog generator。当你看到标题的时候,可能你已经意识到了这次重复造轮子计划是失败的,但我认为我在这一过程中还是收获了一些东西的,所以我要记录下来。

最初的想法

当我决定造这个轮子的时候,我知道现在已经有了很多实用的类似的工具,所以根据创新的理念,我要在这一次的尝试之中尝试一些新的东西。
现在的大部分静态博客工具的原理基本上是利用模板渲染的方法利用预先制作的主题即模板和博客的内容生成纯静态的 html 内容。模板渲染在现在这个前端火热的阶段来看有一些显得陈旧与笨拙,这种方式没有体现出现在前端的技术栈的优势所在,但我认为利用这种方法来生成博客没有什么黑点,它够简单也够方便。
当然它也有那么几个缺点,比如开发主题时不够方便,模板语言远没有现在流行的前后端分离的方式来的灵活多变。所以本着折腾的想法,一个创意出现在了我的脑海中。
首先我将记录博文内容的 markdown 文件编译成 html,然后将它存储到一个 sqlite 数据库文件中。这个文件就是整个博客的核心,在 generate 的时候,我将数据库中的文件通过一个简单的 web 服务器 serve 出来,然后通过前端的 pre-render 技术来生成最终静态的博客内容。

为什么失败

花费了半个月的业余时间,我成功的实现了前端以外的部分,我用 python 写了一个叫 catstalk 的包,在编译 markdown 的阶段比较简单,有现成的可以使用,sqlite 的部分我用了 peewee,写了几个简单的模型,至于 serve 的部分,我用 tornado 写了几个 api 用来 serve。我为这个包添加了详细的测试,并把它开源在了 github 上。
直到今天早上,我开始了前端部分的编写,这也是为什么我放弃了这个方案的原因。
首先前端我用了 vue 的方案,vuex + vue-router + vue-resource 的组合之前我也用过。可能作为一个前后端分离的 web 应用来说我是成功的,但作为一个以纯静态为目的的 blog 系统。
我花了大量的功夫在后端数据的请求上,模板渲染的方案完全不需要花费这么多功夫在这上面。其次,pre-render 实在是非常的不容易使用,我用了 prerender-spa-plugin 这个 webpack 的插件来生成静态的页面,它的方案是使用 phantom.js 来模拟浏览器运行前端的程序,在特定的条件满足之后把当前浏览器的页面生成为静态的 html 文件,这是行的通的,但它并不容易使用。其次是我对前端仍然并不熟悉,我很难独立完成这样一个前端的应用。
所以我放弃了。
sad(
所以我的确学到了不要轻易挖坑。
也许我可以再利用一下我的聪明才智思考一下有没有更加棒的方案。:)