這個部落格,我想了兩年

說「想」其實不太準確,更像是一種執念。它在我還不會寫前端後端、也不會寫嵌入式程式碼的時候就已經有了。那時候我還在玩電子,偶然滑到了 @ushio影片和網站,覺得很好玩,我也想要一個。後來我花了小半年,從零學會了 C,還學了一點 JS 和 CSS,用 Hexo 搭了一個靜態部落格,部署在 Github Pages 上,總算也有了自己的一片小天地。

Hexo: A fast, simple & powerful blog framework. , hexo.io, 在新分頁開啟
Hexo 專案首頁在深色模式下的螢幕截圖,左上角是藍色六角形「H」標誌,旁邊是 Docs、API、News、Plugins、Themes、About 導覽連結、一個 GitHub 圖示、一個帶 Cmd-K 提示的搜尋框,右側則有英文語言切換器。主視覺區寫著「A fast, simple & powerful blog framework」,下方是可複製的安裝指令 `$ npm install hexo-cli -g`,並附一個藍色箭頭按鈕,再下方是一排徽章:41k GitHub stars、5k forks、每月 212k 次下載,以及一個 Follow @hexojs 連結。發行版本列表列出 2025-10-26 的 hexo 8.1.0、2025-09-16 的 hexo 8.0.0、2024-07-02 的 hexo 7.3.0 和 2024-04-17 的 Hexo 7.2.0,接下來的區塊以「Blazing Fast」和「Markdown Support」兩個功能標題開頭。發行日期與下載數字顯示這張截圖的時間為 2025 年 10 月下旬或之後。
ushio , sakura-ushio.icu, 在新分頁開啟
一張個人部落格文章列表的螢幕截圖,左側是深色側邊欄,內有圓形的動漫風格頭像、名字「小汐」、一個「主页」連結、一排「所有文章 / 友链 / 关于我」連結,以及四個圓形社群圖示,其中包括 GitHub 和 QQ。主欄顯示一張置頂文章卡片,標題為 PD-METER-R4,日期為 2023-01-29,其中文摘要說明該項目仍在開發中,且相較於 R3 優化了佈局、更換了主控制器,並新增了一些功能;下方是一塊標示著 USBC-R4 SAKURA 的小型綠色 PCB 的正反面兩張照片,拍攝於白布之上,帶有小米 12S Ultra 的相機浮水印,顯示 2023.02.06 15:47。該卡片帶有「置顶」(pinned)標籤和一個「展开全文 >>」展開按鈕,下方開始出現第二張卡片,標題為 WORX-BAT-Charger,日期為 2023-02-14。這看起來是一位硬體愛好者的部落格記錄其 USB-C power-delivery 電表板迭代過程的證據。

再後來,我看到了 @Innei 的個人網站,設計很精緻,功能也很齊全。當時我只看了一眼就想要,甚至還贊助支持了。雖然後來沒能用上,但這筆錢花得也不冤,因為我藉此摸到了 React 的原始碼。就像最初看到 C 時一樣:不就是程式碼嘛,有什麼大不了的?總有一天,我要自己寫一個。

静かな森 , innei.in, 在新分頁開啟
一張深色模式個人部落格首頁的截圖,背景近乎全黑,淡色花瓣飄落其間。頂端中央是一條膠囊狀導覽列,包含中文項目「首页」(目前選中)、「文稿」、「手记」、「时光」、「思考」和「更多」,左上角是一個動漫風格的小頭像,右上角則是登入圖示;左側的主視覺文字寫著「Hi, I'm Innei 👋。」,其下是「A NodeJS Full Stack <Developer />」以及「An independent developer coding with love.」這一行。再往下是一排圓形社群按鈕——Bilibili、網易雲音樂、GitHub、電子郵件、RSS、Telegram 和 X——右側則由一幅銀髮、繫粉紅蝴蝶結女孩的大型圓形動漫肖像穩住畫面,底部邊緣有一段關於責任與內在力量的灰色中文引言。這顯然是 Innei 個人網站在桌面寬度瀏覽器中呈現的著陸頁面。

那是 2024 年,然後 24、25、26 年,一直到現在

從那之後就停不下來了

失控

最初只是想給 @colmugx 的 Hexo 佈景主題 Nlvi 加一個深淺色切換。我先用 Dark Reader 的 JS 胡亂拼了一個,很醜,不滿意。接著去學 CSS 的 @media,然後做 JS 的 SPA 切換,再用 TailwindCSS 的 .dark class,再上 SSR 的 next-theme,最後是了一套 Cookie 加 Head Sync 內聯腳本,才解決 FOUC 閃爍。前後折騰了四五種方案。

