Ускоренная Яндекс Метрики по жалобам от Google PageSpeed Insights
Яндекс Метрика на стероидах чтобы не плакал Google PageSpeed Insights

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Что не так с Яндекс Метрикой?

Время постоянно укоряется и мобильные телефоны сейчас мощнее большинства офисных компьютеров. Однако, поисковые машины всё время заворачивают гайки для сайтов и выкручивают руки вебмастерам, требуя всё больших и больших скоростей от обычных сайтов. Видимо, чтобы выдавить их совсем из интернета так, чтобы остались только топовые поисковые сервисы и не менее топовоые социальные сети. Тогда можно будет в полную силу развернуться и нажиться на этом... Ну а пока имеем то, что имеем, - ужесточение требований к сайтам.

Итак, Google PageSpeed Insights выдаёт красные и оранжевые попугайские крылышки тем, кто не перевёл свой сайт на Турбо-страницы (от Яндекса или от Google). А почему? А потому что мощности у гигантов IT-индустрии конечно и сервера мощнее, и кабеля толще, и капитализация больше. Ну весь смысл в этом (как я вижу) в том, чтобы иметь возможность полностью контролировать трафик и действия пользователей в Интернете. На чужих серверах не особо забалуешь, а вот на своих можно творить всё, что захочется (в рамках законов физики и умения программистов-наёмников).

И вот тут начинается "самое интересное". Стоит поставить бесплатный сервис сбора статистики Яндекс Метрику или всю ту же Google Analytics, как скорость загрузки сайта резко падает. (С их то мощностями, да такие вот провалы. Но что имеем, то имеем.) Есть вариант написать собственный сервис обработки статистики у себя на сервере (или взять готовый), но это дополнительные ресурсы, которые нужны ещё много для чего, помимо замены бесплатных, но тормознутых сервисов от IT-гигантов на собственные локальные.

И вот, в очередной раз измерив количество попугайских крылышек, я озадачился этим вопросом и нашёл интересную статью по ускорению работы Яндекс Метрики. Вернее, по уменьшению её тормозов. Через некоторое время опробовал свой модифицированный вариант "смазки" этих тормозов. И он оказался рабочим. Им и поделюсь ниже.

За счёт чего можно ускорить Яндекс Метрику?

Немного теории (из статьи по ссылке выше)...

Код Яндекс.Метрики работает на JavaScript (что не удивительно), поэтому нужно отталкиваться от того, что есть события, которые хорошо бы отложить до того, как все попугайские крылышки поисковыми ботами будут посчитаны.

А конкретно, есть несколько способов отложить выполнение JavaScript на странице:

  • По счётчику через setTimeout.
  • По событию загрузки DOM дерева DOMContentLoaded.
  • По пользовательскому событию: scroll, touchstart, click, mouseenter.

В итоге получим предварительную проверку на все эти события, и если ничего не происходит, то Яндекс Метрику не запускаем!

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

Оригинальный код ускорения Яндекс Метрики, предлагаемый для установки в functions.php WordPress

В принципе, всё ясно из комментариев:

