Chicos, cuando crean el método, miren que no utilicen camelCase “preLoad()” ya que les dará un error en el nombre de la case.
Ya saben que el nombre del método debe ir sin camelCase
preload(){}
Manejo de rutas
Qué aprenderás sobre Angular Router y programación modular
Creando rutas
Creando el Home
Página de categorías
Evitando doble subscribe
RouterLink y RouterActive
Ruta 404
Detalle de cada producto
Parametros URL
Módulos
LazyLoading y CodeSplitting
Programación Modular
Vistas anidadas
Creando el CMS Module
Creando en Website Module
Creando un Shared Module
Precarga de módulos
Precarga de módulos
All Modules y Custom Strategy
QuickLink Strategy
Guardianes
Conoce a los Guardianes
Implementando redirects
Estado de login
Guard para Admin
CanDeactivate
Deployment
Netlify Deployment
Despedida
Despedida
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Al haber activado la técnica de Lazy Loading , puedes personalizar el envío de estos módulos al cliente con diferentes estrategias.
Por defecto, la aplicación enviará al cliente solo el módulo que necesita. Si ingresas al módulo website, solo se cargará su respectivo archivo JS.
Si el usuario solicita otro módulo, este se cargará solo cuando sea necesario.
Esto puede causarte problemas, ya que si el módulo solicitado es algo pesado o la conexión es lenta, tardará varios segundos en estar listo y no será buena la experiencia de usuario.
Puedes decirle a tu aplicación que, por defecto, precargue todos los módulos con la siguiente configuración.
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes, PreloadAllModules } from '@angular/router';
const routes: Routes = [
{
path: '',
loadChildren: () => import('./modules/website/website.module').then(m => m.WebsiteModule),
},
{
path: 'cms',
loadChildren: () => import('./modules/cms/cms.module').then(m => m.CmsModule),
}
];
@NgModule({
imports: [RouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules
})],
exports: [RouterModule]
})
export class AppRoutingModule { }
Importando PreloadAllModules desde @angular/router
, lo pasas como parámetro al import
en el decorador @NgModule()
. De esta manera, se cargarán en el primer render TODOS los módulos que tu aplicación tenga, pudiendo ver por consola algo como lo siguiente.
Precargar todos los módulos a la vez, puede ser contraproducente. Imagina que tu aplicación posea 50 o 100 módulos. Sería lo mismo que tener todo en un mismo archivo main.js
.
Para solucionar esto, puedes personalizar la estrategia de descarga de módulos indicando qué módulos si se deben precargar y cuáles no.
Agrégale a cada regla en el routing de tu aplicación, metadata para indicarle a cada módulo si debe ser precargado, o no.
// app-routing.module.ts
const routes: Routes = [
{
path: '',
loadChildren: () => import('./modules/website/website.module').then(m => m.WebsiteModule),
data: { preload: true },
},
{
path: 'cms',
loadChildren: () => import('./modules/cms/cms.module').then(m => m.CmsModule),
data: { preload: true },
}
];
Con la propiedad data: { preload: true }
, le indicas al servicio CustomPreloadingStrategy si el módulo debe ser precargado en el primer render de tu app.
Crea un servicio al cual llamaremos CustomPreloadingStrategy con la siguiente lógica.
// modules/shared/services/custom-preloading-strategy.service.ts
import { Injectable } from '@angular/core';
import { Route, PreloadingStrategy } from '@angular/router';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class CustomPreloadingStrategyService implements PreloadingStrategy {
preload(route: Route, load: () => Observable<any>): Observable<any> {
if (route.data && route.data.preload)
return load();
else
return of(null);
}
}
El servicio implementa PreloadingStrategy y sobreescribiendo el método preload()
, hace uso de la metadata para desarrollar tu propia lógica de renderizado de módulos.
Finalmente, importa tu estrategia personalizada en el routing.
// app-routing.module.ts
import { CustomPreloadingStrategyService } from './modules/shared/services/custom-preloading-strategy.service';
// ..
@NgModule({
imports: [RouterModule.forRoot(routes, {
preloadingStrategy: CustomPreloadingStrategyService,
})],
exports: [RouterModule]
})
export class AppRoutingModule { }
De esta manera, ya puedes personalizar qué módulos serán enviados al cliente y cuáles no, mejorando así el rendimiento de tu aplicación.
Contribución creada por: Kevin Fiorentino.
Aportes 4
Preguntas 3
Chicos, cuando crean el método, miren que no utilicen camelCase “preLoad()” ya que les dará un error en el nombre de la case.
Ya saben que el nombre del método debe ir sin camelCase
preload(){}
Muy interesante el crear una estrategia para precargar los módulos.
Dado que el modularizar la app se tienen varios chuncks y cada uno de estos corresponde a un archivo de JS, a su vez cada uno de estos archivos requiere de una petición al servidor y al descargarse cada archivo JS debe pasar por varias etapas para su ejecución. Esto puede tardar mucho en conexiones lentas. Una forma que proporciona Angular para solucionar esto es aprovechar los momentos de inactividad del navegador después de la carga inicial para descargar en segundo plano los archivos de los otros módulos mientras el usuario navega por el website. A este proceso se le conoce como precarga de módulos.
Aca va el codigo del preload()
preload(route: Route, load: () => Observable<any>): Observable<any> {
if(route.data && route.data['preload']){
return load();
}
return of(null);
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?