從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 | # jekyll |
所以你就知道了,舊文章的網址會全部失效變成 404,那對 SEO 可是重大災難。
這件事情後來的解法是,我另外在原本 jekyll 應該生成文章的目錄,另外放一個專門轉址用的 html 檔,裡面定義好標準網址 canonical,還有轉址用的 meta refresh,作為靜態網站無法直接使用伺服器層級的 301 轉址的替代方案。
1 | <head> |
然而文章那麼多,我當然不可能一個一個寫,太愚蠢了。
還好 hexo 有 filter 可以做到這件事情,於是現在會在網站生成後,遍歷一遍所有的文章,然後對每一篇文章的資料夾新增 html。
時區問題
這是在我網站遷移完成,正式用 github action 部署的時候才發現的問題,就是文章產生的日期是錯的,而且好像都差一天?所以我直覺想到的是時區問題。
Hexo 的 config 文件裡面本來就有定義時區了,所以應該是 github action 的時區要改,但還好這也不是什麼大問題,使用 szenius/set-timezone 就可以了
1 | - uses: szenius/set-timezone@v2.0 |