🇺🇸 EN
Frontend
·3 min read·↗·🇺🇸 EN

Angular 19 y ZoneLess

Portada principal del artículo: Angular 19 y ZoneLess

No importa si estás usando Angular 14, 15 o incluso 19: tus aplicaciones siguen bajo el paraguas de Zone.js. Quizás sientas que tus aplicaciones de Angular funcionan bien, pero por debajo, con Zone.js, Angular necesita recorrer todo el árbol del DOM y eso termina afectando el rendimiento. Esto ocurre porque Zone.js intercepta las APIs del navegador para escuchar eventos del DOM y avisarle a Angular cada vez que se dispara un evento. Como Zone.js no conoce el estado interno de tu aplicación ni qué causó exactamente el cambio, Angular se ve obligado a revisar cada nodo de la app.

Al pasar a un enfoque zoneless, podemos apoyarnos en ChangeDetectorRef.markForCheck (el cual usa AsyncPipe), ComponentRef.setInput, o directamente en Signals para reaccionar a los cambios, además de nuevos hooks del ciclo de vida como afterNextRender o afterRender.

Migrar a ZoneLess

Primero, creamos un nuevo proyecto usando el CLI de Angular 19 con ng new my-zoneless-app:

ng new my-zoneless-app
✔ Which stylesheet format would you like to use? Sass (SCSS)     [ https://sass-lang.com/documentation/syntax#scss        
        ]
✔ Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)? no
CREATE my-zoneless-app/README.md (1476 bytes)
CREATE my-zoneless-app/.editorconfig (314 bytes)
CREATE my-zoneless-app/.gitignore (587 bytes)
CREATE my-zoneless-app/angular.json (2800 bytes)
CREATE my-zoneless-app/package.json (1046 bytes)
CREATE my-zoneless-app/tsconfig.json (915 bytes)

Eliminamos Zone.js de nuestro proyecto ejecutando el comando npm uninstall zone.js:

npm uninstall zone.js

Edita tu archivo angular.json para remover zone.js y zone.js/testing del arreglo de polyfills para que no se incluyan en el build. Si tu proyecto utiliza un archivo polyfills.ts explícito, remueve también las líneas import 'zone.js'; e import 'zone.js/testing'; de ese archivo.

Para activar Angular sin Zone.js, abre el archivo app.config.ts. En la sección de providers, elimina provideZoneChangeDetection({ eventCoalescing: true }) y agrega provideExperimentalZonelessChangeDetection():

Note: provideExperimentalZonelessChangeDetection es experimental.

Nuestro archivo app.config.ts queda de la siguiente manera:

import {ApplicationConfig, provideExperimentalZonelessChangeDetection, provideZoneChangeDetection} from '@angular/core';
import { provideRouter } from '@angular/router';
 
import { routes } from './app.routes';
 
export const appConfig: ApplicationConfig = {
  providers: [
    provideExperimentalZonelessChangeDetection(),
    provideRouter(routes)]
};

Guarda los cambios y ejecuta ng serve. ¡Y listo! Nuestra aplicación funciona exactamente igual que antes, pero ahora sin NgZone. 🎉

Esto funciona perfecto para migrar proyectos, pero quizás quieras crear un proyecto zoneless desde cero. No te preocupes: el CLI de Angular nos permite hacerlo directamente con una bandera.

¿UN SEGUNDO?
¿Quieres aprender Angular Moderno en español con Signals, Functional Interceptors, Defer Blocks, Control Flow, SSR además de Jest, NgRx Signals y más? ¡Este es tu curso!

¿Crear una aplicación zoneless por defecto?

Para crear una aplicación zoneless directamente usando el CLI de Angular, generamos el proyecto con el flag --experimental-zoneless:

ng new fastweb --experimental-zoneless

El flag --experimental-zoneless configura el proyecto listo para usar desde el primer momento, preparándolo para trabajar sin Angular Zones.

Un detalle a tener en cuenta: en Angular 19.0.1 todavía necesitamos remover el paquete zone.js manualmente ejecutando npm uninstall zone.js:

Una vez hecho esto, ¡ya estamos listos para construir aplicaciones zoneless en Angular 19!

Resumen

Aprendimos cómo remover zone.js en aplicaciones existentes y cómo crear proyectos zoneless por defecto usando el flag del CLI. Espero que te animes a dar el salto y comiences a construir tus aplicaciones sin Zone.js. 😎

