Intertidal

潮間帶工作室

從Jekyll到Hexo遷移筆記:效能提升與踩到的坑

前陣子終於下定決心把部落格引擎從 Jekyll 換成 Hexo,兩者同為靜態網站生成框架,雖然概念是一樣的,但肯定不是把舊文章複製貼上過來就能上線的,前前後後還是花了不少時間處理。

為什麼要從 Jekyll 搬到 Hexo

問題主要來自,隨著我網站內容越來越多,我感覺網站在 github action 上編譯的時間有越來越長的跡象,雖然說也不是真的多久(大概兩分鐘吧),但換成 Hexo 之後只要 30 秒其實落差還是滿顯著的。

第二個問題是我不懂 Ruby,所以就算我想嘗試優化上述的編譯時間,我也不知道從何下手,最後決定改用 Hexo,至少他是 Node.js 開發的,我想自己客製化寫點功能問題不大。

遇到哪些麻煩

重學主題語言

這算我自己的鍋吧,挑了老半天決定採用的主題,他的基礎架構是用 pug+stylus 寫出來的,而不是我很熟悉的 html+scss。這個時間成本是我一開始沒有預想到的。

文章特殊語法

Jekyll 除了支援基礎的 markdown 語法,還有一些比較特殊的東西,可以用{{syntax}}這種格式去呈現,例如我用到比較多的 link-to-other-page,他在 Jekyll 裡是這樣呈現的:

1
[參考文章]({% post_url yyyy-mm-dd-title %})

來到了 hexo 這些語法全掛了,要一個一個修正。

網址邏輯差異

這問題比較嚴重。
例如你寫了這樣一篇文章 yyyy-mm-dd-title.md ,這時 Jekyll 跟 Hexo 產生的部落格網址分別會是:

1
2
3
4
5
# jekyll
https://your-site.tw/yyyy/mm/dd/title.html

# hexo
https://your-site.tw/yyyy/mm/dd/title/index.html

所以你就知道了,舊文章的網址會全部失效變成 404,那對 SEO 可是重大災難。
這件事情後來的解法是,我另外在原本 jekyll 應該生成文章的目錄,另外放一個專門轉址用的 html 檔,裡面定義好標準網址 canonical,還有轉址用的 meta refresh,作為靜態網站無法直接使用伺服器層級的 301 轉址的替代方案。

1
2
3
4
<head>
<meta http-equiv="refresh" content="0; url=/${新網址}" />
<link rel="canonical" href="${新網址}" />
</head>

然而文章那麼多,我當然不可能一個一個寫,太愚蠢了。
還好 hexo 有 filter 可以做到這件事情,於是現在會在網站生成後,遍歷一遍所有的文章,然後對每一篇文章的資料夾新增 html。

Hexo 過濾器(Filter)

時區問題

這是在我網站遷移完成,正式用 github action 部署的時候才發現的問題,就是文章產生的日期是錯的,而且好像都差一天?所以我直覺想到的是時區問題。
Hexo 的 config 文件裡面本來就有定義時區了,所以應該是 github action 的時區要改,但還好這也不是什麼大問題,使用 szenius/set-timezone 就可以了

1
2
3
- uses: szenius/set-timezone@v2.0
with:
timezoneLinux: "Asia/Taipei"

Hi 喜歡這篇文章的話 可以按個讚或請我喝杯咖啡
Buy me a coffeeBuy me a coffee

目錄