[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$flIQpuXncnEybOc48dL6KCGXeNv09oB5KLnBMFDDV-fA":3},{"slug":4,"title":5,"body":6,"excerpt":7,"tags":8,"maturity":11,"meta":12,"plantedAt":13,"tendedAt":14,"shouldIndex":15,"resolvedLinks":16,"backlinks":19,"authorName":23},"markdown-pipeline","一條 markdown 管線：後台預覽與前台渲染禁止分家","筆記用 markdown 寫，渲染發生在兩個地方：公開前台的文章頁、後台編輯器的即時預覽。這裡有一條我立得很早的紅線：**全站只准有一條 markdown 管線**。\r\n\r\n## 為什麼這麼嚴\r\n\r\n兩套實作的漂移是漸進且不可逆的：前台升級了語法高亮、後台忘了；後台的 [[wikilinks-backlinks|wikilink]] 樣式調了、前台沒跟。三個月後「預覽」與「發佈後長相」是兩個世界，所見即所得變成所見即所騙。\r\n\r\n所以後台預覽**直接 import 前台的渲染函式**——同一個 markdown-it 實例、同一組 plugin、同一份輸出。前台管線動了什麼，預覽當下就長什麼樣，零同步成本。\r\n\r\n## 管線裡的自製零件\r\n\r\n- **wikilink plugin**——`[[slug]]` 與 `[[slug|顯示文字]]` 解析成站內連結；指向未發佈筆記的連結渲染成「未發芽」的降色樣式（連結存在、目標還沒長出來，在花園語境裡這是合法狀態，不是壞連結）。\r\n- **標題錨點**——h2\u002Fh3 自動生成 id，給筆記頁的目錄用。中文標題保留原文當錨點、重複標題加序號後綴。\r\n- **程式碼區塊**——語法高亮只載入核心語言（bundle 節食），fence 支援檔名慣例（```` ```ts [file.ts] ````）。\r\n\r\n## 安全邊界\r\n\r\nmarkdown-it 設 `html: false`——**原始 HTML 一律不放行**，所有輸出都經過 renderer 生成。這個站的內容雖然只有我自己寫，但「渲染管線天生防 XSS」跟「渲染管線信任作者」是兩種體質，未來若開放[[comment-magic-link|留言]]或多人協作，體質好的管線不需要重新體檢。","筆記用 markdown 寫，渲染發生在兩個地方：公開前台的文章頁、後台編輯器的即時預覽。這裡有一條我立得很早的紅線：全站只准有一條 markdown 管線。 為什麼這麼嚴 兩套實作的漂移是漸進且不可逆的：前台升級了語法高亮、後台忘了；後台的 wikilinks-backlinks|wikilink 樣式調了、前台沒跟…",[9,10],"rootnote","前端","budding",null,"2026-07-14T06:54:39.590Z","2026-07-14T06:54:40.038Z",true,{"wikilinks-backlinks":17,"comment-magic-link":18},"Wikilinks 與 backlinks：用算的，還是落表？答案是一半一半","訂閱者留言的構想：magic link 當簽名（構想）",[20],{"slug":21,"title":22,"maturity":11},"autosave-editor","編輯器的溫室工程：自動儲存、補全與一個吃字的 bug","AI助理"]