Lazy loading is a design pattern that delays the loading of non-essentials resources (modules, components, etc.) until they are actually needed.
In Angular applications certain parts of your application only loads when a user navigates to specific routes.
This results in:
- Faster initial page load
- Reduced bundle size
- Better resource utilization
- Improved performance
Code Splitting
Code splitting is the technical process that enables lazy loading.
Angular’s CLI and webpack handle this by:
- Breaking the application into multiple bundles
- Loading these bundles on demand
- Managing dependencies between bundles
Implementing Route-based Lazy Loading
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{
path: 'home',
loadChildren: () => import('./home/home.module')
.then(m => m.HomeModule)
},
{
path: 'products',
loadChildren: () => import('./products/products.module')
.then(m => m.ProductsModule)
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
Feature Module Setup
// products/products.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ProductsRoutingModule } from './products-routing.module';
import { ProductListComponent } from './product-list/product-list.component';
import { ProductDetailComponent } from './product-detail/product-detail.component';
@NgModule({
declarations: [
ProductListComponent,
ProductDetailComponent
],
imports: [
CommonModule,
ProductsRoutingModule
]
})
export class ProductsModule { }
// products/products-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProductListComponent } from './product-list/product-list.component';
import { ProductDetailComponent } from './product-detail/product-detail.component';
const routes: Routes = [
{
path: '',
component: ProductListComponent
},
{
path: ':id',
component: ProductDetailComponent
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ProductsRoutingModule { }
Lazy Loading Entire Route Groups
You can lazy load groups of related routes together:
// app-routing.module.ts
const routes: Routes = [
{
path: 'admin',
loadChildren: () => import('./admin/admin.module')
.then(m => m.AdminModule),
canActivate: [authGuard]
}
];
// admin/admin.module.ts
const routes: Routes = [
{
path: '',
component: AdminDashboardComponent,
children: [
{
path: 'users',
loadChildren: () => import('./users/users.module')
.then(m => m.UsersModule)
},
{
path: 'settings',
loadChildren: () => import('./settings/settings.module')
.then(m => m.SettingsModule)
}
]
}
];