add_action(
  'wp_footer',
  function() {
    ?>
    <script type="text/javascript">
            ( function () {
                'use strict';
 
                // Флаг, что Метрика уже загрузилась.
                var loadedMetrica = false,
                    // Ваш идентификатор сайта в Яндекс.Метрика.
                    metricaId     = 0123456789,
                    // Переменная для хранения таймера.
                    timerId;
 
                // Для бота Яндекса грузим Метрику сразу без "отложки",
                // чтобы в панели Метрики были зелёные кружочки
                // при проверке корректности установки счётчика.
                if ( navigator.userAgent.indexOf( 'YandexMetrika' ) > -1 ) {
                    loadMetrica();
                } else {
                    // Подключаем Метрику, если юзер начал скроллить.
                    window.addEventListener( 'scroll', loadMetrica, {passive: true} );
 
                    // Подключаем Метрику, если юзер коснулся экрана.
                    window.addEventListener( 'touchstart', loadMetrica );
 
                    // Подключаем Метрику, если юзер дернул мышкой.
                    document.addEventListener( 'mouseenter', loadMetrica );
 
                    // Подключаем Метрику, если юзер кликнул мышкой.
                    document.addEventListener( 'click', loadMetrica );
 
                    // Подключаем Метрику при полной загрузке DOM дерева,
                    // с "отложкой" в 1 секунду через setTimeout,
                    // если пользователь ничего вообще не делал (фоллбэк).
                    document.addEventListener( 'DOMContentLoaded', loadFallback );
                }
 
                function loadFallback() {
                    timerId = setTimeout( loadMetrica, 1000 );
                }
 
                function loadMetrica( e ) {
 
                    // Пишем отладку в консоль браузера.
                    if ( e && e.type ) {
                        console.log( e.type );
                    } else {
                        console.log( 'DOMContentLoaded' );
                    }
 
                    // Если флаг загрузки Метрики отмечен,
                    // то ничего более не делаем.
                    if ( loadedMetrica ) {
                        return;
                    }
 
                    (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js", "ym");
                    ym( metricaId, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true });
 
                    // Отмечаем флаг, что Метрика загрузилась,
                    // чтобы не загружать её повторно при других
                    // событиях пользователя и старте фоллбэка.
                    loadedMetrica = true;
 
                    // Очищаем таймер, чтобы избежать лишних утечек памяти.
                    clearTimeout( timerId );
 
                    // Отключаем всех наших слушателей от всех событий,
                    // чтобы избежать утечек памяти.
                    window.removeEventListener( 'scroll', loadMetrica );
                    window.removeEventListener( 'touchstart', loadMetrica );
                    document.removeEventListener( 'mouseenter', loadMetrica );
                    document.removeEventListener( 'click', loadMetrica );
                    document.removeEventListener( 'DOMContentLoaded', loadFallback );
                }
            } )()
    </script>
    <?php
  }
);

Моя модификация кода ускорения Яндекс Метрики

Т.к. я очень люто отношусь к WordPress, предпочитая по крайней мере Joomla, то, естественно, мне потребовалось более универсальное решение:

<script type="text/javascript">
	( function () {
		'use strict';
		var loadedMetrica = false,
		metricaId     = 0123456789,
		timerId;
		if ( navigator.userAgent.indexOf( 'YandexMetrika' ) > -1 ) {
			loadMetrica();
		} else {
			window.addEventListener( 'scroll', loadMetrica, {passive: true} );
			window.addEventListener( 'touchstart', loadMetrica );
			document.addEventListener( 'mouseenter', loadMetrica );
			document.addEventListener( 'click', loadMetrica );
			document.addEventListener( 'DOMContentLoaded', loadFallback );
		}
 
		function loadFallback() {
			timerId = setTimeout( loadMetrica, 1000 );
		}
 
		function loadMetrica( e ) {
			if ( e && e.type ) {
				console.log( e.type );
			} else {
				console.log( 'DOMContentLoaded' );
			}
			if ( loadedMetrica ) {
				return;
			}

			(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
			m[i].l=1*new Date();
			for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
			k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
			(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
			ym(metricaId, "init", {
				clickmap:true,
				trackLinks:true,
				accurateTrackBounce:true,
				webvisor:true,
				trackHash:true
			});
			loadedMetrica = true;
			clearTimeout( timerId );
			window.removeEventListener( 'scroll', loadMetrica );
			window.removeEventListener( 'touchstart', loadMetrica );
			document.removeEventListener( 'mouseenter', loadMetrica );
			document.removeEventListener( 'click', loadMetrica );
			document.removeEventListener( 'DOMContentLoaded', loadFallback );
		}
	} )()
</script>
  1. В этом решении используется версия счётчика Яндекс Метрики актуальная на конец февраля 2024 года. Но, если она снова обновилась, нужно всего лишь вставить полученный код от Яндекса вместо строчек 31...42.
  2. Чтобы всё было универсальным, нужно в строке 5 поставить свой ID Яндекс Метрики (в переменную metricaId).
  3. Ну, и чтобы наверняка, можно увеличить время активации Яндекс Метрики на странице, выстави таймер не на 1000, а на 4000.

После внесения правок у себе на сайт, можно через день-два попробовать снова запузомерить показатели с помощью Google PageSpeed Insights и сравнить количество попугайских крылышек. Особенно это актуально для мобильных версий сайта.


Ещё раз спасибо Кобзарёву Михаилу Николаевичу за почти готовое решение по получению дополнительных попугайских крылышек от Google PageSpeed Insights, который жутко не любит никакие (даже от Google) сторонние счётчики статистики на сайтах.

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню