Zone.js — это библиотека, которая создает контекст выполнения для асинхронных операций в JavaScript. Она позволяет перехватывать и отслеживать все асинхронные операции в приложении.
Ключевые возможности:
Angular использует Zone.js для своего механизма обнаружения изменений (Change Detection). Вот как это происходит:
Инициализация зоны:
import 'zone.js';
platformBrowserDynamic().bootstrapModule(AppModule);
Монопатирование API: Zone.js заменяет нативные асинхронные API (например, setTimeout) своими версиями
Уведомление Angular: При завершении асинхронной операции Zone.js уведомляет Angular, что нужно запустить проверку изменений
Angular предоставляет сервис NgZone — обертку вокруг Zone.js:
constructor(private ngZone: NgZone) {
this.ngZone.onMicrotaskEmpty.subscribe(() => {
// Запуск обнаружения изменений
});
}
this.ngZone.runOutsideAngular(() => {
setTimeout(() => {
// Этот код не вызовет проверку изменений
}, 1000);
});
this.ngZone.run(() => {
// Этот код вызовет проверку изменений
});
Отключение Zone.js:
bootstrapApplication(AppComponent, {
providers: [
provideZoneChangeDetection({ eventCoalescing: true })
]
});
Ручное управление:
import { NoopNgZone } from '@angular/core';
bootstrapApplication(AppComponent, { ngZone: 'noop' });
Проблема: Лишние проверки изменений
Решение: Использовать runOutsideAngular для "тяжелого" кода
Проблема: Утечки памяти
Решение: Правильно очищать обработчики событий
Zone.js в Angular:
Пример комплексного использования:
@Component({...})
export class PerformanceComponent {
constructor(private ngZone: NgZone) {
// Оптимизация анимации
this.ngZone.runOutsideAngular(() => {
requestAnimationFrame(() => this.updateAnimation());
});
}
updateAnimation() {
// Код анимации не триггерит Change Detection
}
}