Angular 21 de Cero a Experto / Nivel producción
@defer: cargar partes de la vista bajo demanda
El lazy loading de rutas carga PÁGINAS bajo demanda. Pero ¿qué pasa con una parte pesada DENTRO
de una página que ya estás viendo —un gráfico costoso, un mapa, un editor enriquecido—? Para
eso está @defer: un bloque de template que carga su contenido solo cuando hace falta (al
entrar en viewport, al interactuar, tras un tiempo). Es una de las joyas de Angular moderno
para el rendimiento de carga. Hoy la dominas.
Cargar la maleta cuando la necesitas
Un bloque @defer con sus estados
@defer viene con bloques auxiliares para cubrir todo el ciclo de carga:
@Component({
template: `
@defer (on viewport) {
<app-grafico-gastos [datos]="gastos()" /> <!-- pesado: solo carga al verse -->
} @placeholder {
<div class="placeholder">Gráfico de gastos</div> <!-- antes de empezar a cargar -->
} @loading (minimum 200ms) {
<app-spinner /> <!-- mientras descarga el código -->
} @error {
<p>No se pudo cargar el gráfico.</p> <!-- si la carga falla -->
}
`,
})
export class DashboardComponent {}@defer— el contenido pesado, que se carga bajo demanda según el disparador.@placeholder— qué mostrar ANTES de que empiece la carga (ligero, siempre presente).@loading— qué mostrar MIENTRAS descarga (conminimumpara evitar parpadeos).@error— qué mostrar si la carga falla.
El componente pesado (app-grafico-gastos) y su código quedan FUERA del bundle inicial: se
descargan solo cuando el disparador se cumple. La página arranca sin ese peso.
Los disparadores
@defer vs lazy loading de rutas
¿Cuándo usarías `@defer` en lugar de lazy loading de rutas (`loadComponent`)?
Mini-reto
Diseña la página de estadísticas de "Mi Bolsillo" con @defer: 1) un gráfico pesado que cargue
on viewport; 2) un panel de "análisis avanzado" que cargue on interaction cuando el usuario
haga clic en un botón; 3) sus bloques @placeholder y @loading. Explica qué código queda
fuera del bundle inicial y cuándo se descarga cada parte.
Qué sigue
Tu app carga solo lo necesario, cuando lo necesita. Falta asegurar que FUNCIONA y que seguirá funcionando: los tests. La próxima lección es el testing en Angular —con TestBed y Angular Testing Library— para probar tus componentes como los usa un usuario real, y lo consolidas con un mini-verificador en vivo.