我正在制作一个新的 NestJS 应用程序,在第一个应用程序中出现了很多错误,因为我创建的多个模块没有正确的
imports
、providers
、exports
、TypeOrmModule.forFeature
等让我想知道:重点是什么?
为什么不只使用
app.module
并把所有东西都倒进去呢?所有控制器、服务、实体类型以及任何其他可能出现的内容?
来自文档:
我们想强调的是,强烈推荐模块作为 组织组件的有效方法
这是唯一的原因吗?组织? 依赖注入是否发挥了某种作用?
编辑:
如果组织是主要原因,为什么不将控制器和服务放在不同的文件夹中?基本上是一个没有导入、提供程序等的模块。用更少的样板来做同样的事情。
为什么不只使用 app.module 并转储其中的所有内容?
更好的是,为什么要使用多个文件呢?为什么不只写几千行
index.js
,没有类型,没有组织,只有原始 JS 呢?
答案是?代码组织和易于重用。通过制作这些模块,您应该将相似的逻辑组合在一起。单个功能的所有代码应该只需导入
FeatureModule
即可使用并且可用。当谈到库模块时,这一点变得非常明显:TypeOrmModule
有一个forRoot/forRootAsync
和一个forFeature
,它公开了将存储库注入到您的服务中的方法。 JwtModule
有一个 register/registerAsync
并公开一个 JwtService
,因此您可以配置 JwtService
一次并重新使用提供程序。
在处理实体功能时,这可能看起来更混乱,但从技术上讲,这一切仍然是可能的,因此理论上,您可以从应用程序 A 中获取
FeatureModule
并将其放入应用程序 B 中,并且与应用程序 B 相关的所有内容仍然有效FeatureModule
,类似于 pulumi 具有堆栈和应用程序的想法,您可以使用同一组组件启动新应用程序。
模块系统,在我看来,一旦掌握了它的窍门,就可以很容易地识别所有模块将使用什么,以及其他功能以及它们如何连接。这只是一个纪律和学习框架功能的问题。
NestJS 中的模块受到 Angular 的启发。 而 Angular 由于延迟加载而添加了模块系统:模块:何时以及为何?。这是有道理的,SPA 应用程序因笨重而臭名昭著。
此时,我们需要问一个问题。 NestJS需要延迟加载吗?
答案是否定的。后端应用程序不存在延迟加载之类的东西。也许在世界上,我们可以找到一些后端需要延迟加载的情况,但我什么也想不起来。
是的,你可以将所有内容放入AppModule中。真的。完全不需要多个模块。
而且是的,你是对的,按文件夹组织代码就足够了。