了解Node.js Nestjs框架的模塊機制,聊聊實現原理( 四 )

ORM 庫就是利用了反射技術 , 讓使用者只需要關注字段數據本身 , 對象被 ORM 庫反射成為了 SQL 執行語句 , 開發者只需要關注數據字段 , 而不需要去寫 SQL 了 。
4.3 reflect-metadata
reflect-metadata 是一個反射庫 , Nest 用它來管理元數據 。 reflect-metadata 使用 WeakMap , 創建一個全局單實例 , 通過 set 和 get 方法設置和獲取被裝飾對象(類、方法等)的元數據 。
// 隨便看看即可var _WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill(); var Metadata = https://www.52zixue.com/zhanzhang/webqd/js/04/09/69299/new _WeakMap();function defineMetadata(){ OrdinaryDefineOwnMetadata(){ GetOrCreateMetadataMap(){ var targetMetadata = Metadata.get(O); if (IsUndefined(targetMetadata)) { if (!Create) return undefined; targetMetadata = new _Map(); Metadata.set(O, targetMetadata); } var metadataMap = targetMetadata.get(P); if (IsUndefined(metadataMap)) { if (!Create) return undefined; metadataMap = new _Map(); targetMetadata.set(P, metadataMap); } return metadataMap; } }}reflect-metadata 把被裝飾者的元數據存在了全局單例對象中 , 進行統一管理 。 reflect-metadata 并不是實現具體的反射 , 而是提供了一個輔助反射實現的工具庫 。
5 最后現在再來看看前面的幾個疑問 。

    為什么需要控制反轉?
    什么是依賴注入?
    裝飾器做了啥?
    模塊 (@Module) 中的提供者(providers) , 導入(imports)、導出(exports)是什么實現原理?
1 和 2 我想前面已經說清楚了 , 如果還有點模糊 , 建議再回去看一遍并查閱一些其它文章資料 , 通過不同作者的思維來幫助理解知識 。
5.1 問題 [3 4] 總述:
Nest 利用反射技術、實現了控制反轉 , 提供了元編程能力 , 開發者使用 @Module 裝飾器修飾類并定義元數據(providers\imports\exports) , 元數據被存儲在全局對象中(使用 reflect-metadata 庫) 。 程序運行后 , Nest 框架內部的控制程序讀取和注冊模塊樹 , 掃描元數據并實例化類 , 使其成為提供者 , 并根據模塊元數據中的 providers\imports\exports 定義 , 在所有模塊的提供者中尋找當前類的其它依賴類的實例(提供者) , 找到后通過構造函數注入 。
本文概念較多 , 也并沒有做太詳細的解析 , 概念需要時間慢慢理解 , 如果一時理解不透徹 , 也不必太過著急 。 好吧 , 就到這里 , 這篇文章還是花費不少精力 , 喜歡的朋友期望你能一鍵三連~
更多node相關知識 , 請訪問:nodejs 教程!
以上就是了解Node.js Nestjs框架的模塊機制 , 聊聊實現原理的詳細內容 , 更多請關注電腦自學網其它相關文章!
【了解Node.js Nestjs框架的模塊機制,聊聊實現原理】

推薦閱讀