Skip to content

自動產生業務代碼 — code-gen

Posted on:August 14, 2021

公司專案中,經常需要重複建立一些檔案,如:

以上三點都是件很繁瑣的事,一個地方忘了改,會發現功能怎不如預期,例如忘了在 rootEpic 加上新的 epic。

而 RD 最討厭麻煩了,何不自動化?

初代 code-gen

強者我同事,利用 nodejs 讀寫檔來做到檔案創建的功能,API response 的 type 則利用 quicktype 來產生,之後再利用 commander.js,可以輕鬆的拿到指令中的參數,最後將執行寫進 package script 中,執行時大概會長這樣:

$ yarn gen-api -r get -n CardContent

-r 是 REST 的 method,-n 是名稱

以這個 gen-api來說,最後會產生 getCardContent 的 epic、reducer、action、type、mock.json 的檔案與他們的測試。
之後再對產生出來的檔案內容做微調就可以用了,例如 action payload。

之後依照這樣的思路,共有 gen-apigen-pagegen-svg 三個指令。

一開始不得不說,還真挺好用的,但使用一段時間後,開始覺得有些缺點:

二代 code-gen

基於這些缺點,我開始去想,若要解決這些問題,大概要像一些 cli,會在執行他的指令後,開始與你互動

以 code-gen 這指令,執行下去後,步驟大概會這樣:

  1. 請問你要產生什麼 (api / svg / page) ?
  2. 檔案名稱?
  3. 若第一點是選 api,那 REST operations 要什麼 (get / post / put / patch / delete) ?

流程都想好了,只差怎麼實現它了

第一個想到的是直接寫 shell,但我不會 shell 怎辦? 還是只能靠 nodejs,
問了同是有無知道的套件可以實現此功能,最後找到了 Inquirer.js,完美實現了我所想到的,真香。

註: Inquirer.js 官方給的範例滿清楚的,很輕鬆的可以找到自己想要的功能。

利用 Inquirer.js 做完上述三點功能,只要替換掉 commander.js,產生檔案的 code 依然能續用,替換成本非常低。

執行下來,效果如下:

一些改進

到後來,覺得有時不一定要產生新的 reducer,可能此 API 資料要存在現有 reducer 中,這樣還得額外刪除 gen 出來的 reducer 有點麻煩。

故在選擇 gen API 的流程中,添加一條詢問是否需要 reducer 的選項,預設為 Yes。

一開始看到強者我同事做的第一代 code-gen,真的覺得超猛的,完全沒想過可以這樣,在還沒有這個 code-gen 前,都是找個需求類似的 reducer、epic 複製一下,但漏掉一些事情也是常有的事,所以這個 code-gen 真的很方便,節省掉 70–80% 的時間。

後來的第二代,一開始真的一度去研究 shell,看不到幾分鐘就放棄了,想說這什麼鬼…
後來關鍵字也下不對,找不到想要的套件。
終於在有天 FE weekly 上,詢問了 team,最後拿到了 Inquirer。

成品看的挺舒服的,團隊也覺得變的越來越好用,DX 提升,開發速度就快了~