Contenido del curso
Gestión de Entornos
Nuevas Funcionalidades en Angular
- 7

Variables locales con @let en Angular
09:14 min - 8

Lazy loading de imágenes con ngSrc en Angular
17:08 min - 9

URLs amigables para SEO en Angular
11:27 min - 10

"Reactividad en Angular: Migración a Input Signals"
20:42 min - 11

Migración automática de @Input a signals en Angular
12:23 min - 12

Migración de Outputs en Angular: De Decoradores a Funciones
07:35 min - 13

linkedSignal en Angular: computed con set
12:56 min - 14

Sincronización de Componentes en Angular con Model y Signals
12:03 min - 15

toSignal: Observables de RxJS como Signals
11:17 min - 16

Conversión de Observables a Signals en Angular con toSignal
08:07 min - 17

Interoperabilidad de RXDS y Signals en Angular: Uso de RX Resourcers
11:10 min - 18

Manejo de Parámetros Reactivos con RX Resource en Angular
09:18 min - 19

Manejo de Promesas y Fetch en Angular sin RXJS
07:59 min - 20

Reactividad en Angular: Uso de Signals para Consultas DOM
09:00 min - 21

Configuración de Prettier para HTML en Angular
05:28 min
Server-Side Rendering (SSR) y Navegación
- 22

Migración al Application Builder de Angular
10:17 min - 23

Server Side Rendering con Angular: Mejora Rendimiento y SEO
13:26 min - 24

afterNextRender: código seguro solo en el browser
Viendo ahora - 25

Geolocalización y APIs: Creando un Mapa de Tiendas Cercanas
15:39 min - 26

Pre-rendering en Angular con ng build
11:25 min - 27

Desplegando Angular SSR en Firebase
18:12 min
Optimización de Rendimiento
- 28

Generación de Meta Tags Dinámicos con Angular y Open Graph
15:11 min - 29

Creación de MetaTags Dinámicos en Angular
12:51 min - 30

Proceso de Hydration y Event Replay en Angular
05:54 min - 31

Productos relacionados con RxResource en Angular
09:25 min - 32

Carga diferida de componentes en Angular para mejorar rendimiento
10:10 min - 33

Optimización de Incremental Hydration en Angular
06:14 min - 34

Configuración de Server Routing en Angular
10:43 min - 35

Aplicaciones Sin Zone.js: Migración a Signals en Angular
13:02 min - 36

Cierre del curso avanzado de Angular
00:53 min
afterNextRender: código seguro solo en el browser
Resumen
Cuando activas server-side rendering en Angular, aparece un problema silencioso: tu código intenta ejecutar APIs que solo existen en el navegador, como window, geolocation o setInterval, y Node.js no las reconoce. La solución pasa por un hook nuevo llamado afterNextRender, que te permite correr ese código únicamente del lado del cliente sin romper el renderizado en el servidor.
¿Por qué fallan las APIs del browser con server-side rendering?
Angular ahora ejecuta tu aplicación en dos contextos: Node.js (servidor) y el navegador (cliente). Y ahí está el detalle, no todas las APIs viven en ambos lados.
En el navegador tienes acceso a cosas como window.alert, navigator.geolocation.getCurrentPosition, conexiones Bluetooth, Progressive Web Apps y manipulación directa del DOM. En Node.js, nada de eso existe. Si tu componente intenta llamar a window durante el renderizado en servidor, obtienes el clásico error Window is not defined.
Un ejemplo claro: un componente counter que usa window.setInterval para actualizar un valor cada cierto tiempo [03:10]. Mientras navegas dentro de la app, todo funciona porque ya estás en el cliente. Pero si un usuario abre el link directo a la página about que usa ese counter, Angular intenta hacer server-side rendering, no encuentra window y la consola explota con el error.
¿Qué APIs del navegador no funcionan en server-side rendering? Todas las que dependen del entorno del browser:
window,document,navigator,geolocation, Bluetooth, Web APIs de PWA y librerías que manipulen el DOM directamente.
¿Qué es afterNextRender y cómo se usa en Angular?
El hook afterNextRender se importa desde @angular/core y se ejecuta dentro del constructor del componente [05:20]. Su trabajo es simple pero clave: corre el código que pongas dentro solo cuando la aplicación ya está renderizada del lado del cliente.
Piénsalo así. El ngOnInit se ejecuta tanto en servidor como en cliente. El afterNextRender se ejecuta únicamente en el browser. Por eso es el lugar seguro para todo lo que dependa de APIs del navegador.
¿Cuándo debo usar afterNextRender en lugar de ngOnInit? Cuando tu código necesita acceder a
window,document, geolocalización, o cualquier librería que lea o manipule el DOM. Si funciona en ambos contextos, dejangOnInit.
¿Cómo migro un setInterval con window al nuevo hook?
El ajuste tiene tres pasos prácticos:
- Mueve la lógica con
window.setIntervaldesdengOnInitalafterNextRenderdentro delconstructor. - Declara la referencia del intervalo inicializada en
nullcomo buena práctica. - En
ngOnDestroy, limpia el intervalo solo si la referencia existe, porque en el servidor seguirá siendonull.
Con ese patrón evitas tocar window en Node y aseguras que el clearInterval solo corra cuando realmente hay algo que limpiar [07:45]. La página recarga, el about renderiza desde el servidor sin errores y el contador sigue actualizándose en el cliente.
¿Y qué pasa con librerías de terceros que manipulan el DOM?
Aquí viene lo interesante. Muchas librerías populares de JavaScript, sobre todo las de gráficas, canvas o renderizado de audio en forma de ondas, necesitan leer el DOM para funcionar. Consultan ancho, alto, posición de elementos o crean nodos directamente.
Esas librerías también fallan en server-side rendering. La recomendación es la misma: cualquier instanciación que dependa del DOM o de un ElementRef debe vivir dentro de afterNextRender.
En la clase se migra un componente que renderiza un MP3 como ondas visuales. Originalmente usaba ngAfterViewInit para inicializar la librería. La migración consiste en mover esa lógica al constructor envuelta en afterNextRender y eliminar el ngAfterViewInit [10:30]. Resultado: la librería se instancia solo en el browser, donde tiene sentido, y el servidor renderiza el HTML base sin tropezar.
¿Por qué importa elegir bien las librerías en proyectos con SSR?
No todas las librerías están pensadas para entornos isomórficos. Antes de instalar una dependencia revisa:
- Si depende de
window,documento APIs exclusivas del browser. - Si manipula el DOM directamente para renderizar.
- Si ofrece una versión compatible con Node o un modo de inicialización diferida.
Cuando la respuesta es sí a alguno de estos puntos, ya sabes el patrón: envuelve la inicialización en afterNextRender y mantén tu app funcional en ambos contextos.
Recapitulando los dos casos donde aplicar afterNextRender
Los escenarios prácticos donde este hook es obligatorio son claros:
- APIs del navegador como
window.setInterval,geolocationo cualquier capability del browser. - Librerías de terceros que necesiten manipular o leer el DOM para renderizar gráficas, canvas, ondas de audio o componentes visuales complejos.
El siguiente paso natural es integrar capabilities reales del navegador, como obtener la geoposición del usuario, y ver cómo se conecta toda esta lógica con hardware desde una app Angular con SSR. ¿Ya tienes pensado qué API del browser quieres integrar primero en tu proyecto? Cuéntame en los comentarios.