Не использует пассивных слушателей для повышения производительности прокрутки (Lighthouse Report)

В недавнем отчете Lighthouse отмечена следующая проблема.

Не использует пассивных слушателей для повышения производительности прокрутки.

Также упоминается ...

Пометьте слушателей событий касания и колесика как passive, чтобы повысить скорость прокрутки страницы.

Как мне решить эту проблему? Похоже, это связано с jQuery.


person Community    schedule 22.02.2020    source источник
comment
web.dev/uses-passive-event-listeners   -  person Luca Kiebel    schedule 23.02.2020


Ответы (3)


На эту тему была длинная ветка в https://github.com/jquery/jquery/issues/2871 в 2016 г.

Суммируя:

  • jQuery не может добавить поддержку пассивных слушателей.
  • Ожидается, что это будет добавлено в jQuery 4 (4 года и все еще в
  1. 5.x)
  • Предлагаемое исправление - добавить этот код сразу после загрузки jQuery:

jQuery.event.special.touchstart = {
        setup: function( _, ns, handle ){
            this.addEventListener("touchstart", handle, { passive: true });
        }
    };

ОБНОВЛЕНИЕ 2021: добавьте следующий код после jquery. Это исправит проблему и уберет предупреждение Pagespeed.

jQuery.event.special.touchstart = {
    setup: function( _, ns, handle ) {
        this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
    }
};
jQuery.event.special.touchmove = {
    setup: function( _, ns, handle ) {
        this.addEventListener("touchmove", handle, { passive: !ns.includes("noPreventDefault") });
    }
};
jQuery.event.special.wheel = {
    setup: function( _, ns, handle ){
        this.addEventListener("wheel", handle, { passive: true });
    }
};
jQuery.event.special.mousewheel = {
    setup: function( _, ns, handle ){
        this.addEventListener("mousewheel", handle, { passive: true });
    }
};
person Satelier Diego    schedule 03.06.2020
comment
Я добавил это в тег скрипта после тега скрипта, который добавляет jquery-3.3.1.min.js. Производительность маяка не увеличится. Кто-нибудь здесь нашел решение, чтобы на самом деле избавиться от отчета. Не использует пассивных слушателей для повышения производительности прокрутки. - person K. Shaikh; 02.11.2020
comment
Цель - сделать отчет о маяке привлекательным для вашего босса / клиента или улучшить работу страницы? - person squarecandy; 05.12.2020
comment
@squarecandy, думаю, для многих важны оба пункта;) - person GDY; 18.12.2020
comment
Я добавил код сразу после загрузки jQuery (v3.2.1), но PageSpeed ​​все еще упоминает о пассивных слушателях - person stckvrw; 05.07.2021

Это сделало свое дело!

// Passive event listeners
jQuery.event.special.touchstart = {
    setup: function( _, ns, handle ) {
        this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
    }
};
jQuery.event.special.touchmove = {
    setup: function( _, ns, handle ) {
        this.addEventListener("touchmove", handle, { passive: !ns.includes("noPreventDefault") });
    }
};
person NovaŜancO    schedule 14.01.2021
comment
Есть ли неофициальный дистрибутив jQuery с этим исправлением? Может ли это предотвратить предупреждение маяка? - person user1340531; 23.03.2021
comment
думаю, вам нужно удалить ! перед ns.includes - person Omu; 17.05.2021

Как сделать слушателей событий пассивными для повышения производительности прокрутки. Чтобы решить эту проблему:

  1. Перейдите в основной файл темы.
  2. Найдите header.php или вы можете использовать плагин для вставки кода в заголовок.
  3. Скопируйте код и вставьте его в файл header.php.
  4. Если вы собираетесь использовать код в header.php, я настоятельно рекомендую вам использовать открывающий и закрывающий теги PHP.

введите описание изображения здесь

  <script>!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){var e,t=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"];if(function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}()){var n=EventTarget.prototype.addEventListener;e=n,EventTarget.prototype.addEventListener=function(n,o,r){var i,s="object"==typeof r&&null!==r,u=s?r.capture:r;(r=s?function(e){var t=Object.getOwnPropertyDescriptor(e,"passive");return t&&!0!==t.writable&&void 0===t.set?Object.assign({},e):e}(r):{}).passive=void 0!==(i=r.passive)?i:-1!==t.indexOf(n)&&!0,r.capture=void 0!==u&&u,e.call(this,n,o,r)},EventTarget.prototype.addEventListener._original=e}});</script>

person Community    schedule 22.07.2021