不用 CMS 也能經營部落格:把 Markdown 檔案當成資料庫
你現在看到的這篇文章,並不存在於任何資料庫裡。它只是專案資料夾中的一個 .md 檔案,網站建置時被讀進來、轉成 HTML。這個做法簡單到有點陽春,但對個人部落格來說非常夠用。
做法:一個資料夾就是全部
每一篇文章是 content/blog/ 底下的一個 Markdown 檔,檔名就是網址。例如 my-post.md 會變成 /blog/my-post。檔案開頭用一小段 frontmatter 記錄標題、日期、標籤與摘要:
---
title: 文章標題
date: 2026-11-01
tags: 標籤一, 標籤二
summary: 顯示在文章列表上的一句話。
---
Vite 提供的 import.meta.glob 可以在建置時一次把整個資料夾的檔案讀進來。我再用一個很小的函式解析 frontmatter:把開頭兩條 --- 之間的每一行,用第一個冒號切成「鍵」與「值」。不需要額外的套件,幾十行程式碼就搞定。
內文則交給 marked 轉成 HTML。依日期排序之後,文章列表、單篇文章、標籤,全部都是從這份陣列衍生出來的。
自己擴充的一小段語法
部落格偶爾需要嵌入內容,例如一則 Threads 貼文或一個連結卡片。我在 Markdown 之上加了一條規則:獨立一行寫成 ::embed[網址],就會被辨識成嵌入區塊。
處理方式是先逐行掃描內文,碰到這種行就把前面累積的 Markdown 先轉成 HTML,再插入一個「嵌入」區塊,之後繼續累積。要注意的是程式碼區塊裡的同樣文字不能被誤判,所以掃描時要追蹤目前是否在 ``` 的圍欄之內。
好處
- 沒有後台要維護,也沒有帳號密碼可以被盜。 寫文章就是改檔案,發布就是 push。
- 有版本控制。 每一次修改都有紀錄,寫壞了可以回復。
- 可以離線寫。 任何文字編輯器都行。
- 跟網站一起部署。 文章與程式碼是同一個專案,不會出現「資料庫與前端版本對不上」的問題。
安全上要記得的一件事
文章的 HTML 是用 dangerouslySetInnerHTML 插入的。這個名字就是在提醒你它危險:如果內容來自不可信的來源,就可能被塞進惡意腳本。我能接受它,唯一的原因是文章都是我自己寫、自己 commit 進專案的。如果你的部落格要開放別人投稿,就不能這樣做,必須先過濾 HTML。
限制
Markdown 檔案當資料庫,不適合需要大量寫入、多人編輯或即時發布的場合。沒有草稿預覽的後台,要預覽就得在本機跑開發伺服器。對一個人寫、一週一兩篇的節奏來說,這些都不是問題。
選工具的時候,我習慣先問:「我真的需要它的所有功能嗎?」很多時候,答案是一個資料夾加幾十行程式碼,就夠了。