花園
8 則筆記正在生長。清除篩選 ✕
標籤nestjs平台rootnote✕架構前端踩雷程式碼走讀projectdddnuxt心路seo安全資料庫部署ios共筆dockerlinuxpythonssrtradewindows構想流程測試資料視覺化需求分析成熟度種子扎根✕常青
- 結緣、澆灌與一封確認信:匿名網站的信任設計 這個站沒有會員系統——訪客是匿名的。但有兩個功能需要「某種程度的身分」:訂閱常青通知,和rootnote-origin|澆灌的一人一票。怎麼在不建帳號的前提下設計信任,是我在這個站上最喜歡的一組取捨。 訂閱:double opt-in 填了信箱不算訂閱,點了確認信裡的連結才算。這不是形式主義:沒有這一步,任何人都能拿別…
- Wikilinks 與 backlinks:用算的,還是落表?答案是一半一半 花園的靈魂是 雙向連結——我在筆記裡寫 某篇的slug,那篇筆記的頁尾自動長出「誰連到我」。實作上第一個要回答的問題:backlinks 是算出來的還是存起來的? 第一版:純用算的 語法解析是 domain 的純函式:從 body 抽出所有 wikilink slug。backlinks 就是反向索引——把所有已發佈筆…
- 部署這座花園:免費機器的取捨(已拍板) 這篇曾是一則「進行中」的種子——正在為這個站找家。現在拍板了,讓它按當初的承諾長大。 先重述需求盤點,因為它決定了一切:API 要 always-on(jobs worker 每五秒 tick,睡著了newsletter-double-optin|確認信就寄不出去)、postgres、本地圖檔要持久化、Nuxt swr…
- 程式碼走讀:一個 composable 裡的樂觀更新與回滾 筆記頁的rootnote-origin|澆灌按鈕背後是一個五十行的 composable,麻雀雖小,前端狀態管理的幾個經典題都在裡面。 樂觀更新:先變臉、再對帳 ts useNoteStats.ts(節錄) async function water(): Promise<void { if (watered.value…
- 程式碼走讀:計數器為什麼不能 load–mutate–save 這個站的rootnote-origin|澆灌與到訪計數背後是一張極簡的表:noteId、views、waters。它的 repository 是全站唯一寫原生 SQL 的地方,值得走讀一次「為什麼」。 錯誤版本:教科書寫法的競態 DDD 的直覺寫法是 load–mutate–save: ts const stats =…
- 與 AI 設計師協作:交接包、拍板權與閱後即焚 這個站的視覺不是我設計的——是 AI 設計師出的稿,我實作。幾輪合作下來長出一套穩定的流程,記下來,因為「怎麼跟 AI 協作」本身就是這個時代值得種的筆記。 交接包的形狀 每個設計案交付一個資料夾:一份 README(設計決策、規格、色票對照、硬約束清單)加一份瀏覽器直開的 mock HTML。README 負責「為什…
- 編輯器的溫室工程:自動儲存、補全與一個吃字的 bug 後台的筆記編輯器是全頁雙欄:左邊寫、右邊markdown-pipeline|同管線預覽。它是我在這個專案裡對「寫作手感」投資最重的地方,幾個工程點值得記。 自動儲存:debounce 之外的三個細節 打字停頓 1.5 秒送一次 PATCH,這是基本款。魔鬼在邊角: - flush 時機——發佈前、離開頁面前,必須先把未…
- 一條 markdown 管線:後台預覽與前台渲染禁止分家 筆記用 markdown 寫,渲染發生在兩個地方:公開前台的文章頁、後台編輯器的即時預覽。這裡有一條我立得很早的紅線:全站只准有一條 markdown 管線。 為什麼這麼嚴 兩套實作的漂移是漸進且不可逆的:前台升級了語法高亮、後台忘了;後台的 wikilinks-backlinks|wikilink 樣式調了、前台沒跟…