了解Node.js Nestjs框架的模块机制

1. 什么是Nestjs框架

Nestjs是一个基于Node.js的Web应用框架,它采用了现代化的架构概念和设计原则,帮助我们构建可扩展的应用程序和微服务。Nestjs使用了面向对象的方式来开发应用程序,它的底层是基于Express和Socket.io等框架的,这使得Nestjs拥有快速、健壮和可靠的特性。

2. Nestjs中的模块机制

在Nestjs中,我们可以通过模块的方式来组织应用程序。模块是应用中可重用的代码块,它可以包含控制器、提供者和其他相关内容,从而使应用程序的开发变得更加模块化,易于维护和扩展。

2.1 模块的创建

要创建一个新的模块,我们可以使用Nestjs提供的CLI命令npx @nestjs/cli generate module,这个命令可以帮助我们快速创建一个新的空模块。命令的输出结果如下所示:

src

└── app

├── app.controller.ts

├── app.module.ts

├── app.service.ts

└── main.ts

同时,我们也可以手动创建一个新的模块,只需要创建一个新的类,并用@Module()装饰器将其标记为模块即可:

import { Module } from '@nestjs/common';

@Module({})

export class AppModule {}

2.2 模块的导出

除了包含自己的提供者和控制器,一个模块还可以将其他模块的提供者和控制器导入进来,这些导入的模块可以在当前模块中被使用。同时,一个模块还可以将自己的提供者和控制器导出给其他模块使用。

我们可以使用@Module()装饰器的imports属性来导入其他模块:

import { Module } from '@nestjs/common';

import { CatsModule } from './cats/cats.module';

@Module({

imports: [CatsModule],

})

export class AppModule {}

上面的代码中,我们将CatsModule导入到了当前的AppModule中。

我们也可以使用@Module()装饰器的exports属性来导出本模块的提供者和控制器,这样其他模块就可以使用这些提供者和控制器。示例代码如下:

import { Module } from '@nestjs/common';

import { CatsController } from './cats/cats.controller';

import { CatsService } from './cats/cats.service';

@Module({

controllers: [CatsController],

providers: [CatsService],

exports: [CatsService],

})

export class CatsModule {}

上面的代码中,我们将CatsService导出给了其他模块使用。

2.3 模块中的提供者

提供者是Nestjs中一个非常重要的概念,它们可以被注入到控制器、服务和其他提供者中,以实现代码的复用和模块化。模块中的提供者可以是常规类、工厂、别名等。

Nestjs中一共提供了6种类型的提供者:

常规类:普通的ES6/ES7类

工厂:通过工厂方法动态创建实例

异步工厂:通过异步方式动态创建实例

值:常量或配置数据

别名:为依赖注入的tokens提供别名

动态模块提供者:在应用程序运行时动态创建提供者

在一个模块中,我们可以使用@Injectable()装饰器来声明一个类为提供者,同时还可以使用@Inject()装饰器来获取提供者。

import { Injectable } from '@nestjs/common';

@Injectable()

export class CatsService {}

在上面的代码中,我们声明了一个CatsService类为提供者。

同时,我们也可以用@Inject()装饰器将CatsService注入到其他类中:

import { CatsService } from './cats.service';

import { Injectable } from '@nestjs/common';

@Injectable()

export class CatsController {

constructor(private readonly catsService: CatsService) {}

}

2.4 模块的生命周期

Nestjs中的每个模块都有自己的生命周期,我们可以在装饰器的参数中使用providerscontrollersexports属性来定义一个模块的提供者、控制器和导出项。

每个模块的生命周期由以下4个阶段组成:

OnModuleInit:在当前模块中所有的提供者和控制器初始化完成后触发

OnModuleDestroy:在当前模块被销毁之前触发

OnApplicationBootstrap:在整个应用启动之前触发

OnApplicationShutdown:在整个应用退出之前触发

我们可以使用@Module()装饰器的providers属性来定义当前模块的提供者,例如下面的代码:

@Module({

providers: [CatsService],

})

export class CatsModule {}

在上面的代码中,我们将CatsService声明为了当前模块的提供者,并在模块的生命周期中对其进行了控制。

2.5 模块的动态导入

除了在静态模块中导入其他模块之外,我们还可以在应用程序运行时通过动态导入的方式将一个模块导入到其他模块中。动态导入的模块可能会通过本地或者远程的方式进行加载。

Nestjs提供了ModuleRef类作为动态导入的入口,我们可以使用ModuleRef类的import方法来在运行时动态导入一个模块,例如下面的代码:

import { ModuleRef } from '@nestjs/core';

import { Module } from '@nestjs/common';

@Module({})

export class AppModule {

constructor(private readonly moduleRef: ModuleRef) {}

async onModuleInit() {

const { CatsModule } = await import('./cats/cats.module');

this.moduleRef.register(CatsModule);

}

}

在上面的代码中,我们在应用程序初始化完成之后动态导入了CatsModule模块。

3. 结语

Nestjs是一个非常强大的Node.js应用框架,它采用了现代化的架构概念和设计原则,极大地简化了Web应用程序的开发流程。在Nestjs中,模块机制是非常重要的概念之一,它可以将应用程序中的代码块组织成为模块,从而使应用程序的开发变得更加模块化、易于维护和扩展。希望本文能够对你了解Node.js Nestjs框架的模块机制有所帮助。