整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ
用 <spec lang="md"> 標籤在 Vue 中舒服的使用 SFC 搭配 AI 開發
前言
許多開發者都會搭配著 AI 工具(Claude Code、Gemini、Copilot 等)來協助撰寫程式碼,而在 Vue 的單檔元件(Single File Component, SFC)中,常常會遇到一些困擾,所以這邊就來分享一個不同的做法,也就是自訂一個 <spec lang="md"> 標籤,來讓我們能夠在 SFC 中更舒服地使用 AI 工具來開發。
AI 開發模式
現在使用 AI 開發的模式基本上有這幾種:
- SDD(Specification Driven Development,規格驅動開發):先撰寫規格文件,然後讓 AI 根據規格文件來產生程式碼。
- BDD(Behavior Driven Development,行為驅動開發):先撰寫行為描述,然後讓 AI 根據行為描述來產生程式碼。
- TDD(Test Driven Development,測試驅動開發):先撰寫測試案例,然後讓 AI 根據測試案例來產生程式碼。
其中 SDD 是最多人使用的模式,只要可以把規格描述清楚,那麼 AI 就能夠幫助我們產生出符合需求的程式碼,但這邊我們深入探討怎麼使用跟寫 SDD。
但問題來了,什麼叫做 「把規格描述清楚」 呢?
我認為這件事情很有趣,我們光描述自己的問題就有一定的難度,更不用說 AI 只會依照我們講的內容、資訊去產出程式碼了,更不用說沒有一個標準可以去衡量我們的描述是否足夠清楚、應該要包含哪些內容。
通常我們再請 AI 開始撰寫程式碼之前,都會請它先初步的專案分析,並產生一個專案規格文件,下一次我們開啟專案請 AI 撰寫程式碼時,就可以直接把這份規格文件貼給 AI,讓它根據這份文件來撰寫程式碼。
所以就有可能會變成有這些文件:
- *.spec.md:專案規格文件
- *.test.md:測試案例文件
- *.guide.md:開發指南文件
- *.task.md:任務清單文件
- README.md:專案說明文件
…
等等之類的文件,其中可能還會把程式碼拆出來說明。
可想而知,開發文件會越來越多,而且我們還要不斷的更新這些文件,為了讓它們能夠跟程式碼/需求保持一致。
雖然你可能會認為「反正這些文件都是給 AI 用的,沒關係啦」,但事實上這些文件也會影響到我們開發的效率,因為我們也需要花時間去維護這些文件,你不可能不看這些文件就直接請 AI 幫你寫程式碼。
更不用說,AI 的 Context Window(上下文視窗)是有限的。
在 Vue SFC 中使用 <spec lang="md">
Vue 的 SFC 中,我們知道有 <template>、<script>、<style> 等標籤來分別撰寫模板、邏輯和樣式,但其實 Vue 也支援自訂區塊(Custom Blocks),我們可以利用這個特性來加入我們的規格文件,導入之後類似於這樣:
1 | |


那該怎麼做到這件事情呢?其實官方文件中有提到自訂區塊的使用方式,可以參考這篇文章:SFC Custom Block Integrations。
其中文章中,就有舉例 i18n 的自訂區塊:
1 | |
接著你只要這樣就可以使用
1 | |
基於這個特性,我們只需要將 Vite 插件稍微修改一下,就可以支援我們的 <spec lang="md"> 標籤了,底下提供了兩個版本的範例,一個是純 Vite 版本,另一個是 Nuxt 版本。
Vite 版本如下:
1 | |
而 Nuxt 版本如下:
1 | |
這樣你就可以在 Vue SFC 中使用 <spec lang="md"> 區塊來撰寫規格跟需求。
那這樣有哪些好處呢?我認為有以下:
- 集中管理:規格文件直接寫在元件檔案中,方便查看與維護,每個元件都有自己的規格,方便團隊協作與溝通。
- 上下文一致:AI 在生成程式碼時,可以直接參考元件內的規格,減少誤解。
- 減少文件數量:不需要額外維護多個規格文件,減少混亂。
但要注意這個方式只限於 .vue 檔案,如果是純 js/ts 檔案就無法使用這個方式,反而會推薦你用 JSDoc or TypeScript 的型別定義來描述會比較好。
最後這邊也提供範例程式碼給你,你可以試著玩看看:
參考文獻
整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