A static module has a fixed set of providers defined at declaration time. A dynamic module returns a DynamicModule object from a static method, allowing the caller to pass configuration that determines which providers are created and how they behave at import time. This enables reusable configurable library modules.
Library modules that need to behave differently based on caller configuration.
Modules that wrap third-party SDKs and need connection options at import time.
Any module whose providers depend on runtime values not known at compile time.
Standard examples: TypeOrmModule.forRoot(), JwtModule.register(), ConfigModule.forRoot().