91

Продолжение поста «Почему в последнее время тормозит Pikabu?»1

UPD от администрации: убедились с пользователем, что тормоза не связаны с Адблоком: #comment_284244345. Автор удалил свою статью с Хабра.

Итак, копнём чуть поглубже и убедимся, что @pikabu и @SupportTech поступают, как мудаки. Заодно делаем ставки, за сколько этот пост удалят, а меня заблокируют.

Преабула: в последнее время у многих людей тормозит сайт. Здесь мы разберёмся, почему это происходит. Внимание, много минифициваронного кода!

Для ЛЛ: если в браузере запущен AdBlock, то в код страницы встраивается скрипт, специально тормозящий сайт.

При загрузке сайта в app.js выполняется вот такая милая функция:

Продолжение поста «Почему в последнее время тормозит Pikabu?» Пикабу, Нововведение, Web-программирование, Adblock, Жалоба, Ответ на пост, Длиннопост

Что она делает? Она создаёт невидимый элемент с именами классов, соответствующих рекламе. В этом можно убедиться, поставив точку останова непосредственно при добавлении этого элемента:

Продолжение поста «Почему в последнее время тормозит Pikabu?» Пикабу, Нововведение, Web-программирование, Adblock, Жалоба, Ответ на пост, Длиннопост

Далее происходит небольшая пауза (o.W вызывает requestAnimationFrame), после которой в цикле с небольшими задержками (i.g ведёт на setTimeout) проверяется, не изменился ли стиль этого элемента определённым образом (см. функцию h). Если изменился - значит AdBlock присутствует и скрыл этот элемент, как рекламу. Если изменений нет - то и AdBlock нет, всё просто.

Результат этой функции передаётся сюда:

Продолжение поста «Почему в последнее время тормозит Pikabu?» Пикабу, Нововведение, Web-программирование, Adblock, Жалоба, Ответ на пост, Длиннопост

K.P - это та самая функция определения AdBlock, что выше.

Проверяется домен (видимо, чтобы на localhost у разработчиков не срабатывало). Далее в cookie с названием "bs" пишется определённое значение: латинская буква и цифра ("K0", "A1"). Если AdBlock присутствует, пишется "1". Если отсутствует - пишется "0".

Как известно, cookie - по сути единственный способ, которым браузер может общаться с бэкендом без каких-либо дополнительных операций.

Если в куке стоит нолик, то всё нормально, и в коде страницы нет ничего подозрительного. Но как только мы включим AdBlock, и в куке будет написана единичка... В код страницы сразу же встраивается вот такая хрень:

Продолжение поста «Почему в последнее время тормозит Pikabu?» Пикабу, Нововведение, Web-программирование, Adblock, Жалоба, Ответ на пост, Длиннопост

Весь вот этот блок целиком, да. Особенно интересна вот эта часть:

Продолжение поста «Почему в последнее время тормозит Pikabu?» Пикабу, Нововведение, Web-программирование, Adblock, Жалоба, Ответ на пост, Длиннопост

Во-первых, этот код делает синхронный XHR-запрос к серверу. Синхронные запросы отличаются тем, что заставляют вкладку браузера подвиснуть до тех пор, пока запрос не будет выполнен. Этим и обусловлены тормоза у пользователей - они происходят из-за того, что браузер выполняет синхронный запрос к серверу. Для того, чтобы сделать запрос асинхронным и ничего не тормозить, достаточно добавить true третьим параметром. Но тогда пользователи ведь продолжат пользоваться AdBlock, верно?

Во-вторых, этот код скачивает непонятно какой скрипт с сервера и выполняет его. В скрипте может содержать что угодно. Но в принципе, это мелочи, мы и так не можем контролировать скрипты на сайте.

При этом товарищи из @SupportTech предлагают отключать расширения, в том числе AdBlock, чтобы ничего не тормозило. Логично, вы ведь сами добавили тормоза, если AdBlock включен.

@Pikabu, @SupportTech, ваши комментарии?

P. S. Запрещаю переносить этот пост в сообщества, так как это не является багрепортом или предложением по сайту.

Правила сообщества

Сообщество для аккумуляции всего фидбека по Пикабу


Если вы предлагаете новую функцию, опишите подробно:

- Задачу, которую выполняет предлагаемое изменение;

- Возможные плюсы и минусы;

- Версию Пикабу, для которой делаете предложение.


Пожалуйста, имейте в виду, что предложение:

- Должно быть полезным, понятным и простым;

- Должно быть востребованным пикабушниками;

- Не должно создавать визуального нагромождения.

3
Автор поста оценил этот комментарий
Формально можно притянуть как отзыв. Жду статьи на Хабре.
раскрыть ветку (1)
Автор поста оценил этот комментарий
Официальный ответ

Привет.


Подобный скрипт действительно существует. Да, работа скрипта не идеальна и может вызывать замедления и мы работаем над его оптимизацией. Но нет, у скрипта нет целей притормаживать Пикабу или же мотивировать отключить блокировщик. Любое замедление ресурса вредит не только пользователям, но и самому ресурсу, поэтому нам бы очень хотелось избегать любых таких явлений.


Мы действительно рекомендуем в случае возникновения технических проблем отключать блокировщики и плагины. Связано это как с поиском истоков возникающих проблем, так и отсутствием возможности гарантировать стабильную работу ресурса, когда на него влияют другие программы.


