Ian Chou's Blog

回歸 Web 1.0 的去中心化精神:我的「聯邦式」部落格架構 (The Blog Federation)

在軟體架構的世界裡,我們常說「合久必分,分久必合」。這篇文章紀錄了我如何從單體架構的泥沼中掙脫,轉向「聯邦式」架構的心路歷程。這不僅是技術的選擇,更是對寫作初心的回歸。

第一個痛點:過度設計的陷阱 (The Over-engineering Trap)

最初,我對於部落格的想像充滿了技術熱情。我想要擁有最出眾的 React 動態效果,理所當然地選擇了 Next.js 作為我的架構首選。

結果確實如我所願,視覺效果非常華麗。但隨之而來的是隱藏的代價:

  1. 本末倒置:我發現自己浪費了大量時間在繪製 Cover Image、建立複雜的 Component,而不是在寫作本身。
  2. 維護成本:每寫一篇文章都要處理 Component 的細節,Next.js 的部署時間也相對較長。

漸漸地,因為寫作變成了一件「沈重」的工程任務,我停更了一段時間。這讓我開始反思:我到底是為了寫 Code 而寫部落格,還是為了分享而寫?

後來,我嘗試使用 Astro 建立了一個新站點。在這個過程中,我學會了如何更聰明地共一 Component(例如 Table、Chart.js),不用每篇文章都重新造輪子。更重要的是,我發現了一個關鍵事實:其實我 99% 的文章只需要標準的 Markdown 就足夠了,根本用不到 MDX 的複雜功能。

第二個痛點:雙語寫作的無力感

我一直有一個目標,就是同時經營中文與英文的技術部落格。

但在舊有的架構下,光是維護中文站點就已經耗盡了我的心力。寫完一篇中文文章,調整完那些複雜的 Component 和樣式,我已經沒有力氣再將它翻譯成英文並重新排版發布了。這導致我的英文部落格計畫一直停滯不前。

解法:聯邦式架構 (The Federated Architecture)

為了解決上述兩個痛點,我決定將架構「拆解」,採用分而治之的策略。我不追求用一個超級框架解決所有問題,而是讓每個工具做它最擅長的事。

中文宇宙 (Chinese Verse)

針對中文內容,我將它拆分為三個部分,全部託管在 Cloudflare Pages 上:

  1. 純文字內容 (The Text):使用 Eleventy (11ty)。這是最輕量的靜態生成器,專門用來存放並快速生成標準的 Markdown 文章。它的建置速度極快,讓我可以專注於文字。
  2. 互動內容 (The Interactive):建立一個獨立的 Next.js 站點,專門用來存放需要 MDX、React Component 的複雜文章。只有真正需要「炫技」的時候,我才會用到這裡。
  3. 聚合與入口 (The Aggregator):主網域 (www) 使用 Astro。它的任務很簡單,就是抓取上述兩個子站點的 RSS Feed,將它們聚合在一起展示。

這樣做的好處是顯而易見的:

英文宇宙 (English Verse)

英文部分我也採用了類似的邏輯,但工具略有不同(為了嘗試與學習):

  1. 純文字內容:使用 Hugo。Go 語言編寫的 Hugo 以速度聞名,非常適合處理大量的 Markdown 文章。
  2. 互動內容:使用 Astro 來處理 MDX 文章。
  3. 聚合與入口:主站同樣使用 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 並合併
// ... (實作細節省略,原理同前)

結語:效率的飛躍

切換到這個架構後,效果立竿見影。

我現在一天可以輕鬆發布三篇中文和英文的文章

這個架構解決了我的技術焦慮,也治好了我的拖延症。它展現了技術不僅僅是為了追求「強大」,更是為了讓創造者能更自由、更高效地表達自我。