超強超快 Zola SSG !!!

2023-09-20

前言

老實說,直到幾天前我仍然覺得在這個年代,SSG (Static Site Generator),不用說一定是靈活性大於效能的… 但是當我在上星期嘗試幫一位朋友把網站從 WordPress 搬家到 11ty 的時候,我才知道選擇一個高效能的 generator 是多麼的重要

Zola 是甚麼?

Zola 是一套用 Rust 開發的 SSG,它標榜 fastsingle binary,原創者建立這個項目的原因是他討厭 Hugogolang template engine,加上想讓 SSG 變得更容易使用,因此開發了 Zola

11ty 很慢嗎?

是!最初為甚麼選擇 11ty 呢?主要應該是太過習慣使用 Node.js 的開發生態,所以自然會找 JS based 的工具,雖然官網宣稱自己 Fast Builds,但當我把朋友的中型網站的文章和圖片轉到 11ty 後,發現根本不是那麼一回事,在還沒太多客製化的情況下 build time 已經高達 2 分鐘了!而且它奇怪的 lifecycle 和各種 CLI 的顯示問題亦令到開發的過程異常苦痛…

Zola 到底有多快?

我們來比較一下這 3 種不同語言的 SSG (11ty, Hugo, Zola) 的速度

測試準則

這次會使用 Windows WSL2 (Ubuntu 22.04) 進行測試,而測試用的網站大約有二百幾篇文章;每篇文章平均有 7 張圖片以上;以及特別多的標籤,測試原則必須包括:

  • 一頁顯示全部文章(標題)的索引頁
  • 一頁所有標籤的索引頁
  • 所有文章,文章內必須能夠顯示相對路徑的圖片
  • 每個標籤都有一頁能夠顯示其下所有文章

測試結果

先附上各自 build 的結果

11ty (10.7s)

$ DEBUG=Eleventy:Benchmark* npx @11ty/eleventy

[11ty] Copied 5 files / Wrote 1970 files in 10.79 seconds (5.5ms each, v2.0.1)

Hugo (1.2s)

$ hugo

                   |  EN
-------------------+-------
  Pages            | 3808
  Paginator pages  |    0
  Non-page files   | 2798
  Static files     |    1
  Processed images |    0
  Aliases          |    0
  Sitemaps         |    1
  Cleaned          |    0

Total in 1260 ms

Zola (1.1s)

$ zola build

Building site...
Checking all internal links with anchors.
> Successfully checked 0 internal link(s) with anchors.
-> Creating 219 pages (0 orphan) and 1 sections
Done in 1.1s.

從結果可見,雖然之前在其他網站上曾看到過 zola 比 hugo 快 4 倍,但目前來看兩者的效能相差無幾,而 11ty 連比較的價值也沒有

Hugo 不好嗎?

我沒有真正使用過 Hugo,但在網路上看到很多人都討厭 Hugo 過於複雜的 template engine,而我不使用的原因亦很類似,我對 golang 實在無法產生一點好感… 不過從客觀角度來看的話 Hugo 的確是目前比較全能的 SSG,各方面也表現優秀

我對 Zola 的印象

看到標題應該能知道我非常喜歡 Zola 了吧? 我猜大概是因為 Rust 的原因,雖然 Zola 有不少缺點,但單是效能和語言對我而言已經能概過這些缺點啦

很簡單!不需要學習 Rust

整過過程中,不需要寫任何一句 Rust code,template engine 也是用一個作者開發的 Tera,格式與其他傳統的 template engine 亦非常接近,所以十分容易上手

Rust 就是效能的保證

託 Rust 的福,以往 build 從來沒有試過這麼快,可能有人會覺得 XXX but in Rust 有點 overhype,但我作為錯過了寫 C / C++ 的年代的 developer、便很喜歡這個風氣,雖然當中夾雜著很多無意義的項目,但每次看到一些用 Rust 重寫的大型項目都會讓我不期然地十分佩服,希望我在不久的將來也可以用 Rust 開發一點東西 (๑•̀ㅂ•́)و✧

原創者十分有個性?

這幾天在 Zola 的 GitHub Issue 打滾,不得不說原創者 Keats 真是個很有主見的人… 他是法國人… 所以好像有點合理( •́ _ •̀)?

很多時候 feature request 被駁回的原因都是「我覺得不合理」、「我覺得沒有用」、「我說了算」的態度,這樣的確可以防止項目因為加入太多靈活性而變得複雜和降低效能,但是… 我真的很想要自訂 permalink 啊!!!

用家要遷就工具

老實說這是一個很大的問題,如果這一刻叫我選擇一個 SGG 給客戶的話,必定是 Hugo 而不是 Zola,至少我可以自訂文章的 url 而不是必須根據路徑生成,我無法想像 1000+ 的 folder 放在同一個路徑找起來有多噁心,而創作者一句「doesn't make any sense to me」簡直讓我無語 (´ ー`)

而且我也為了使用 taxonomies,而把 markdown 從 YAML 轉換成 TOML,亦要把每個 md 內 frontmatter 的 tags 加上 [taxonomies] 才能使用 grouping… 我文章的 source 亦因此而改動了不少,這讓我有點不爽

該不該換 Zola?

最後總結,如果需要大量的客製化、比較人性化的寫作體驗,我會選擇 Hugo;但如果是追求效能、剛學習使用 SSG、想感受 Rust 的速度的話,不妨一試 Zola,反正過了一排又會有新的 SGG 出現,到時又能再玩一番,這不是很有趣嗎?