本人是一名 Node.js 實習生,在進入大搜車以後,有幸見識到 Akyuu.js 這個框架。可是這個框架是使用 Express + Callback 的方式,我不是很喜歡。在個人推薦以及社區的發展下,組長決定用 TS + Async/Await 來試一試。因而我也去了解了一下 TS 的後端框架有哪些,結果通過別人推薦,找到了 Nest.js 這個想法幾乎和我如出一轍的框架。node
由於我這個不是教程向,因此就不細講,能夠查看 Nest.js 官網。從個人感性角度來說,簡單說一下如下幾個特色:數據庫
resp.send(await getValue())
,而 koa 也是須要調用 ctx.body = await getValue()
。可是在 Nest.js 中,只須要 return await getValue()
便可。實現真正的同步編寫業務邏輯代碼。@nestjs/cli
,可是這個提供的僅僅是一個項目的建立的能力。不過總的來講,前面幾點也正是 Nest.js 靈活性的保證。可是咱們真正在開發當中,仍是須要一種合理的約束來保證開發的統一。後端
那麼咱們這裏針對上面的幾個問題,嘗試採用一些方式來進行約束。bash
咱們對項目指定以下的規則:框架
src
目錄下main.ts
若是沒有特殊狀況,不動這個文件src/config
文件夾下MainModule
下。module
文件夾存放自定義的 Module,或者說但願獨立成模塊可是尚未徹底獨立出來的。其中目錄結構和這個項目目錄結構相似boot
文件夾是項目啓動代碼的時候執行的,這部分在 Nest.js 當中沒有給出。我這裏打算添加這個功能,可是尚未想好具體的實現形式,因此待定。interface
/enum
等數據隨着對應的 service 導出。不另作說明。好比說 car.service.ts
除了能夠導出 CarService
類之外,還能夠導出 CarType
enum。dest
文件夾是編譯以後的文件,能夠直接輸入 node dest/main.js
運行。user.model.ts
car.controller.ts
google.logic.ts
。可是好比說只是一個 Car
類,那麼能夠直接命名成 car.ts
export default
導出數據。一方面是爲了方便導入的時候保證命名的統一,另外一方面能夠隨時導出 interface/enum 等內容。.spec.ts
或 .test.ts
結尾。|-- dest
|--- ...
|-- src
|-- config
|-- controller
|-- model
|-- service
|-- logic
|-- component
|-- boot
|-- module
|-- module-name
|-- config
|-- index.ts
|-- module-name.module.ts
|-- main.ts
|-- main.module.ts
複製代碼
我目前初步的想法是經過提供一個 ConfigModule
暴露出一個 ConfigService
來提供配置的獲取和查看。koa
在某些狀況下,可能須要多級配置,模塊級別的配置,應用級別的配置。那麼 ConfigService
能夠在獲取配置的時候自動合併這些規則。async
如今已是 18 年了,不用 Docker 你真的對得起本身麼?很明顯是對不起的。因此進程管理這一塊,咱們就交給 Docker 來處理。包括啓動、中止、重啓、日誌等,都交給 Docker。工具
因而啓動命令就能夠簡化成 node dest/main.js
便可。單元測試
那麼你可能會想到,若是一個 Docker 環境給你分配了兩個 u,那豈不是會浪費一個 u。理論上是的,那麼你就能夠經過 pm2 啊啥的本身去管理吧,哈哈哈,無論。學習
說了這麼多,把上面的內容都沉澱下來,我得要給他取個名字,因而我就取成了 Iron。爲啥叫 Iron 呢?由於 Iron Man。那爲啥由於 Iron Man 呢?由於他製做的盔甲能夠自由拆分,自動拼合。很是適合咱們這個項目的形態。
不過這個項目何時能沉澱下來,看我心情了。不過定個時間線吧,就在 4 月底,爭取搞定。
由於這裏面最大的問題就是配置的問題,須要深刻依賴注入,因此會麻煩一些。可是其餘的方面更多的只是一種約束吧。
這就是我用 Nest.js 一週以來的心得。暫時就想到這麼多,更多的內容等我後面再分析吧。
寫完睡覺,答應女票了,啦啦啦~