回歸 Web 1.0 的去中心化精神:我的「聯邦式」部落格架構 (The Blog Federation)
在軟體架構的世界裡,我們常說「合久必分,分久必合」。這篇文章紀錄了我如何從單體架構的泥沼中掙脫,轉向「聯邦式」架構的心路歷程。這不僅是技術的選擇,更是對寫作初心的回歸。
第一個痛點:過度設計的陷阱 (The Over-engineering Trap)
最初,我對於部落格的想像充滿了技術熱情。我想要擁有最出眾的 React 動態效果,理所當然地選擇了 Next.js 作為我的架構首選。
結果確實如我所願,視覺效果非常華麗。但隨之而來的是隱藏的代價:
- 本末倒置:我發現自己浪費了大量時間在繪製 Cover Image、建立複雜的 Component,而不是在寫作本身。
- 維護成本:每寫一篇文章都要處理 Component 的細節,Next.js 的部署時間也相對較長。
漸漸地,因為寫作變成了一件「沈重」的工程任務,我停更了一段時間。這讓我開始反思:我到底是為了寫 Code 而寫部落格,還是為了分享而寫?
後來,我嘗試使用 Astro 建立了一個新站點。在這個過程中,我學會了如何更聰明地共一 Component(例如 Table、Chart.js),不用每篇文章都重新造輪子。更重要的是,我發現了一個關鍵事實:其實我 99% 的文章只需要標準的 Markdown 就足夠了,根本用不到 MDX 的複雜功能。
第二個痛點:雙語寫作的無力感
我一直有一個目標,就是同時經營中文與英文的技術部落格。
但在舊有的架構下,光是維護中文站點就已經耗盡了我的心力。寫完一篇中文文章,調整完那些複雜的 Component 和樣式,我已經沒有力氣再將它翻譯成英文並重新排版發布了。這導致我的英文部落格計畫一直停滯不前。
解法:聯邦式架構 (The Federated Architecture)
為了解決上述兩個痛點,我決定將架構「拆解」,採用分而治之的策略。我不追求用一個超級框架解決所有問題,而是讓每個工具做它最擅長的事。
中文宇宙 (Chinese Verse)
針對中文內容,我將它拆分為三個部分,全部託管在 Cloudflare Pages 上:
- 純文字內容 (The Text):使用 Eleventy (
11ty)。這是最輕量的靜態生成器,專門用來存放並快速生成標準的 Markdown 文章。它的建置速度極快,讓我可以專注於文字。 - 互動內容 (The Interactive):建立一個獨立的 Next.js 站點,專門用來存放需要 MDX、React Component 的複雜文章。只有真正需要「炫技」的時候,我才會用到這裡。
- 聚合與入口 (The Aggregator):主網域 (www) 使用 Astro。它的任務很簡單,就是抓取上述兩個子站點的 RSS Feed,將它們聚合在一起展示。
這樣做的好處是顯而易見的:
- 速度:Cloudflare Pages 每個專案限制 1GB,但因為拆分了,每個專案都很輕量,部署速度飛快。
- 管理:每個子站都是一個獨立的子網域 (Subdomain),職責分離。
英文宇宙 (English Verse)
英文部分我也採用了類似的邏輯,但工具略有不同(為了嘗試與學習):
- 純文字內容:使用 Hugo。Go 語言編寫的 Hugo 以速度聞名,非常適合處理大量的 Markdown 文章。
- 互動內容:使用 Astro 來處理 MDX 文章。
- 聚合與入口:主站同樣使用 Hugo 進行 RSS 聚合。
架構核心實作:RSS 聚合
為了讓讀者在統一的入口看到所有文章,我不依賴複雜的 API,而是回歸 Web 1.0 的精神:RSS。
主站作為「聚合器 (Aggregator)」,在 Build Time 抓取各個子站的 rss.xml。
import Parser from "rss-parser";
// 定義聯邦子站點
const SUBDOMAINS = [
{
label: "Next.js (Interactive)",
url: "https://n25a.citrine.top/rss.xml",
},
{
label: "Eleventy (Thinking)",
url: "https://11ty.citrine.top/rss.xml",
},
];
const parser = new Parser();
// 並發抓取所有站點的 RSS 並合併
// ... (實作細節省略,原理同前)
結語:效率的飛躍
切換到這個架構後,效果立竿見影。
我現在一天可以輕鬆發布三篇中文和英文的文章。
- 想寫隨筆?丟進 Eleventy/Hugo,秒速發布。
- 想寫深度技術文帶圖表?丟進 Next.js/Astro,專注打磨互動體驗。
- 雙語同步不再是負擔,因為發布流程被簡化到了極致。
這個架構解決了我的技術焦慮,也治好了我的拖延症。它展現了技術不僅僅是為了追求「強大」,更是為了讓創造者能更自由、更高效地表達自我。
- ← Previous
Next.js EC Site MVP - Monorepo Architecture Documentation (Bun Edition) - Next →
[實戰筆記] 如何在「現有資料夾」中初始化 Astro 專案?(部署至 Cloudflare Pages)