What is RouterModule.forRoot()?
What is it?
RouterModule.forRoot() is used in NgModule-based Angular applications to configure and register the application's main/root routes.
Syntax:
RouterModule.forRoot(routes)
Example:
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'products', component: ProductsComponent }
];
@NgModule({
imports: [
RouterModule.forRoot(routes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
}
The important idea is:
forRoot()
↓
Root-level routing configuration
↓
Creates/configures Router services
↓
Used once in the application
Full Simple Sample Program
home.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-home',
template: `<h2>Home Page</h2>`
})
export class HomeComponent {
}
products.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-products',
template: `<h2>Products Page</h2>`
})
export class ProductsComponent {
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home.component';
import { ProductsComponent } from './products.component';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'products', component: ProductsComponent }
];
@NgModule({
imports: [
RouterModule.forRoot(routes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { HomeComponent } from './home.component';
import { ProductsComponent } from './products.component';
import { AppRoutingModule } from './app-routing.module';
@NgModule({
declarations: [
AppComponent,
HomeComponent,
ProductsComponent
],
imports: [
BrowserModule,
AppRoutingModule
],
bootstrap: [
AppComponent
]
})
export class AppModule {
}
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<nav>
<a routerLink="/">Home</a> |
<a routerLink="/products">Products</a>
</nav>
<router-outlet></router-outlet>
`
})
export class AppComponent {
}
Explanation
The important line is:
RouterModule.forRoot(routes)
It does two important things:
- Registers the application's root route configuration.
- Sets up the Router-related providers needed for routing.
For example:
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'products', component: ProductsComponent }
];
Angular understands:
/ → HomeComponent
/products → ProductsComponent
Why is it called forRoot()?
Because it is intended for the root routing configuration of the application.
Normally:
AppRoutingModule
↓
RouterModule.forRoot(routes)
↓
Application-level Router
How many times?
Normally once in an NgModule-based application.
You should not configure every feature module using:
RouterModule.forRoot(...)
Feature routing modules use forChild() instead.
2. What is RouterModule.forChild()?
What is it?
RouterModule.forChild() is used to register additional routes belonging to a feature module.
Syntax:
RouterModule.forChild(routes)
For example, imagine the application contains a Product feature:
Application
│
├── Home
├── About
│
└── Products
├── Product List
└── Product Details
The main routing configuration can use:
RouterModule.forRoot(...)
while the Product feature routing uses:
RouterModule.forChild(...)
Full Simple Sample Program
Suppose we have a Product feature module.
product-list.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-product-list',
template: `
<h2>Product List</h2>
`
})
export class ProductListComponent {
}
product-details.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-product-details',
template: `
<h2>Product Details</h2>
`
})
export class ProductDetailsComponent {
}
product-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProductListComponent } from './product-list.component';
import { ProductDetailsComponent } from './product-details.component';
const routes: Routes = [
{
path: 'products',
component: ProductListComponent
},
{
path: 'products/:id',
component: ProductDetailsComponent
}
];
@NgModule({
imports: [
RouterModule.forChild(routes)
],
exports: [
RouterModule
]
})
export class ProductRoutingModule {
}
product.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ProductListComponent } from './product-list.component';
import { ProductDetailsComponent } from './product-details.component';
import { ProductRoutingModule } from './product-routing.module';
@NgModule({
declarations: [
ProductListComponent,
ProductDetailsComponent
],
imports: [
CommonModule,
ProductRoutingModule
]
})
export class ProductModule {
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [
RouterModule.forRoot(routes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
}
How Does forChild() Work?
Product routes are:
const routes: Routes = [
{
path: 'products',
component: ProductListComponent
},
{
path: 'products/:id',
component: ProductDetailsComponent
}
];
They are registered using:
RouterModule.forChild(routes)
Angular adds these routes to the application's overall router configuration.
Therefore:
/products
↓
ProductListComponent
/products/10
↓
ProductDetailsComponent
The important point is that forChild() adds routes to the existing Router configuration. It does not create a separate Router instance for the feature.
forRoot() vs forChild()
This is the most important part for interviews.
forRoot() |
forChild() |
|---|---|
| Used for root routes | Used for feature-module routes |
| Normally called once | Can be called by multiple feature modules |
| Sets up Router providers | Reuses the existing Router services |
Usually in AppRoutingModule |
Usually in feature routing modules |
| Main application routing | Adds additional feature routes |
Think of it as:
Application
│
├── AppRoutingModule
│ │
│ └── RouterModule.forRoot(...)
│
├── ProductRoutingModule
│ │
│ └── RouterModule.forChild(...)
│
└── AdminRoutingModule
│
└── RouterModule.forChild(...)
Or simply:
forRoot()
│
└── Configure the main Router
│
├── forChild(Product routes)
│
├── forChild(Admin routes)
│
└── forChild(Order routes)
Why Do We Need forRoot() and forChild()?
Angular applications can contain many feature modules.
For example:
AppModule
├── ProductModule
├── OrderModule
├── CustomerModule
└── AdminModule
Each feature might have its own routing configuration.
Angular needs one Router service, but many modules may contribute routes.
Therefore:
forRoot()
↓
Configure root Router
forChild()
↓
Add feature routes to that Router
This prevents every feature module from trying to initialize its own root Router configuration.
Important Clarification: forChild() Does Not Mean Child Route
This is a common interview confusion.
RouterModule.forChild() means:
Register routes from a feature NgModule.
It does not specifically mean nested/child routes.
A child route is something different:
const routes: Routes = [
{
path: 'products',
component: ProductsComponent,
children: [
{
path: 'details',
component: ProductDetailsComponent
}
]
}
];
Here:
children: [...]
defines nested routes.
Whereas:
RouterModule.forChild(routes)
registers a feature module's routes.
So:
forChild()
≠
children routes
This distinction is important.
What About Modern Standalone Angular?
With standalone Angular, you normally don't need:
RouterModule.forRoot(routes)
or feature routing modules based on:
RouterModule.forChild(routes)
At application bootstrap, you typically use:
provideRouter(routes)
Example:
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes)
]
};
So conceptually:
Old NgModule approach
RouterModule.forRoot(routes)
↓
Root Router Configuration
Modern standalone approach
provideRouter(routes)
↓
Root Router Configuration
forRoot() and forChild() remain important to understand because you will encounter them in NgModule-based Angular applications and existing enterprise codebases.
Key Points
RouterModule.forRoot()configures root-level routing.forRoot()is normally called once.RouterModule.forChild()registers routes from feature NgModules.- Multiple feature modules can use
forChild(). forChild()adds routes to the existing Router configuration.forChild()does not create another Router service.forChild()is not the same thing as child/nested routes.- In standalone Angular, root routing is normally configured using:
provideRouter(routes)
Interview Questions and Answers
1. What is RouterModule.forRoot()?
RouterModule.forRoot(routes) configures the root Angular Router with the application's main route configuration and Router providers. It is normally called once in an NgModule-based application.
2. What is RouterModule.forChild()?
RouterModule.forChild(routes) registers additional routes from a feature NgModule while reusing the application's existing Router services.
3. What is the main difference between forRoot() and forChild()?
forRoot() → Root routing + Router providers
forChild() → Adds feature routes to existing Router
4. Can we call forRoot() multiple times?
Normally, no. The application's root routing configuration should use forRoot() once. Feature routing modules should use forChild().
5. Can multiple modules use forChild()?
Yes. Multiple feature routing modules can contribute their own routes using:
RouterModule.forChild(routes)
6. Does forChild() create another Router instance?
No. It adds feature routes while using the existing application Router.
7. Is RouterModule.forChild() the same as child routes?
No.
RouterModule.forChild(routes)
registers routes from a feature NgModule.
Whereas:
children: [...]
defines nested routes.
8. What replaces RouterModule.forRoot() in standalone Angular?
The modern standalone approach normally uses:
provideRouter(routes)
Interview-ready answer
RouterModule.forRoot()is used once to configure the root Router and application-level routes in an NgModule-based Angular application.RouterModule.forChild()is used by feature NgModules to add their routes to the existing Router configuration without creating another Router service.