🎨 A simple theme for hexo. , github.com, 在新分頁開啟
一款 Hexo 部落格主題的宣傳合成圖,左側是大字級淺灰色的字標「NIvi」,下方壓著一道短短的鮭魚粉色底線,右側則是兩張互相重疊、瀏覽器樣式的主題截圖。較大的桌面寬度面板顯示著奶油色頁首,內有手寫體 logo「Hexo」以及 search、ARTICLE、ARCHIVES、TAGS、ABOUT 的導覽列,其下是一篇日期為 2013-12-27、標題為「Elements」的排版測試文章——也就是 Hexo 標準範例頁面,依序走過 Heading 1 到 Heading 6、一段 lorem ipsum 的 Paragraph 區塊(含粉色行內連結、粗體、斜體、底線與 code 區段)、一則帶粉色左側直線的 blockquote,以及一個三欄表格,表頭為「Table Header 1–3」、下方是「Division 1–3」各列。同一頁面較窄的手機或平板呈現版本疊在其右下方,顯示 logo 置中、相同內容重排為單欄。整體置於純白背景之上,看起來像是主題展示圖,用以證明該設計在兩種寬度下都能乾淨地呈現其完整的 HTML 元素集。

但這只是冰山一角。接觸 React 後,我從石器時代的 Hexo 和原生 JavaScript 一路走到 Next.js 13 頁面路由器,又轉去看 Vue、研究單頁應用程式路由、理解 index.html 後備機制,專案也重建了無數次。我買了伺服器,折騰 Docker、Nginx 和網路附加儲存,又嫌 1Panel 太醜,便手寫了 Canopy 面板;研究儲存陣列時寫了 RFS;設定安全通訊端層憑證時,又被中國國內環境下頻頻出狀況的 acme.sh 逼得用 Rust 寫了反向代理 Vane 和 Lazyacme。它原本只是某天晚上花三小時寫出的八百行垃圾,結果被群友一慫恿,硬是寫了四個月,把 HTTP/3、零複製、分層模型和流程引擎全塞了進去。後來還有 Seam,一個全端框架,也是個無底洞,以後再說吧。

過度工程

然後 AI 時代來了,焦慮又翻了一倍。

最諷刺的是,這些東西本來都應該是在有了部落格之後,一邊記錄一邊做的。結果部落格,想法越來越多,卻沒有一個地方能把它們記下來。一邊是內心不停地譴責自己:說好了 Vane 要做完,就不能停;另一邊是越做越遠、越做越無力。我一直都記得自己要做什麼,就是做不出來。仔細想想,我其實已經很久沒有坐下來寫過任何東西了。現在回頭看,這一切都指向同一件事——過度工程。

我當時其實並不覺得自己在跑偏。Vane?反正部落格以後也要部署,總得有個反向代理吧。Seam?反正遲早要寫全端,不如先把我理想中的框架搞好。每一步都有理由,每一步都是「以後用得上」。但問題是,「以後」永遠不會來,因為我從未開始……

失敗

做部落格其實不需要反向代理,也不需要自行研發的框架。但當時的我把它們當成了先決條件,把它們當作那個看似合理、卻永遠阻礙我動筆的理由。可它們從來都不是。真正的先決條件只有一個:坐下來,寫出第一篇文章。

其實部落格不是沒動過,恰恰相反,我做了三次。

Vercel , vercel.com, 在新分頁開啟
深色模式下 Next.js 首頁的螢幕截圖,呈現桌面瀏覽器中所見的著陸頁 hero 區。頂部導覽列左側是 Vercel 三角形標誌與 NEXT.js 字標,旁邊是 Showcase、Docs、Blog、Templates 和 Enterprise 連結,右側則有一個帶 ⌘K 提示的「Search documentation...」欄位、一個 Deploy 按鈕和一個 Learn 按鈕。頁面中央以大型白色字體寫著「The React Framework for the Web」,下方副標為「Used by some of the world's largest companies, Next.js enables you to create high-quality web applications with the power of React components,」再往下是一個淺色的「Get Started」按鈕和一個深色的「Learn Next.js」按鈕,兩者下方是指令 `~ npx create-next-app@latest`。文字後方有淡淡的點狀格線和兩個不完整的圓形輪廓作為背景裝飾。

第一次還是 Next.js 13 Page Router 那會兒。那時候我只懵懵懂懂地知道單頁應用程式是什麼,對 SSR、SSG、ISR 這些概念一竅不通,但看別人說 SSR 好,我也就想用。結果寫著寫著,發現自己根本不理解這些架構究竟在解決什麼問題,於是做不下去了。後來,我轉向了 Vue 2 的純單頁應用程式。為什麼選 Vue?說來慚愧,只是覺得名字好聽,反正對我來說也是新東西,就試試吧。結果也沒撐多久。第三次,我回到 React,從單純的 JSX 開始,學會了 TypeScript 和 TSX,理解了 CJS 與 ESM 的差異,愛上了響應式程式設計,也用上了 Lucide、Framer Motion、Radix UI 這些日後再也離不開的函式庫——這一次終於像點樣子了。但我還是失敗了,因為本質上我只是在模仿:別人用什麼,我就拿來用。看起來有模有樣,實際上我根本不明白為什麼要這麼做。再加上 AI 幻覺的助力,很多東西都能先跑出一個最小可行產品,可一到擴大規模的時候,處處都是坑。

