20 claves para que tus aplicaciones Angular sean ultra rápidas | Optimización del Renderizado en Angular 20
Angular 20 está aquí — y con Angular 21 ya asomando en el horizonte — así que no hay mejor momento para optimizar nuestras aplicaciones y aprovechar todas las mejoras introducidas desde Angular 17 hasta hoy. Si quieres mantenerte al día con lo que viene, Angular ya dejó una pista del próximo lanzamiento 👉
https://x.com/angular/status/1989377788898365811?s=20.
La evolución del framework no solo nos exige ejecutar ng update, sino repensar nuestra arquitectura, modernizar nuestro enfoque de renderizado y aprovechar las nuevas capacidades del motor Ivy, del router standalone y del sistema de vistas diferidas.
En esta guía encontrarás recomendaciones prácticas para acelerar el renderizado inicial, optimizar el uso de memoria y mejorar la respuesta visual de tus aplicaciones Angular.
🎯 1. Adopta la nueva sintaxis de control de flujo (@if, @for, @switch)
Desde Angular 17 se introdujo la nueva sintaxis declarativa basada en bloques. Angular 20 hace oficial la obsolescencia de las directivas estructurales (*ngIf, *ngFor, *ngSwitch) y en Angular 22 ya se planea eliminarlas.
Migrar al nuevo control de flujo trae beneficios reales de rendimiento:
- Compilación 100% en tiempo de build
- Eliminación del overhead en tiempo de ejecución
- Mejor reconciliación del DOM
- Menos fugas de memoria
- Menos renders innecesarios
- Mejor uso de
trackpara identificar elementos
👉 Comparación rápida
| Sintaxis antigua | Sintaxis moderna |
|---|---|
*ngIf="condicion" |
@if (condicion) { ... } |
*ngFor="let x of lista" |
@for (x of lista; track x.id) { ... } |
Ejemplo moderno
<section class="productos">
@if (productos().length === 0) {
<p>No hay productos disponibles 😢</p>
} @else {
@for (item of productos(); track item.id) {
<app-product-card [data]="item" />
}
}
</section>
Migración automática
ng generate @angular/core:control-flow
🚀 2. Usa vistas diferidas (@defer) para cargar solo lo necesario
Las vistas diferidas permiten aplazar la carga y renderizado de contenido no crítico utilizando condiciones declarativas. Esto reduce el peso del bundle inicial, el tiempo de renderizado y el trabajo del navegador.
Ejemplo altamente optimizado
@defer (on viewport) {
<app-reviews-panel />
} @placeholder {
<div class="skeleton skeleton-reviews"></div>
} @loading (after 500ms; minimum 800ms) {
<span class="loading">Cargando reseñas…</span>
} @error {
<p>No pudimos cargar las reseñas. Intenta nuevamente.</p>
}
Triggers clave
on idleon timer(x)on viewport(#ref)on hover(#ref)on interaction(#ref)
Bonus: Hidratación incremental
@defer (on viewport; hydrate on immediate) {
<app-hero-section />
}
⚡ 3. Combina carga diferida con precarga inteligente
@defer funciona dentro del template, pero la carga diferida clásica del router sigue siendo crucial para dividir grandes áreas funcionales.
Generar rutas lazy-loading (standalone)
ng generate @angular/core:route-lazy-loading
Precarga inteligente con QuickLink
import { QuicklinkStrategy } from 'ngx-quicklink';
export const appConfig = {
providers: [
provideRouter(routes, withPreloading(QuicklinkStrategy))
]
};
Bonus avanzado: Speculation Rules API
{
"prerender": ["/productos"],
"prefetch": ["/ofertas", "/carrito"]
}
🌐 4. Aplica estrategias híbridas de renderizado (CSR, SSR, SSG)
Angular 20 consolidó el renderizado híbrido por ruta, permitiendo elegir entre CSR, SSR y SSG según necesidades.
Configuración por ruta
import { RenderMode } from '@angular/ssr';
export const serverRouteConfig = [
{ path: 'carrito', renderMode: RenderMode.Client },
{ path: 'catalogo', renderMode: RenderMode.Server },
{ path: 'producto/:id', renderMode: RenderMode.Prerender },
];
Prerender dinámico
{
path: 'producto/:id',
renderMode: RenderMode.Prerender,
async getPrerenderParams() {
const catalog = inject(CatalogService);
const ids = await catalog.getProductIds();
return ids.map(id => ({ id }));
}
}
🌲 5. Reduce el tamaño del árbol de componentes
Un árbol de componentes profundo o inflado provoca más trabajo de detección de cambios, mayor uso de memoria y peor tiempo hasta la interacción.
Recomendaciones
- Divide componentes grandes en piezas pequeñas
- Mueve lógica pesada a servicios
- Usa paginación o virtual scroll
- Combina virtual scroll +
@defer
Ejemplo con CDK Virtual Scroll
<cdk-virtual-scroll-viewport itemSize="50" class="viewport">
@for (item of items(); track item.id) {
<app-item-row [data]="item" />
}
</cdk-virtual-scroll-viewport>
Esto puede reducir miles de nodos del DOM a apenas unas decenas visibles.
🎉 Resumen final
Estas recomendaciones te ayudarán a aprovechar al máximo el motor Ivy, el router standalone, @defer y los nuevos bloques de control de flujo. Angular 20 marca un punto de madurez enorme en el framework.
Y con Angular 21 en camino, iremos actualizando este contenido y las optimizaciones recomendadas en cuanto se anuncien oficialmente. Mantente atento 👉
https://x.com/angular/status/1989377788898365811?s=20.
Fuente:
https://medium.com/ngconf/20-recomendaciones-para-que-tus-aplicaciones-de-angular-funcionen-m%C3%A1s-r%C3%A1pido-parte-1-9e2bed54aa7e
https://angular.dev/
Agradezco a Alejandro por el excelente post que fue la base para este artículo.