Inhzus

Official

从 Hugo 迁移至 Zola


本博客的主题之前是基于 futu 魔改而来,不是自己写的代码,条理梳理得就比较差。借这次迁移 SSG 重新梳理了代码,并记录下遇到的问题。

Zola vs. Hugo

实际体验下来,Zola 相比 Hugo 并没有显著的提升。

最可圈可点的性能,只有在博客数量过多时,才能感受到明显的差异。

在社区方面,Hugo 可查询到的资料和插件非常丰富,相比之下 Zola 则需要一些动手能力才能搞定。且目前看起来 zola 的 GitHub repo 并不是非常活跃,待解决的问题数量不少,很容易找到贡献的机会。

Tera

基于 Rust 的 Tera template 语言,在语法上和 Hugo 支持的 golang text/template & html/template 基本类似。

不过,Tera 对「继承」的支持更加完善,支持在子页面 extend 父页面,定制其中一部分 block (不论是一系列变量,还是页面内容),且可以通过 super() 方法调用父 block 逻辑。

于是可以做到:

<!-- base.html -->
{% block init %}
  {% set title = config.title %}
  {% set author = config.author %}
{% end block %}

<title>{{ title }}</title>
<meta author="{{ author }}"/>

<!-- post.html -->
{% block init %}
  {{ super() }}
  {% set title = page.title ~ " | " ~ config.title %}
{% endblock %}

base.html 中声明需要使用到的变量;在对应到不同的实现中(如 index/post/archive),调用 super() 接受大多数默认变量,修改当前页面需自定义的部分。

通过以上办法,不必再像大多数 Hugo 主题一样,在一份 html 中,进行所有页面类型的分类判断,将大量的代码堆在一起,之后又由于代码过长拆成若干个模板文件(如 header.html,meta.html,甚至 description.html)七零八落,维护起来相当痛苦。

问题

Zola 框架提供的绝大多数链接都是 permalink,也就是都要带有 base_url。举例如 base_url = https://example.com/blog,文章的相对链接为 /posts/welcome.md,透过 get_url(path="@/posts/welcome.md") 只能获取到 https://example.com/blog/posts/welcome/,而无法方便地获取到到根路径的相对路径 /blog/posts/welcome/

Syntax Highlighting

Zola 的代码高亮主题配置与 Hugo 不同,如果需要自定义主题,需要使用 textmate .tmTheme 或 sublime .sublime-theme 配置,或基于自定义的一套 css class 实现相应的高亮风格,迁移起来需要一定的成本。好在其内置了我比较喜欢的 GitHub 风格。

Builtin Functions

Zola 缺乏诸多常用的内置函数或模板,如 google analystics、git info、TOC 等,均依赖于用户自己实现。

且仅从配置项就可看出 zola 在某些功能上缺乏自定义选项,如 markdown、goldmark、footnotes 等等。

总结

不过总的来说,zola 还是能够胜任我的这种比较简洁风格博客的使用。

我完全重构版本的主题 repo:zola-futu