Lazy Loading, o carga diferida, es una técnica utilizada en Angular para cargar módulos de la aplicación solo cuando son necesarios, en lugar de cargarlos todos de una vez durante el arranque inicial de la aplicación. Esto mejora el rendimiento de la aplicación al reducir el tiempo de carga inicial y distribuir la carga de los módulos a lo largo del ciclo de vida de la aplicación.
Lazy-loading feature modules: https://angular.dev/guide/ngmodules/lazy-loading
Componentes de Lazy Loading en Angular v18
- RouterModule: Configura el enrutamiento y define las rutas para los módulos cargados de manera diferida.
- Routes: Define las rutas, incluyendo las rutas de carga diferida.
- loadChildren: Propiedad utilizada en las rutas para especificar el módulo que debe cargarse de manera diferida.
- NgModule: Módulo que se carga de manera diferida.
Videotutoriales
- Angular 2023 #8 Rutas En Angular https://youtu.be/jKabdJTNe4I
- Carga perezosa (Lazy loading): https://youtu.be/ViAIK9-piEw
- Lazy loading en Angular 17 https://youtu.be/Pgx8pUKZyPA
- Módulos y Lazy Loading en Angular https://youtu.be/gb8R2QDwC9A
- Lazy loading de componentes en Angular 17 https://youtu.be/HGp4MIZggYE
Interpretación de cada componente
RouterModule:
Configura las rutas principales de la aplicación y permite la carga diferida de módulos.
import { RouterModule, Routes } from '@angular/router';
import { NgModule } from '@angular/core';
const routes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },
{ path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
Routes:
Define las rutas de la aplicación, incluyendo las rutas de carga diferida.
const routes: Routes = [
{ path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },
{ path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },
];
loadChildren:
Propiedad utilizada en las rutas para especificar el módulo que debe cargarse de manera diferida.
{ path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) }
NgModule:
Módulo que se carga de manera diferida.
// home.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HomeComponent } from './home.component';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent }
];
@NgModule({
declarations: [HomeComponent],
imports: [
CommonModule,
RouterModule.forChild(routes)
]
})
export class HomeModule {}
Código para Lazy Loading
Con esta configuración, la aplicación utilizará Lazy Loading para cargar los módulos Home y About solo cuando se navegue a sus respectivas rutas. Esto mejora el rendimiento de la aplicación al reducir el tamaño del paquete inicial y distribuir la carga de los módulos a lo largo del uso de la aplicación.
Configurar Módulo de Enrutamiento Principal
Define y configura el módulo de enrutamiento principal de la aplicación.
// 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: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
Configurar Módulo Principal
Importa el módulo de enrutamiento en el módulo principal de la aplicación.
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, AppRoutingModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
Definir Módulo y Componente Home
Configura el módulo y componente Home.
// home.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HomeComponent } from './home.component';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [{ path: '', component: HomeComponent }];
@NgModule({
declarations: [HomeComponent],
imports: [CommonModule, RouterModule.forChild(routes)]
})
export class HomeModule {}
// home.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-home',
template: `Home Component
`
})
export class HomeComponent {}
Definir Módulo y Componente About
Configura el módulo y componente About.
// about.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AboutComponent } from './about.component';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [{ path: '', component: AboutComponent }];
@NgModule({
declarations: [AboutComponent],
imports: [CommonModule, RouterModule.forChild(routes)]
})
export class AboutModule {}
// about.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-about',
template: `About Component
`
})
export class AboutComponent {}
Configurar Componente Principal
Configura el componente principal para usar el RouterOutlet y RouterLink para la navegación.
// app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<nav>
<a routerLink="/home">Home</a>
<a routerLink="/about">About</a>
</nav>
<router-outlet></router-outlet>
`
})
export class AppComponent {}
.................................