NgModules

Back

Loading concept...

NgModules: The Magical Containers of Angular

🏠 The Big Idea: Think of a Toy Box

Imagine you have a big toy box. Inside it, you put all your toys—cars, dolls, blocks, puzzles. When you want to play, you open the toy box and everything you need is right there!

NgModules in Angular are just like that toy box. They hold all the pieces of your app—components, services, and other goodies—so Angular knows where to find them.

Simple Truth: NgModules are containers that organize your Angular app into neat, manageable pieces.


🎯 What is an NgModule?

An NgModule is a special class with a @NgModule decorator. It tells Angular:

  • What parts belong together (declarations)
  • What other toy boxes we need (imports)
  • What we share with others (exports)
  • What helpers are available (providers)

The Toy Box Code

@NgModule({
  declarations: [
    MyComponent
  ],
  imports: [
    CommonModule
  ],
  exports: [
    MyComponent
  ],
  providers: [
    MyService
  ]
})
export class MyModule { }

What each part means:

Part Like… Does What?
declarations Toys in your box Components, directives, pipes that belong here
imports Borrowed toy boxes Other modules you need
exports Toys you share What others can use from your module
providers Helper friends Services available in this module

🧩 NgModules Legacy: The Original Way

Before Angular introduced standalone components, NgModules were the only way to organize your app. Every component HAD to belong to a module.

Why “Legacy”?

Angular now has standalone components that don’t need modules. But millions of apps still use NgModules, and they work perfectly fine!

Think of it like this: Old cars still run great, even if new cars have different engines.

graph TD A["Your App"] --> B["AppModule"] B --> C["Feature Modules"] B --> D["Shared Modules"] C --> E["Components"] D --> F["Reusable Pieces"]

📦 Feature Modules: Rooms in Your House

Imagine your house has different rooms—kitchen, bedroom, playroom. Each room has its own stuff!

Feature Modules are like rooms. They group related features together.

Example: A Shopping App

🏠 Your App
├── 🛒 CartModule (cart features)
├── 👤 UserModule (user features)
└── 📦 ProductModule (product features)

Creating a Feature Module

@NgModule({
  declarations: [
    ProductListComponent,
    ProductDetailComponent
  ],
  imports: [
    CommonModule,
    RouterModule
  ],
  exports: [
    ProductListComponent
  ]
})
export class ProductModule { }

Why Use Feature Modules?

Benefit What It Means
Organization Keep related code together
Team Work Different teams work on different modules
Lazy Loading Load only what you need (more on this later!)

🎁 Shared Modules: The Lending Library

You know how libraries let everyone borrow books? Shared Modules let all parts of your app borrow common pieces!

What Goes in a Shared Module?

Things you use everywhere:

  • Common components (buttons, cards, headers)
  • Common directives (highlight, tooltip)
  • Common pipes (date formatting, text transforms)

The Shared Module Pattern

@NgModule({
  declarations: [
    ButtonComponent,
    CardComponent,
    HighlightDirective
  ],
  imports: [
    CommonModule
  ],
  exports: [
    // Share everything!
    ButtonComponent,
    CardComponent,
    HighlightDirective,
    CommonModule
  ]
})
export class SharedModule { }

Using Your Shared Module

Any feature module can now import it:

@NgModule({
  imports: [
    SharedModule  // Get all shared goodies!
  ]
})
export class CartModule { }

Pro Tip: Don’t put services in SharedModule. Services should usually be in the root or feature modules.


🚀 Lazy Loading Modules: Only Carry What You Need

Imagine going on a hike. Do you carry everything from your house? No! You carry only what you need right now.

Lazy Loading works the same way. Instead of loading your entire app at once, Angular loads modules only when needed.

How It Works

graph LR A["User Opens App"] --> B["Load AppModule Only"] B --> C{User Clicks Cart?} C -->|Yes| D["Now Load CartModule"] C -->|No| E["Cart Never Loads"]

Setting Up Lazy Loading

Step 1: Create a feature module with routing

// cart.module.ts
@NgModule({
  declarations: [CartComponent],
  imports: [
    RouterModule.forChild([
      { path: '', component: CartComponent }
    ])
  ]
})
export class CartModule { }

Step 2: Use loadChildren in your main routes

// app-routing.module.ts
const routes: Routes = [
  {
    path: 'cart',
    loadChildren: () =>
      import('./cart/cart.module')
        .then(m => m.CartModule)
  }
];

The Magic Behind Lazy Loading

Without Lazy Loading With Lazy Loading
Load everything at start Load only what’s needed
Slower initial load Faster initial load
More memory used Less memory used
😴 Users wait longer ⚡ Users see app faster

When to Lazy Load?

  • Big features that not everyone uses
  • Admin sections only admins see
  • Settings pages rarely visited

🗺️ Putting It All Together

Here’s how these modules work in a real app:

graph TD A["AppModule"] --> B["CoreModule"] A --> C["SharedModule"] A --> D["Feature Modules"] D --> E["ProductModule"] D --> F["CartModule - Lazy"] D --> G["UserModule - Lazy"] E --> C F --> C G --> C

The Module Family

Module Type When to Use Loaded When?
AppModule Root of your app Immediately
CoreModule Services used once Immediately
SharedModule Reusable UI pieces With whoever imports it
Feature Module Group related features Immediately or lazy
Lazy Module Big features Only when needed

💡 Quick Summary

  1. NgModules = Containers that organize your Angular app
  2. Feature Modules = Group related features (like rooms in a house)
  3. Shared Modules = Common pieces everyone can use (like a library)
  4. Lazy Loading = Load modules only when needed (pack light!)

🎯 Remember This!

“NgModules are like LEGO boxes. Each box has pieces that work together. Some boxes you open right away (eager). Some boxes you only open when you need them (lazy). And some boxes have pieces everyone shares (shared)!”


✨ You’ve Got This!

NgModules might seem complex at first, but they’re just a way to keep your app organized and fast.

  • Start with the AppModule
  • Create Feature Modules for big areas
  • Make a Shared Module for common pieces
  • Use Lazy Loading for features not everyone needs

Now go build something amazing! 🚀

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.