Sunrabbit

即使是 Node.js 初學者也能建立的框架級 DI

  • 撰写语言: 韓国語
  • 基准国家: 所有国家country-flag
  • 信息技术

撰写: 2024-11-08

撰写: 2024-11-08 14:02

使用 Node.js 開發伺服器時,經常會受到許多 Spring 的誘惑。

因為它結構化、系統化,而且不容易隨意修改。


因此,在 Node.js 社群中誕生了 Nest.js 這個框架。

至少想以像 Spring 一樣結構化的形式進行伺服器開發,這是許多人的願望。


但是 Spring 的 DI 利用執行時的反射機制,在語言層級上支援 DI。

Dotnet 也一樣,基於屬性追蹤,使用反射來執行 DI。


那麼 Nest.js 是如何執行 DI 呢?

Spring 和 Dotnet 的基礎語言是編譯型語言,因此在語言層級上支援反射,但是

ecma script 只是…一種直譯型語言,不是嗎?


以下是 Nest.js 教程中的其中一個範例。


顯然,這樣用 TypeScript 編寫的程式碼編譯後,類型標籤就會消失,因為它無法從類別中得知建構函式所需的參數類型。


解決方案在於語言規格。

Reflect

幸運的是,在語言層級上,有一個功能可以將中繼資料新增到每個物件中。

即使是 Node.js 初學者也能建立的框架級 DI


這只是一個簡單的函式,用於新增和取得物件的中繼資料。


因此,TypeScript 考慮到…

那麼,在編譯類別時,是否將類型資訊新增到中繼資料中?


因此,TypeScript 在使用類別裝飾器的地方,將該類別建構函式所需的參數資訊儲存到 Reflect 中。

即使是 Node.js 初學者也能建立的框架級 DI

這並沒有用到任何轉換或黑魔法,純粹是 TypeScript 編譯器的功能。


這樣,如果建構函式所需的參數類型儲存在類別的中繼資料中,

我們就可以取得類別並得知其類型,然後直接使用它。


雖然可以參考 NestJS 的實作,但因為太過冗長,我推薦另一個函式庫。


這個函式庫是由微軟開發的,程式碼相當乾淨。

推薦大家參考看看,就這樣結束這篇文章。

评论0