Предупреждения о нарушении zone.js на консоли в проекте Angular только для Chrome

У меня есть проект Angular 4, созданный с помощью @angular/cli, при запуске приложения в режиме разработки я получаю эти предупреждения в консоли:

zone.js:1489 [Violation] 'setTimeout' handler took 209ms
2[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'touchstart' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
2zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'touchstart' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.
2zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive.
zone.js:1157 [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.

Странно, что предупреждение появляется только в Chrome. (моя версия сборки chrome: 58.0.3029.110)

  • Что означают эти (нарушения) предупреждения?
  • Это вредно для производительности приложения?
  • Как отключить/переопределить или настроить zone.js для удаления этих предупреждений?

Ответ 1

Что такое пассивное событие?

Пассивные прослушиватели событий - это новая функция в спецификации DOM, которая позволяет разработчикам делать выбор, чтобы лучше выполнять прокрутку, устраняя необходимость прокрутки для блокировки при прослушивании прикосновений и событий на колесиках. Разработчики могут аннотировать касание и прослушиватели колес с помощью {passive: true}, чтобы указать, что они никогда не будут вызывать preventDefault. Эта функция поставляется в Chrome 51, Firefox 49 и выгружается в WebKit. Ссылка.

Chrome выдает предупреждение...

[Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive.

... когда вы привязываетесь к событиям прокрутки мыши, чтобы по существу предупредить, что вы можете заблокировать производительность прокрутки в своем событии или отключить события по умолчанию, сделав вызов preventDefault().

Chrome также выдает ошибку при попытке и по-прежнему вызывать preventDefault() в пассивном событии.

Unable to preventDefault inside passive event listener invocation.

У Firefox есть аналогичная ошибка для этого, однако, похоже, это не предупреждение, как Chrome:

Ignoring ‘preventDefault()’ call on event of type ‘wheel’ from a listener registered as ‘passive’.

Предупреждающая витрина

Выполните следующий фрагмент и просмотрите консоль Chrome в режиме Verbose.

// WILL throw violation
document.addEventListener("wheel", function(e) {
  e.preventDefault(); // prevents default browser functionality
});

// will NOT throw violation
document.addEventListener("wheel", function(e) {
  e.preventDefault(); // does nothing since the listener is passive
}, {
  passive: true
});