為什麼要產生 Vue 程式碼,而不只產生型別
搜尋「openapi to typescript」,第一頁是一整排 CLI 與單檔轉換器:openapi-typescript、orval,以及幾個只做到型別就停住的瀏覽器工具。改搜「openapi to vue component」,得到的卻是官方文件、GitHub 樣板、一個 VS Code 擴充功能,以及一個已封存的倉庫——沒有任何能在分頁裡直接打開的工具。這個落差就是這個頁面存在的原因。
只有型別並不會生出畫面。Vue 專案裡真正花時間的是上面那一層:把路徑與查詢參數接好的 fetch 呼叫、追蹤 loading 與 error 狀態的 composable,以及與 schema 對得上的表格或表單。所以這個產生器一次把這些全部產出:
- 撐得住真實規格的型別。 本地 $ref 會被解析,allOf 變成交集、oneOf/anyOf 變成聯合、enum 變成字面量聯合、nullable 變成 | null、additionalProperties 變成 Record<string, T>;處理不了的寫法會以警告列出,而不是悄悄變成 any。
- 零執行期依賴的客戶端。 每個操作一個函式,建構在 fetch 之上:路徑參數會 URI 編碼、查詢參數會收集、自訂 header 會合併,而且可以透過 ApiOptions 換掉 baseUrl 與 fetch,方便攔截或 mock。
- 產出 composable,不只是函式。 每個操作同時得到一個 useXxx() composable,提供 data、error、loading 與 run()——這才是 Vue 元件真正要用的形狀,而且不需要引入 store。
- 與 schema 對得上的元件。 集合端點會產生表格,預設欄位直接來自項目 schema;請求主體會產生表單,輸入型別對應正確、enum 用 select,送出時的 payload 也有型別。
所有事情都在你的分頁裡完成:規格解析、$ref 解析與檔案組裝都在本機進行,因此不上傳、也不會產生分享連結。這件事比聽起來重要——OpenAPI 文件往往是某個 API 現存最完整的描述,甚至包含還沒上線的端點。請把產出當成起點而不是完成品:先審閱、再把元件接到你的 router 或 store,並讓規格繼續當唯一事實來源。