Module 模块
在 NestJS 中,有一套自己的模块系统。这些模块都被 Module
装饰器进行修饰。
这些模块直接相互依赖。 NestJS 中包含一个 根
模块,相当于入口模块,模块依赖之间形成了模块树。组成 NestJS 的应用。这一点其实就类似 中央集权制度
,地方设置 郡县制度
的秦朝
制度一样。事件万物好想都是一样的,只是形式上发生了改变。
@Moudule
装饰器
我们知道装饰可以是函数,也可以是类,因为NestJS 的 module 是要传递参数的所以,这里是可以函数。这个函数接收的参数,就是维系 NestJS 的模块的。
- providers
- controllers
- imports 引入模块
- exports 导出模块
Module 的分类
- 功能模块
- 共享模块
- 全局模块
- 动态模块
功能模块
NestJS 是使用类和装饰器的开发的框架,实现了切面编程 AOP
, 一个切面就完成一个功能,比如 Controller
层,就完成路由路由的控制层。Service
就完成一个数据的支持层。
这样组织代码使得代码的结构,非常的清新,便于维护。前端 React 组件化的拆分,使用 Redux 为思想的时候,容器组件和UI是分开的类似。这也符合软件开发过程的中的单一职责原则。
共享模块
模块具有共享的能力是非常重要的,共享问题就来,是类的同一个实例吗?如果不是同一实例那就没有意义了。NestJS 中模块是单例的,也就是不管怎么共享其实访问的都是同一个实例。
模块的共享本质:模块的 exports 和 imports 的依赖项目,可以直接通过模块的引入被访问到,而不需要将其再次引入,这样就解决了模块依赖项目的访问的问题。
模块循环依赖
循环依赖是不可绕开的问题,在 NestJS 中,Module 本身是不能作为依赖注入到程序的。
全局模块
全局对象,我们应该很常见,类似于浏览器的 window 对象,nodejs 的 process/global 对象。NestJS 中也有自己的全局模块 global module,使用 @Global()
修饰。
动态模块
要搞明白动态模块,我们就必须知道与之对应的静态模块。静态模块不能解决哪些问题。动态模块是如何解决静态模块的问题的。