Remix , remix.run, 在新分頁開啟
Remix 網站著陸頁的螢幕截圖,畫面以淡灰到白的漸層呈現,左上角是「Remix」文字商標,右上角有一列導覽項目,寫著 Blog、Jam、Store、V2 Docs。置中的標題文字宣告「Remix 3 is under active development」,下方是副標題「A new full stack framework built on Web APIs」。下方三分之二的版面是一輛蓋著黑色罩布的汽車的風格化插圖,布料的皺褶映著光,還有一條彩虹條紋的斜向橫幅,以及橫越中段的白色賽車條紋光影——正是經典的蒙布超跑預告母題。它呈現出 Remix 3 專案頁面在正式公布前的狀態,框架改寫正在任何發行之前先行宣傳。

後來又學了 React(Remix)Router Loader、Next.js 15 App Router、RSC,但這時候日常生活已經很忙了,沒什麼時間寫程式,倒也沒機會第四次失敗。現在想起來,我的網站從 Next.js 13 寫到了 Next.js 15,前腳才剛遷移完成,還沒上線,Next.js 16 beta 1 就出了。

放手吧

說「想開了」其實不準確,是我累了。

一張 macOS 終端機視窗的截圖(左上角有紅綠燈按鈕、深色背景、等寬字體),顯示一個以框線繪製的表格,內容為每日 LLM token 用量與費用,畫面已捲動,因此標題列不在視野內。每一列都是 2026-03-03 至 2026-03-13 之間的某個日期,搭配當天使用的模型——haiku-4-5、opus-4-6,某些日子還有 sonnet-4-6——後面接著五個數字欄位,可讀為 input、output、cache-write 與 cache-read tokens 加上一個總計,最後是金額。總計從 2026-03-12 的 161,186,904 tokens、$97.92,一路到 2026-03-09 的 3,277,442,496 tokens、$1,765.56。cache-read 是遙遙領先的主要欄位,經常達到數十億,相對之下 output tokens 只有數百萬,而費用與該總計密切相關。這看起來是某個用量報表 CLI 的輸出,反映一段跨越多日的高強度 Claude Code 工作負載,在 2026-03-06 至 2026-03-09 這段期間達到高峰,約為每天 $1,700。

AI 時代的節奏太快了。模型一輪接一輪迭代,新技術一波接一波冒出來,我越來越焦慮,好像一停下來就會被人超過。最瘋的時候我一天寫 16 個小時程式,光 Token 一天就能燒掉 $1.9k USD (大概是 2 月的時候吧),人快廢了。但讓這一切停下來的不是什麼頓悟,就是單純地累了。在越來越緊的節奏裡,最後一根稻草壓下來,我反而釋然了,想開了,;這樣,也挺好的。

我開始放手。放棄曾經執著的東西,學會點到為止,明天的事明天再說。Vane 沒做完?先放著。Seam 還差很遠?以後再來。部落格不完美?先上線。開始完全 Vibe Coding,沒問題就不管,有問題再說。

奇怪的是,放手之後品質並沒有變差。我想大概是因為之前那些寫程式的日子沒有白費。早在 GPT-2 的年代我就開始用 AI 了,但那時候我還老老實實地寫每一行程式碼、弄懂每一個概念。那段經歷給了我底子。後來與其說是 Vibe Coding,不如說是 Context Coding——該有的判斷力還在,並沒有因為放手就犯什麼低級錯誤,更沒出什麼事故。

是之前所有的折騰,給了我現在放手的本錢

原點

最後的方案反而很簡單:全部放在 Cloudflare 上。R2 用作物件儲存空間,D1 用作邊緣資料庫,KV 用作快取,Worker 執行伺服器端算繪;全部採用無伺服器架構,不需要伺服器。

Cloudflare Worker , workers.cloudflare.com, 在新分頁開啟
Cloudflare 行銷首頁 hero 區塊的截圖,裁切至頁面頂端,背景為飽和的橘色,帶有淡淡的點狀紋理,底部中央有一圈溫暖的淺色光暈向上擴散。導覽列以下拉項目呈現 Products、Solutions、Resources 和 Pricing,右側有一顆「Login」膠囊按鈕和一顆白色的「Start building」按鈕;標題寫著「Everything we learned from powering 20% of the Internet—yours by default」,其下是副標「Cloudflare is your AI Cloud with compute, AI inference, and storage — letting you ship applications instead of managing infrastructure.」以及第二顆白色的「Start building」行動呼籲按鈕。這足以佐證 Cloudflare 目前的定位是「AI Cloud」,而非單純的 CDN 或資安廠商,並以承載全球 20% 網際網路流量的規模宣稱作為佐證點。

