Lazy loading helps your app load faster by only loading parts when needed. It saves data and improves user experience.
Lazy loading modules with routes in Angular
const routes: Routes = [ { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) } ];
The loadChildren property tells Angular to load the module only when the route is visited.
Use a function that returns a dynamic import() statement for lazy loading.
const routes: Routes = [ { path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule) } ];
const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) } ];
This example shows an Angular app routing setup where the 'products' module is lazy loaded. The main router loads the ProductsModule only when the user visits '/products'. The ProductsModule has its own route and component.
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: 'products', loadChildren: () => import('./products/products.module').then(m => m.ProductsModule) }, { path: '', redirectTo: 'products', pathMatch: 'full' } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule {} // products.module.ts import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule, Routes } from '@angular/router'; import { ProductsComponent } from './products.component'; const routes: Routes = [ { path: '', component: ProductsComponent } ]; @NgModule({ declarations: [ProductsComponent], imports: [CommonModule, RouterModule.forChild(routes)] }) export class ProductsModule {} // products.component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-products', template: `<h2>Products Page Loaded Lazily!</h2>` }) export class ProductsComponent {}
Lazy loading works best with feature modules, not root modules.
Make sure the lazy loaded module has its own routing configured with RouterModule.forChild().
Use browser DevTools Network tab to see when modules load.
Lazy loading delays loading parts of your app until needed.
Use loadChildren with dynamic import() in routes.
This improves app speed and user experience.
Practice
Solution
Step 1: Understand lazy loading concept
Lazy loading means delaying the loading of a module until it is needed, usually when the user navigates to a route that requires it.Step 2: Identify the purpose in routing
In Angular routing, lazy loading helps improve app speed by loading modules only on demand, not all at once.Final Answer:
To load modules only when the user navigates to their route -> Option BQuick Check:
Lazy loading = load on demand [OK]
- Thinking lazy loading loads all modules at start
- Confusing lazy loading with preloading
- Assuming lazy loading loads modules alphabetically
AdminModule in Angular routes?Solution
Step 1: Recall Angular lazy loading syntax
Angular uses dynamic import with a function returning a promise that resolves to the module class.Step 2: Match syntax to options
{ path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) } uses the correct arrow function with import and then to get AdminModule. { path: 'admin', loadChildren: './admin/admin.module#AdminModule' } is old deprecated string syntax. Options C and D are incorrect usage.Final Answer:
{ path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) } -> Option DQuick Check:
Dynamic import with arrow function = correct syntax [OK]
- Using deprecated string syntax for loadChildren
- Assigning component instead of loadChildren
- Omitting the arrow function wrapper
{ path: 'shop', loadChildren: () => import('./shop/shop.module').then(m => m.ShopModule) }What happens when the user navigates to
/shop for the first time?Solution
Step 1: Understand lazy loading behavior on navigation
When navigating to a lazy loaded route for the first time, Angular loads the module asynchronously.Step 2: Identify what happens on first navigation
The ShopModule is fetched, loaded, and its routes become active, enabling the user to see the shop page.Final Answer:
The ShopModule is loaded asynchronously and its routes are activated -> Option CQuick Check:
First navigation triggers async module load [OK]
- Assuming module loads at app start
- Confusing loadChildren with component property
- Thinking app reloads on lazy load
{ path: 'dashboard', loadChildren: './dashboard/dashboard.module#DashboardModule' }Solution
Step 1: Check loadChildren syntax
The string syntax with '#ModuleName' is deprecated in Angular and may cause errors in recent versions.Step 2: Identify correct syntax
Modern Angular requires loadChildren to be a function returning a dynamic import promise, not a string.Final Answer:
Using string syntax for loadChildren is deprecated and causes errors -> Option AQuick Check:
Use dynamic import function, not string [OK]
- Using old string syntax for loadChildren
- Confusing component and loadChildren properties
- Ignoring case sensitivity in paths
ProfileModule only when the user navigates to /profile. The module has child routes. Which is the best way to configure the main app routing to achieve this and ensure accessibility and performance?Solution
Step 1: Identify modern lazy loading syntax
The correct syntax uses dynamic import with an arrow function returning a promise: loadChildren: () => import('./profile/profile.module').then(m => m.ProfileModule).Step 2: Consider best practices for accessibility and performance
For protected features like a user profile, adding canActivate: [AuthGuard] ensures secure access while lazy loading maintains performance.Step 3: Eliminate incorrect configurations
Using component property fails for modules with child routes. String syntax like './profile/profile.module#ProfileModule' is deprecated.Final Answer:
{ path: 'profile', loadChildren: () => import('./profile/profile.module').then(m => m.ProfileModule), canActivate: [AuthGuard] } -> Option AQuick Check:
Lazy load with guard for best practice [OK]
- Using component instead of loadChildren for modules
- Using deprecated string syntax
- Forgetting route guards for protected routes
Ready to prove it?
Pass the test and this pattern moves unknown
