美文网首页
NestJS中使用DynamicModule实现模块动态加载

NestJS中使用DynamicModule实现模块动态加载

作者: kongxx | 来源:发表于2024-12-21 19:52 被阅读0次

1. 介绍

在NestJS中,模块是组织代码的基本单元,它将相关的服务和控制器组织在一起。然而,在某些情况下,我们可能需要根据不同的条件动态加载模块,以满足不同的业务需求。这时,就可以使用DynamicModule了。

DynamicModule是NestJS提供的一种动态加载模块的方式,它允许我们在运行时动态地加载模块,看下面的例子。

2. 首先创建一个模块,比如这里的 config service和module

config.service.ts

import { Injectable, Inject } from '@nestjs/common';
import * as fs from 'fs';

@Injectable()
export class ConfigService {
  constructor(@Inject('CONFIG_OPTIONS') private options: any) {
    // TODO load config from options
    console.log('load config from ', options.folder);
  }

  get(key: string): string {
    // TODO get config
    console.log('get config value ...');
    return 'hello world';
  }
}

config.module.ts

import { DynamicModule, Module } from '@nestjs/common';
import { ConfigService } from './config.service';

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

3. 在主模块中导入动态模块

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from './plugins/config/config.module';
import * as path from 'path';

@Module({
  imports: [ConfigModule.register({ folder: './config' })],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • 作为例子这里传递一个配置项 folder,在config.service.ts中会用到。

4. 在控制器中使用动态模块服务

app.controller.ts

import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
import { ConfigService } from './plugins/config/config.service';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Inject(ConfigService)
    private readonly configService: ConfigService,
  ) {}

  @Get()
  async getHello() {
    console.log(this.configService.get('key'));

    return this.appService.getHello();
  }
}

相关文章

  • 阿里Weex 实现页面跳转

    使用Weex navigator模块 second.vue Three.vue 从网络端加载js文件,实现动态更新...

  • single-spa 微前端项目引入dva

    使用systemjs动态模块加载时,报错 Uncaught main: Application 'main' di...

  • js静态打包动态化插件

    动态插件 非模块化的js可以通过 标签来加载,可以简单实现动态化插件。在使用js静态打包工具后,所有依赖都在打包期...

  • Android插件化原理解析

    概述 Android插件化技术,可以实现功能模块的按需加载和动态更新,其本质是动态加载未安装的apk。 本文涉及源...

  • Android 插件化、热修复、增量更新介绍

    一、插件化 概述:Android插件化技术,可以实现功能模块的按需加载和动态更新,其本质是动态加载未安装的apk。...

  • Android插件化之Hook Activity

    插件化:Android插件化技术,可以实现功能模块的按需加载和动态更新(从服务器上下载),其本质是动态加载未安装的...

  • 如何动态加载js?

    如何动态加载js?如何使用js实现多个html页面访问同一个常量?如何不使用框架,只有Html时,动态加载文件? ...

  • Nginx添加第三方模块

    由于原生的nginx功能太少,有时候为了实现某些功能,则需要安装第三方模块来实现,但是nginx不支持动态加载模块...

  • 6.动态加载

    对动态库的加载分为自动加载和动态加载两种1.1 动态加载:程序的执行期间,需要使用到某个动态库中的文件的时候,可以...

  • JavaScript动态加载js和css

    动态加载js 参考:javascript 性能优化 动态加载css 参考: 动态加载 css 方法实现和深入解析 ...

网友评论

      本文标题:NestJS中使用DynamicModule实现模块动态加载

      本文链接:https://www.haomeiwen.com/subject/ntfyejtx.html