這個答案諷刺嗎?太諷刺了。因為在抵達這個「簡單」的終點之前,我繞了一大圈遠路。曾經計畫自行架設,所以得管理伺服器、折騰 Docker、管理容器,於是寫了 Canopy 當管理面板,寫了 Lazycert 管理憑證,寫了 Vane 當反向代理,寫了 Twig 為資源監控埋點。一堆專案,就只為了伺候一台垃圾伺服器。

儲存也是一樣。我嫌物件儲存太貴,想用自己伺服器的硬碟,於是寫了 RFS——一種能以原子方式去除重複資料並將其合併成單一檔案的 VFS,甚至復活了 20 世紀八九十年代的登錄檔概念,最後還透過 FUSE 掛載了起來。結果呢?花了更多時間重造了一個不太好用的輪子,伺服器還空轉了一年,徹頭徹尾是一筆賠本生意。

Vercel , vercel.com, 在新分頁開啟
這是一張桌面瀏覽器截圖,畫面是 Vercel 的行銷首頁,以黑色背景搭配淡淡的網格疊層呈現。深色導覽列左側是 Vercel 的三角形文字商標,中間為 Products、Resources、Solutions、Enterprise 與 Pricing 等選單項目,右側則有 Ask AI、Log In 與 Sign Up 控制項;主視覺標題寫著「Build and deploy on the AI Cloud.」,其下的副標為「Vercel provides the developer tools and cloud infrastructure to build, scale, and secure a faster, more personalized web.」。下方有兩個按鈕——白色的「Start Deploying」主要按鈕並帶有三角形圖示,以及外框樣式的「Get a Demo」次要按鈕。再往下,一個大型線條風格的三角形自網格中升起,背後由光暈打亮,光暈自左側的藍色漸變至頂點的綠色,再到右側的紅色,顯示這是近期擷取的畫面,反映該網站目前的 AI Cloud 定位。

最後繞了一大圈,還是回到了無伺服器架構。Vercel 的理念很好,但我不喜歡 Next.js;而且 Vercel 的魔法太多了,中介軟體先編譯再放到邊緣執行的設計最終仍然造成了割裂,甚至還引發了幾個 CVE,還不如乾脆全部放在來源伺服器一起執行。Cloudflare Workers 就很好,走向了另一種極端:把小於 10 MB 的產物編譯成 WASM,讓真正的商業邏輯也能在邊緣執行,這才是我想要的。除了花錢以外沒什麼缺點——不過嚴格來說,這也不算缺點,畢竟省下的時間就是錢。

少即是多

這句話我聽過無數遍,但花了兩年才真正理解它的含義。

回歸工程的本質:「Make it function, make it correct, then make it exceptional.」我終於走上了正軌,讓它能運作了。現在的部落格簡陋嗎?簡陋。不完整嗎?確實不完整。但總比沒有好。如果你連上線的東西都沒有,一直在做那個「也許需要」的東西,一直追求看不見的完美,那最後什麼都拿不出來。這不是妥協,而是一種工程上的取捨,反正我是想開了。所以我想開了。不再為一個細節執著,反而走出了門。手機相簿裡已經很久沒有戶外的照片了,隨手拍了一張路邊的風景——已經很久沒出門了嘛(

一張俯視角度拍攝的照片,畫面中一道修剪整齊的常綠灌木矮樹籬斜向穿過畫面,位於一道淺色花崗岩路緣石後方,左下角則有一片灰色鋪面與柏油路面。灌木叢生得茂密,但靠近路緣石處明顯稀疏,露出光禿的木質枝幹與一層褐色落葉,葉叢帶著春季新生枝葉的黃綠色澤;一株細瘦的樹幹從植栽中向上延伸至畫面上緣,遠處背景則有一帶鏽紅色的花壇植物。光線明亮且具方向性,角度夠低,將一個畫面外物體的長而柔和的影子投射在人行道與路緣石上,顯示時間應為傍晚時分。

回頭看以前走過的彎路,後悔嗎?不後悔。有些事若不親自試試,也許永遠都想不明白。更何況在 AI 時代,想重走我當年的老路已經幾乎不可能了,太多工作流程都已改變。另外,這個專案是 Taki,完全由 AI 編寫程式碼,但這並不代表它無法長期維護,也不代表它沒有人情味。其實是否使用 AI 並不重要。再說了,我喜歡的也不是寫程式碼本身,而是創造一個東西……