Skip to content

module 模块是 NestJS 应用程序的基本构建块。

每个 NestJS 应用程序至少有一个模块,即根模块。

module 模块是一个用 @Module() 装饰器注解的类。

module 模块最佳实践应该遵循以下标准:

  1. 单一职责:每个模块应该只负责一个特定的功能领域
  2. 模块封装:只导出需要被其他模块使用的提供者
  3. 避免循环依赖:模块之间应该避免循环依赖
  4. 使用动态模块:当需要配置模块时,使用动态模块模式

1.模块的基本结构

typescript
@Module({
  imports: [],      // 导入其他模块
  controllers: [],  // 控制器
  providers: [],    // 服务提供者
  exports: []       // 导出给其他模块使用的提供者
})
export class AppModule {}

2.模块的主要功能

  1. 组织代码结构:将相关的功能组织在一起
  2. 封装:模块内的提供者默认是私有的
  3. 依赖注入:管理依赖关系
  4. 代码复用:通过导入导出实现模块间的代码共享

3.模块类型

3-1. 功能模块

用于组织特定功能的代码,例如用户模块、认证模块等。

typescript
@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService]
})
export class UsersModule {}

3-2. 共享模块

包含可重用的功能,可以被其他模块导入使用。

typescript
@Module({
  providers: [CommonService],
  exports: [CommonService]
})
export class CommonModule {}

3-3. 全局模块

使用 @Global() 装饰器,使模块中的提供者在整个应用程序中可用。

typescript
@Global()
@Module({
  providers: [ConfigService],
  exports: [ConfigService]
})
export class ConfigModule {}

4.动态模块

动态模块允许在导入时配置模块的行为:

typescript
@Module({})
export class ConfigModule {
  static register(options: ConfigOptions): DynamicModule {
    return {
      module: ConfigModule,
      providers: [
        {
          provide: 'CONFIG_OPTIONS',
          useValue: options,
        },
        ConfigService,
      ],
      exports: [ConfigService],
    };
  }
}

5.模块生命周期

NestJS 模块支持以下生命周期钩子:

  • onModuleInit(): 模块初始化时调用
  • onModuleDestroy(): 模块销毁时调用
typescript
@Module({})
export class AppModule implements OnModuleInit, OnModuleDestroy {
  onModuleInit() {
    console.log('模块初始化');
  }

  onModuleDestroy() {
    console.log('模块销毁');
  }
}

6.模块通信

module 模块之间可以通过以下方式通信:

  1. 导入/导出:通过模块的导入和导出机制
  2. 事件:使用事件发射器
  3. 共享服务:通过共享模块提供服务