Например, часть пользователей столкнулась с неработающим полем написания комментария или отсутствующими реакциями под постом. Источником проблем оказались блокировщики, которые стали захватывать блоки сайта, которые не относятся к рекламе. Что-то получилось поправить по горячем следам, что-то правим или ищем и в данный момент.

раскрыть ветку (1)
10
Автор поста оценил этот комментарий

Окей, рассматриваем факты.

1. Вы публично утверждали, что вас не было обновлений, влияющих на работу сайта с блокировщиками рекламы. При этом по факту они таки есть.

2. Про возможные фризы от использования синхронных запросов широко известно, это исправляется элементарно. Следовательно, есть лишь две причины их использования:

* либо они используются намеренно по какой-либо причине;

* либо ваши разработчики почему-то не знают про это, причём код прошёл весь процесс ревью и никто этого не заметил.
3. В скрипте, которые вы загружаете этими запросами, содержится код для работы сервиса AdFox от Яндекса. Весь этот синхронно загружаемый скрипт нужен лишь для другой рекламы, в этом скрипте нет никаких исправлений для сайта и его стабильной работы.

показать ответы
Автор поста оценил этот комментарий

Мы нигде не говорили, что это "улучшающий" скрипт или что-то такое =) Только то, что посмотрим, что сделать, чтобы он не мешал пикабушникам. Спасибо за ваш фидбек по нему, я его записал.


Сам скрипт - это старая история, и обновлений мы никаких не делали. Сообщения же об ошибках у пользователей - история последних полутора-двух недель. Мы вполне справедливо утверждаем, что к ним привели не наши действия.

раскрыть ветку (1)
8
Автор поста оценил этот комментарий

Я со своей стороны также справедливо утверждаю, что запустил профилировщик и увидел два фрейма по несколько секунд, соответствующих синхронно выполняемым xhr.open.

И точно так же справедливо утверждаю, что виноват не AdBlock, а ваш код.

Справедливости ради, сегодня я тормозов с ними почему-то не наблюдаю - возможно потому, что теперь они грузятся быстрее (0.5с против 1-3с ранее), и браузер в это время тупо занят другими делами (грузит картинки и т. п.)

7
Автор поста оценил этот комментарий

Вот это нифига себе молодцы)


и кто же из эффективных манагеров эту идею придумал? гвоздь в голову бы ему вколотить

раскрыть ветку (1)
8
Автор поста оценил этот комментарий

Наверняка тот же, кто придумал убрать минусы ;)

Автор поста оценил этот комментарий

Ну а может они отслеживают Адблок и скриптами запускают тот функционал, который он режет?

раскрыть ветку (1)
7
Автор поста оценил этот комментарий

Пусть бы и запускали. Но они используют функцию xhr.open в синхронном режиме, что приводит к тормозам. Причём про эти тормоза написано буквально везде, а чтобы их избежать - нужно лишь добавить один параметр. Т. е. вместо

xhr['op'+'en']('GET', 'https://http-check-headers.yandex.ru');

нужно написать

xhr['op'+'en']('GET', 'https://http-check-headers.yandex.ru', true);

7
Автор поста оценил этот комментарий

ТС, на 4pda напиши это. Здесь удалят.

раскрыть ветку (1)
7
Автор поста оценил этот комментарий

Готовлю пост на Хабр, так что не страшно.

12
Автор поста оценил этот комментарий

@SupportCommunity, прошу убрать пост из сообщества, так как он не соответствует теме сообщества. В посте нет отзывов либо предложений. Пост является разбором исходного кода. Перенесите в сообщество по программированию в таком случае.

показать ответы
3
Автор поста оценил этот комментарий

ТС, так Вы опровергаете это заявление Администрации?

Иллюстрация к комментарию
раскрыть ветку (1)
4
Автор поста оценил этот комментарий

О, кстати да. @NightyDwarf, призываю в тред, как автора подобного официального ответа: #comment_283911331

показать ответы
Автор поста оценил этот комментарий

Так а Ваши какие выводы то?

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

На сайте специально определяется AdBlock, и если он используется - то при открытии любой страницы сайта запускается два запроса (один за другим), тормозящие браузер. AdBlock сам по себе ни в чём не виноват.

показать ответы
1
Автор поста оценил этот комментарий

Согласен, мой косяк, перепутал и с чего-то решил, что по умолчанию запрос будет синхронным. Но ранее натыкался именно на синхронные запросы, см. тут: Почему в последнее время тормозит Pikabu?

Конкретно этот пост отредактировать уже не получится, с Хабра пост снёс.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Изначально тот код, из вышеперечисленного поста, находился в одном из скриптов, загружаемых через AJAX. Поэтому я и стал копать в сторону подозрительных подгрузок скриптов, в итоге наткнулся на код, определяющий Adblock.

Короче говоря, проблема была, но с рекламой она никак не связана.

Приношу свои извинения @pikabu и @SupportTech, был неправ.

показать ответы
2
Автор поста оценил этот комментарий

Автор, там вам на хабре неудобный вопрос задали... (Ссыль на мануал https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequ... )

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Согласен, мой косяк, перепутал и с чего-то решил, что по умолчанию запрос будет синхронным. Но ранее натыкался именно на синхронные запросы, см. тут: Почему в последнее время тормозит Pikabu?

Конкретно этот пост отредактировать уже не получится, с Хабра пост снёс.

показать ответы
0
Автор поста оценил этот комментарий

Не против, если мы внесем это уточнение в пост?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Только за.

Pikabu vs AdBlock - сюда заодно тоже.