Module re-exporting helps share features from one module to others easily. It avoids repeating imports everywhere.
Module re-exporting in NestJS
import { Module } from '@nestjs/common'; import { SomeModule } from './some.module'; @Module({ imports: [SomeModule], exports: [SomeModule], }) export class SharedModule {}
The imports array brings in the module you want to re-export.
The exports array makes that module available to others importing this module.
UsersModule so other modules can import SharedModule to get UsersModule features.import { Module } from '@nestjs/common'; import { UsersModule } from './users.module'; @Module({ imports: [UsersModule], exports: [UsersModule], }) export class SharedModule {}
CoreModule.import { Module } from '@nestjs/common'; import { UsersModule } from './users.module'; import { AuthModule } from './auth.module'; @Module({ imports: [UsersModule, AuthModule], exports: [UsersModule, AuthModule], }) export class CoreModule {}
SharedConfigModule.import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forRoot()], exports: [ConfigModule], }) export class SharedConfigModule {}
This example shows a LoggerService inside LoggerModule. Then LoggerModule is re-exported by SharedModule. Finally, AppModule imports SharedModule and uses LoggerService in AppController. This way, the logger is shared without importing LoggerModule directly.
import { Module, Injectable } from '@nestjs/common'; @Injectable() export class LoggerService { log(message: string) { console.log('Log:', message); } } @Module({ providers: [LoggerService], exports: [LoggerService], }) export class LoggerModule {} @Module({ imports: [LoggerModule], exports: [LoggerModule], }) export class SharedModule {} import { Controller, Get } from '@nestjs/common'; @Controller() export class AppController { constructor(private logger: LoggerService) {} @Get() getHello(): string { this.logger.log('Hello endpoint called'); return 'Hello World'; } } @Module({ imports: [SharedModule], controllers: [AppController], }) export class AppModule {}
Re-exporting only works if you add the module to both imports and exports.
Use re-exporting to keep your module imports clean and organized.
Remember to export providers or modules you want others to use.
Module re-exporting shares modules easily by importing and exporting them in one place.
It helps keep code organized and reduces repeated imports.
Use it to group common modules or services for easy reuse.
Practice
Solution
Step 1: Understand module re-exporting concept
Module re-exporting allows one module to share its imported modules with other modules by re-exporting them.Step 2: Identify the purpose in NestJS
This helps keep the app organized and makes modules easier to maintain by avoiding repeated imports.Final Answer:
To share modules through another module for better organization -> Option AQuick Check:
Module re-exporting = sharing modules [OK]
- Thinking re-exporting creates new module instances
- Believing it blocks module imports
- Confusing it with automatic service generation
SharedModule inside another module's decorator?Solution
Step 1: Recall NestJS module decorator structure
To re-export a module, it must be both imported and exported in the module decorator.Step 2: Check each option
The syntax with bothimports: [SharedModule]andexports: [SharedModule]is correct. Syntaxes missing either array are incorrect.Final Answer:
@Module({ imports: [SharedModule], exports: [SharedModule] }) -> Option DQuick Check:
Import and export to re-export [OK]
- Only exporting without importing
- Only importing without exporting
- Leaving either array empty when re-exporting
console.log(appModuleImports) if AppModule imports CoreModule which re-exports SharedModule?
@Module({ imports: [SharedModule], exports: [SharedModule] })
export class CoreModule {}
@Module({ imports: [CoreModule] })
export class AppModule {}
Assuming appModuleImports is the list of modules available inside AppModule.Solution
Step 1: Understand re-export effect on imports
CoreModule imports and exports SharedModule, so any module importing CoreModule also gets SharedModule.Step 2: Analyze AppModule imports
AppModule imports CoreModule, so it has access to both CoreModule and SharedModule.Final Answer:
[CoreModule, SharedModule] -> Option BQuick Check:
Re-exported modules appear in importing module imports [OK]
- Assuming only CoreModule is available
- Thinking SharedModule is hidden
- Ignoring exports array effect
@Module({
imports: [SharedModule],
exports: []
})
export class CoreModule {}Solution
Step 1: Check imports and exports arrays
SharedModule is imported but not exported, so CoreModule does not re-export it.Step 2: Understand re-export requirement
To re-export a module, it must be listed in both imports and exports arrays.Final Answer:
SharedModule is imported but not exported, so it is not re-exported -> Option AQuick Check:
Re-export needs both imports and exports [OK]
- Leaving exports empty when re-exporting
- Confusing imports-only as re-export
- Thinking exports array is optional
SharedModule, CoreModule, and FeatureModule. CoreModule imports and re-exports SharedModule. FeatureModule imports CoreModule. How can you modify FeatureModule to also re-export SharedModule without importing it directly?Solution
Step 1: Understand re-export chaining
FeatureModule imports CoreModule, which re-exports SharedModule, so FeatureModule has access to SharedModule.Step 2: Re-export SharedModule via CoreModule
To re-export SharedModule from FeatureModule without importing it directly, FeatureModule must export CoreModule.Final Answer:
Add exports: [CoreModule] in @Module decorator of FeatureModule -> Option CQuick Check:
Export imported module to re-export its exports [OK]
- Trying to export SharedModule without importing it
- Adding SharedModule to providers array
- Importing SharedModule directly instead of re-exporting
Ready to prove it?
Pass the test and this pattern moves unknown
