離開 Hexo,使用 Eleventy 架設部落格

離開 Hexo,使用 Eleventy 架設部落格

前言 #

從今年年初便知道 Eleventy 這樣的一套 Static Site Generator,經過一番評估之後,最近終於趁著空閒的空檔,選擇 Eleventy 作為新的技術框架,並以 eleventy-high-performance-blog 作為基底,架置了新的部落格,和過去所使用的 Hexo 框架說掰掰。

為什麼不用 Hexo? #

過去我使用 Hexo 架置部落格也有好幾年,事實上作為新手架置部落格的選擇來說,還是一個很不錯的選擇。

我認為 Hexo 有以下的優點:

但是,基於以上的優點……菜鳥時期的我也犯下了一些錯誤:

舊桌機版網頁 Lighthouse 表現

過去我所使用的是 hexo-theme-icarus 這個主題,利用 Lighthouse 量測,在桌機上的表現還不算太差,但還有改善空間

舊手機版網頁 Lighthouse 表現

然而透過 Lighthouse 量測,在手機上的表現是顯而易見的差強人意

其實後來想想,我真的需要這個主題之中的每一個功能嗎?答案當然是否定的。

對於自己的部落格,我的要求也和以前的我有所不同:

釐清自己的需求與目的後,開始研究不同技術與工具評估,透過 Huli 的這篇文章(除了 hexo,也可以考慮用 eleventy 來寫技術部落格)我得知了 eleventy-high-performance-blog 這個 template repo。

關於 eleventy-high-performance-blog #

eleventy-high-performance-blog 是一套由 google 工程師所建置的開源部落格模板,以打造高速效能為重點,這個模板已經建構好一套相對完整的架構,包含:

專案架構也清晰精簡,易於改動維護,可以說是麻雀雖小,五臟俱全!

非要雞蛋裡挑骨頭的話,這個模板未經修改、直接建置的 Demo site 看起來確實是比 Hexo 社群那些酷酷的主題要來得精簡許多……

但是,正如這個專案的 README 所說:

Knock yourself out. This is a template repository.

接受挑戰

Ok,我接受這個挑戰!

架設個人化部落格的心路分享 #

開始改造的第一步,首要之務當然是:確立風格,列出需求

以我的例子來說,參考了一些前輩和同事的技術部落格後,確立自己心有所屬的主題風格後,再將我心中的想像、這其中必備的功能一一列出來:

……諸多調整和樣式有關,族繁不及備載。

總而言之,事前確認越是具體,實作階段也就更明確,避免反覆修改。

Color Palette #

Color Palette 的部分,我則是借助了 Colormind 這個網站幫我配好合理的網頁配色,實務上再按需求作一些 darken & lighten 色彩轉換。

Colormind

只需要選好主色,點擊 Generate 便會自動產生合理的網頁配色。當然,你也可以設定副色等等,將其一併納入考量!

留言功能 - Giscus #

至於留言功能的部分,本來是在 utterancesJamComments 之間反覆猶豫,兩者對我來說各有優缺。

我一直以來都不是很喜歡 utterances 這種相依於 GitHub issues 相關 API 的方式,其實使用上並不會造成什麼問題,但對我來說 ...Is this an issue for me?

心裡總是有種彆扭的感覺在那裡,否則單以功能面來說,utterances 絕對是可以滿足我的需求。

反過來說,JamComments 這個第三方服務雖然看起來和 Eleventy 有不錯的支援性,甚至文件上也提供了官方外掛,但是對我而言,網站所相依的第三方服務,當然還是能少一個是一個。

直到我在 SNS 上偶然看見有人推薦 Giscus 這個工具,完美解除了我上述的疑慮!

Giscus 其實是受到 utterances 啟發,但不同的是,背後所使用的是 GitHub Discussions 相關 API。

當然這套工具也支援多樣的主題樣式設定,支援多語言,還可以讓我透過 window.postMessage 等方式對 giscus iframe 做更進一步的動態互動。

文件很清楚,串接過程中也沒遇到什麼問題,是一套我會想強力推薦給大家的留言系統工具!

CI/CD #

在本地環境弄得差不多了,下一步開始著手調整 CI/CD workflow。

CI 部分,原有的架構會有在 run build 過程中耗時過久的問題,我選擇直接對最費時的圖片處理流程下手,調整 .gitignore 設定,將 _site/img 事先 commit 進 repo(畢竟我的個人需求也不是很需要時常更新既有的靜態圖檔),如此一來可節省 5 到 10 分鐘不等。

CD 部分,我就直接使用 GitHub Actions 一口氣處理掉了,覺得自己不太需要用到 Netlify 服務,需要作轉址或是 SSL 憑證則是透過熟悉的 Cloudflare 幫忙處理。

CI/CD flow 說明 #

基本上常駐的就是三支 branch:

build & deploy workflow 設定檔範例 #

name: build & deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js $
uses: actions/setup-node@v1
with:
node-version: $
- name: Install dependencies and build
run: npm install && npm run build-ci
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
ssh-key: $
branch: gh-pages
folder: _site

Deploy job 使用了 JamesIves/github-pages-deploy-action 代勞,記得按照文件說明去 Repo Settings 設定 Deploy keyRepository secrets

購買自定義域名,設定 Cloudflare 代管 DNS #

不詳述如何設定自定義域名了,總之買完之後要去域名服務商調整設定,使用 Cloudflare 代管 DNS。

可以參考我過去的這篇文章:什麼是 SSL?透過 Cloudflare 來啟用 HTTPS

光是 Cloudflare 的免費方案就提供了許多網站加速、安全防禦服務,我重點設定的項目有這些:

成果 #

最後,你現在眼前所看到的這個 blog 便是一切的成果!

新桌機版網頁 Lighthouse 表現

利用 Lighthouse 量測,同一篇文章在桌機上的表現

新手機版網頁 Lighthouse 表現

利用 Lighthouse 量測,同一篇文章在手機上的表現

可以看到,雖然加了一些雜七雜八客製化功能和樣式(甚至是串上了 Google Analytics),但 Lighthouse 還是有很亮眼的表現。

再進一步比較修改前和修改後,手機版網頁上的各個指標所耗費時間:

舊手機版網頁的 Performance

Before:FCP 時間高達 3.1 秒,LCP 時間更需要 9.4 秒,完全就是不合格。

新手機版網頁的 Performance

After:FCP 時間降至 1.0 秒,LCP 時間只需要 1.3 秒,指標一切綠燈!

對於這樣的復仇成果,我個人可以說是相當滿意。

總結 #

感謝前人指路,讓我發現了一套這麼棒的模板工具!

過去我是懶人起手,直接交給了 Hexo 社群提供的主題來包辦一切,但是無形之中也因個人掌握不足,間接導致一些額外的效能問題。

這次基於簡潔的 eleventy-high-performance-blog 模板工具來開發,客製化個人功能的過程中,每告一段落、完成了一個較大規模的異動調整,我就會停下來檢查一下剛才完成的部分有沒有什麼地方可以再優化。(我個人是花了點心力在確認資源載入的 preload 設定等等)

與日常的專案開發不同,受限於頻繁的功能迭代有時候很難落實這件事情──然而頻繁量測,不斷地調整與測試,是提升網頁效能的必經之路

不排斥自己動手來的話,我是很推薦 eleventy-high-performance-blog 這個模板工具的,還收穫了滿滿的成就感!

其他參考 #

分享文章