megrxu

使用 CDN 分發靜態部落格中的圖片

Aug 15, 2021  「Web」  
由於在圖片較多時,編譯時間非常久,本頁面內容已經失效。目前使用的方案是 Imagio

部落格中的資料一般分為文字資料和二進位制資料兩種。在靜態部落格盛行的當下,使用 CI,即持續整合(Continuous Integration),來從 Git 倉庫構建 HTML 檔案是一個非常常用的選擇。然而這也要求要麼使用圖床等技術,要麼必須將圖片等二進位制資料也儲存在同樣的倉庫中。

曾經因為並不信任圖床的穩定性,以及畢竟資料會持有在別人手中,我將圖片儲存在同一個倉庫中。然而圖片越積越多,導致倉庫體積不斷變大。並且由於 EXIF 資訊洩露等問題,直接在部落格中使用未經處理的圖片也有一些隱患。同時,為了圖片的高解析度和圖片質量,也不斷在犧牲訪問速度。

使用 Hugo 來進行影象處理

Hugo 靜態部落格生成器很早就支援了影象處理這個功能,能夠對圖片進行裁剪,轉換大小,高斯模糊等一系列操作,配合一些 JS 庫更能做到非常好的 Lazy Load 體驗。

使用 v0.80 版本的 Hugo 中新的 Overlay Filter,更能為圖片新增水印,非常方便。

從另一個倉庫收集圖片連結

我並不是很喜歡將這個圖片連結的處理交給 JS 完成,同時為了完成二進位制資料和文字資料的分離,我也將圖片儲存在了另一個倉庫中,就要求原始倉庫有能力獲取到處理後圖片的連結。

這一點可以透過 Hugo 的 getJSON 函式和 Hugo 本身的頁面模板來完成。在圖片倉庫編寫 JSON 模板,生成處理後的圖片和 JSON 索引檔案,在文字倉庫透過 getJSON 函式獲取索引,並索引相應圖片的連結,即可在編譯 HTML 時得到不同解析度以及不同型別的圖片的連結,並嵌入到頁面中。

使用 Cloudflare Pages

最後,將圖片這個倉庫使用 Cloudflare Pages 進行構建,直接部署到對應的 Cloudflare CDN 上,就可以使用 CDN 進行加速了。

效果

例如,這個連結 指向一個有水印並且 4096x 的照片,而這個連結 指向一個無水印的 1024x 的照片。