了解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框架的模块机制,聊聊实现原理】

推荐阅读