Código fuente: https://github.com/danywalls/zoneless-angular-app

Foto por Ad Lh en Unsplash

Parte de la serie Frontend

Modern frontend development — Angular, React, TypeScript, accessibility, and performance.

Ver serie completa

Preguntas Frecuentes

¿Qué es Angular zoneless y por qué es mejor que Zone.js?

Angular zoneless elimina la dependencia de Zone.js, la librería que intercepta las APIs del navegador y dispara la detección de cambios tras cada evento asíncrono. Sin Zone.js, Angular solo revisa y actualiza las partes de la vista que notifican explícitamente un cambio, lo que se traduce en un mejor rendimiento en tiempo de ejecución, menor tamaño de bundle y un comportamiento de renderizado mucho más predecible.

¿Cómo elimino Zone.js de un proyecto en Angular 19?

Ejecuta npm uninstall zone.js para desinstalar el paquete. Luego, abre angular.json y elimina las entradas zone.js y zone.js/testing del arreglo polyfills. Si tu proyecto tiene un archivo polyfills.ts, elimina las sentencias import de zone.js y zone.js/testing. Por último, reemplaza provideZoneChangeDetection en app.config.ts por provideExperimentalZonelessChangeDetection.

¿Qué estrategias de detección de cambios funcionan en una aplicación Angular zoneless?

En una aplicación Angular zoneless, la detección de cambios se activa de forma explícita en lugar de automática. Puedes usar Signals, que notifican automáticamente a Angular cuando cambia su valor, o llamar a ChangeDetectorRef.markForCheck para programar manualmente la revisión de un componente. El AsyncPipe también funciona porque llama internamente a markForCheck cada vez que llega un nuevo valor desde un observable.

¿Es seguro usar provideExperimentalZonelessChangeDetection en producción con Angular 19?

Como indica su nombre, provideExperimentalZonelessChangeDetection todavía está marcado como experimental en Angular 19, lo que significa que la API podría cambiar en versiones futuras. Es completamente funcional y ofrece mejoras notables de rendimiento, pero el equipo de Angular aún no lo ha declarado estable. Para aplicaciones en producción, evalúa los requisitos de estabilidad de tu proyecto y sigue de cerca las notas de lanzamiento de Angular.

Artículos Relacionados

Primeros pasos con Angular Signals: Una introducción básica

Desde Angular 16 he escuchado mucho sobre Signals. El equipo de Angular hizo un gran trabajo escuchando a la comunidad y mejorando la API de Signals con la interoperabilidad con RxJS. Ayer estuve hablando con mi amigo Juan Berzosa y aún no había probado Signals, así que...

Cómo simplificar la comunicación entre componentes en Angular con model() y Signals

Estuve muy ocupado en septiembre, pero ahora estoy preparando un taller sobre signals y explorando ideas sobre cómo pueden simplificar nuestro código. Recientemente usaba @Input() y @Output para la comunicación entre componentes, pero Angular 17 introdujo alternativas más limpias...

Entendiendo InjectionContext y los effects de Signals

Ayer estuve conversando con mi amigo Jörgen de Groot sobre Signals. Cuando la conversación pasó a los effects, se encontró con el error ERROR NG0203. Poco después, otro amigo me contactó con el mismo problema. Decidí escribir un breve artículo para explicar por qué ocurre...

Entendiendo One-Way y Two-Way Data Binding en Angular

Hoy estuve ayudando a un compañero con las diferencias al enlazar datos en Angular, ya que ofrece dos formas de mover información hacia el DOM: one-way y two-way data binding. Esto nos permite crear aplicaciones dinámicas.

Uso de Reactive Forms con tipado estricto en Angular

Aprende a usar formularios reactivos con tipado estricto en Angular, aprovecha NonNullableFormBuilder y FormRecord, y elimina errores de nulabilidad en tiempo de ejecución con seguridad de tipos.

Compartir este artículo

Si esta guía te resultó útil, compártela con tu equipo o con otros desarrolladores.


Software real. Lecciones reales.

Comparto las lecciones que aprendí por las malas, para que puedas evitarlas o estar preparado cuando ocurran.

User avatar
User avatar
User avatar
User avatar
+13K

Únete a 13,800+ desarrolladores y lectores.

Cero spam. Cancela tu suscripción en cualquier momento.