module
模块是 NestJS 应用程序的基本构建块。
每个 NestJS
应用程序至少有一个模块,即根模块。
module
模块是一个用 @Module()
装饰器注解的类。
module
模块最佳实践应该遵循以下标准:
- 单一职责:每个模块应该只负责一个特定的功能领域
- 模块封装:只导出需要被其他模块使用的提供者
- 避免循环依赖:模块之间应该避免循环依赖
- 使用动态模块:当需要配置模块时,使用动态模块模式
1.模块的基本结构
typescript
@Module({
imports: [], // 导入其他模块
controllers: [], // 控制器
providers: [], // 服务提供者
exports: [] // 导出给其他模块使用的提供者
})
export class AppModule {}
2.模块的主要功能
- 组织代码结构:将相关的功能组织在一起
- 封装:模块内的提供者默认是私有的
- 依赖注入:管理依赖关系
- 代码复用:通过导入导出实现模块间的代码共享
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
模块之间可以通过以下方式通信:
- 导入/导出:通过模块的导入和导出机制
- 事件:使用事件发射器
- 共享服务:通过共享模块提供服务