我的工具记录(5)- 生成静态网站
如何生成大批量静态网站?
随着我做G2Rail深入,我们整理了大量的数据,涵盖了各个国家城市、车站的编码地理位置信息、火车的运营商、车型、仓位、票种等信息。这些信息沉淀在我们数据库里面。而实际上,他们对于用户是很有价值的,特别是游客。如果能够精确知道一个火车站站内是什么样子,站外长成啥样,地址在哪里,甚至自己乘坐的车将会在哪个站台候车,将会给用户带来极大方便。
这个问题也给我们提出了一个挑战,在数据库里面的这些数据如何能够变得既方便用户查看,也方便我们自己更新?我们的答案是,把它们织成一张有机的网络。Social Linked Data这里引用了一个很有趣的概念“Linked Data”,它认为数据是一个个的独立单元,同时也是互相有机连接的整体,它们直接的关联,织就了一张Sematic Web。
在我们的系统里面,车站属于城市,车站会开出去很多车,车由运营商来运营,不同的车上有不同的座位、不同的运营商会卖各种不同折扣的车票等等。这些就是一张巨大的网。
静态网站
我的第一直觉是,把这些信息生成一张张互联的静态网页。这样的好处是,静态网页只需要有一个地方能够Host它就可以达到目的了。想要生成静态网站的考虑有两点:
- 我们有大量的内容,比如介绍、图片是结构化存在数据库的。内容是Markdown格式,如果方便通过Markdown直接生成网页就好了
- 像写博客一样,只需要关注内容,而网页和SEO相关的东西通过自动化就能完成。
模板语言 Mustache
Mustache是一个看起来有点怪异的模板,它啥也不干,就是给提供一个模板语言,在文本文件里面写上一段话,通过它的引擎Render出来就可以把指定的变量展开。
Hello
You have just won dollars!
Well, dollars, after taxes.
这很符合我的要求,我只需要给车站、运营商、城市定义好最终每个Entity的模板,比如图片在哪个位置,链接放在什么位置等等,然后在运行时通过Mustache的引擎把数据库里面保存的散碎的介绍、图片地址生成一个个Markdown文件。比如国家的Mustache模板:
---
title: ''
date:
author: G2Rail
cover_image:
---
##
我只需要把原始数据render成一个个markdown文件,剩下的就可以交给静态网站生成器了。
Jekyll
我的个人博客是基于Jekyll的,因此第一个考虑的就是它。把markdown交给他,由它生成系列网页。
不幸的是,Jekyll给个人博客用十分够用,网页的结构等等各方面都不错,但是如果一次让它生成10万张网页,它就有点力不从心了。
Hugo
此外,有很多人喜欢Hexo,它也是一个有大量粉丝的静态博客生成工具。不过最终我还是转向Hugo了,可能潜意识里面觉得Go写出来的相对性能会高一些。实验的时候,发现它生成数千张网页也就是眨眼的功夫。
基于Hugo,我整理了一套主题,主要是需要支持多语言、以及让网页结构变得搜索引擎友好一些。当然最终发现Hugo生成数十万张网页也十分吃力了。
写在后面
现在想想,这种做法有可能是错的,实际上我们可能不需要一次生成这么多网页,只需要生成一个SiteMap提供给搜索引擎,而具体的网页Render,可以在网页请求的时候根据数据库信息再来组合。或许下一步是重写这个所谓的CMS了。。。。