10月22日 刊出
二十三萬字像二十三萬口飯,一口一口盛,才不會涼了一桌
一位小說作者在瀏覽器裡把二十三萬字逐章打包成電子書,我們把這件事翻譯成廚房裡一菜一碟、現做現上的滋味故事。
2026 年 10 月 19 日,掘金上出現了一篇技術復盤。一位在番茄平臺連載修仙小說的作者,趁業餘時間用自己的 Vue 3 加 Vite,替一百一十章、二十三點三萬字的小說蓋了一個閱讀站,部署在 Cloudflare Pages 上。這件事離廚房很遠,離餐桌卻很近。
你想想家裡辦一桌菜的邏輯。二十幾萬字一次全端上桌,就像把一鍋飯整鍋砸在桌面中央,客人拿著湯匙不知從哪下口。作者的選擇一樣:每一章在瀏覽器裡現場打包成一本獨立的小電子書,讀完一本,翻下一本。一菜一碟,現做現上。
他沒有選最省事的路。把 Markdown 丟給現成工具轉成 HTML 一口氣塞進頁面,就像煮一大鍋什錦粥,什麼都在裡面,方便是方便,但讀小說的人和坐上飯桌的人一樣講究「儀式」:紙本書是翻頁的,不是滾動的;眼睛要知道「讀到哪了」,就像嘴裡要知道「這碗飯喫到一半還是見底了」。滾動條按像素算進度,等於用眼睛目測鍋裡剩幾成米,橫豎螢幕一轉,位置就飄了。所以他把分頁、翻頁、進度全部交給專業的電子書閱讀庫處理,自己只守住章與章之間的邊界,像守著爐上那鍋,末頁一到,就換下一道。
打包電子書這件事,本質上就是裝便當。一個 EPUB 檔案其實是個 ZIP 壓縮包,作者在文中列出的最小結構,讀起來像一份便當清單:mimetype 要最先放進去、不能壓,如同便當最底層那片墊底的飯,位置不能換,一換整盒就塌了。正文是嚴格的 XHTML,規規矩矩,每個標籤都要收尾, <hr> 不閉合,解析器立刻報錯。這跟擺盤一個道理:湯匙的柄不能伸進菜裡,看起來是小事,規矩壞了,整盤就不成立。
他踩的三個坑,全是真調出來的。mimetype 必須第一個寫入且只存不壓;HTML 的 void 元素不自閉合會讓 XML 解析直接罷工,得加一道規整的手續,把 <hr> 補成 <hr />。這道手續像什麼?像端桌前那最後一眼:筷子擺正、碗沿擦乾淨、湯匙換一面。沒人注意到你做了,但少了它,整桌就糙了。
每一章是一本獨立電子書,還帶來一個舒服的副產品:閱讀器回報的百分比,天然就是「本章內的位置」。百分之百就是這道菜喫完,百分之零是剛上桌。他不需要算全桌喫了幾成,只要盯著眼前這一碟。這種節奏,其實跟我們先前聊過的一鍵出一整本書跟辦一桌菜用的是同一套心思是同一條路:把一次做不完的大工程,切成一碟一碟當下能喫完的份量。
二十三萬字怎麼載入?按需。讀者翻到哪一章,才打包哪一章。這是廚房裡最古老的原則:客人點了才開火,備料可以備,但不提前下鍋。一大鍋先炒起來放著,等客人來了只剩油味和冷掉的鑊氣。文裡還提到三套主題切換、手勢接管這些細節,如同餐桌上換季:夏天撤掉熱湯、冬天把涼菜收進冰箱,換的時候手要快,殘留要清乾淨,否則上一桌的氣味會賴著不走。
作者的線上站位在 xiuxian-novel.pages.dev,原始碼放在 GitHub 上。若你也寫東西、也做菜,這篇復盤值得配一杯茶慢慢讀。它說的其實是一件很家常的事:體面,從來不是一次端出全部,而是讓每一口送到你面前的時候,都還冒著剛起鍋的熱氣。