
Подключение счётчика Яндекс Метрики к Next.js приложению
Одним из важнейших аспектов поддержки любого сайта является работа с аналитикой.
Аналитические счётчики для сайтов играют ключевую роль в понимании поведения посетителей и оптимизации веб-ресурсов. Они позволяют владельцам сайтов собирать ценные данные о посетителях, источниках переходов, поведении пользователей на страницах сайта и многом другом.
В этой статье я расскажу о нескольких способах подключения счётчика Яндекс Метрики к Next.js приложению.
Однако, все эти способы очень похожи и для того чтобы лучше их понять и грамотнее их использовать, начнём с написания собственного решения.
Написание собственного решения
Итак, нам нужно:
- создать компонент, который будет загружать счётчик на страницу,
- добавить этот компонент в Root Layout,
- научиться обрабатывать события перехода между страницами,
- а также научиться прокидывать любые другие события в счётчик
Создание компонента
Итак, наш компонент должен:
- Загрузить скрипт Яндекс Метрики с указанными настройками;
- Предоставить методы для работы с API Яндекс Метрики;
Загрузка скрипта
Добавим компонент YandexMetrikaInitializer.
Он будет принимать id счётчика и набор параметров счётчика и рендерить Script-компонент, с кодом загрузки счётчика метрики с указанными параметрами.
Это тот самый код, который можно получить в личном кабинете Яндекс Метрики при создании счётчика.
В итоге должно получиться нечто похожее:
Набор параметров счётчика
Вот список параметров счётчика, взятый из официальной доки.
Добавление компонента в Root Layout
Теперь нам надо добавить наш компонент в Root Layout.
Обратите внимание, что инициализировать компонент лучше внутри тега head.
Обработка перехода между страницами
При переходе между страницами Next.js не всегда перерендеривает весь Layout.
Это одна из встроенных в фреймворк оптимизаций, она позволяет снизить время перехода между страницами приложения.
Однако нам сейчас это поведение вредит и не позволяет полноценно отслеживать переходы посетителя между страницами.
Как это победить? Надо просто подписаться на события изменения URL. Сделать это можно используя хуки usePathname и useSearchParams встроенного пакета next/navigation, а также воспользовавшись react-хуком useEffect.
Обернём наш компонент для инициализации в контейнер. Назовём его YandexMetrikaContainer и подпишемся на изменения URL.
Отлично, теперь мы можем видеть в консоли сообщение о том что адрес страницы изменился. Но как передать эту информацию в счётчик?
Для этого нужно воспользоваться одним из встроенных методов Яндекс Метрики под названием hit.
Для удобства, давайте обернём вызов этого метода в хук и назовём его useYandexMetrika.
Вот так выглядит описание типов YandexMetrikaHitOptions и YandexMetrikaHitParams:
Теперь используем наш хук при переходе между страницами, должно получиться примерно так:
Важно! Если вы используете серверный рендеринг, не забудьте обернуть YandexMetrikaContainer в Suspense-тег для того чтобы не сломать его.
Отправка событий в счётчик
Отправить любое другое событие в счётчик можно похожим образом.
Просто расширим хук useYandexMetrika новыми методами, например для использования события reachGoal, можно добавить следующий метод:
В итоге код нашего хука будет выглядеть следующим образом:
Использовать другие методы можно аналогичным образом.
На этом всё, по большому счёту, для использования Яндекс Метрики в Next.js приложении больше ничего делать не надо.
Использование пакета react-yandex-metrika
Можно написать своё решение, а можно воспользоваться одним из уже готовых пакетов, например react-yandex-metrika.
Итак, для этого нам нужно:
- создать компонент, который будет загружать счётчик и передавать ему события,
- подписаться на события перехода между страницами,
- добавить компонент в Root Layout,
- не прокидывать события при локальной отладке страниц
Создание компонента
Сначала установим пакет:
Далее нам необходимо создать компонент, назовём его YandexMetrikaContainer.
Так как счётчик должен быть Клиентским компонентом, то в файл с компонентом, перед всеми импортами, необходимо добавить директиву "use client".
Далее создаём простой функциональный компонент, использующий YMInitializer из пакета react-yandex-metrika.
Прокидываем в него номер счётчика и другие необходимые нам настройки счётчика.
Но это ещё не всё, помимо загрузки счётчика, нам нужно отправить в него событие попадания на страницу.
На этом бы можно было остановиться, но при переходе между страницами Next.js не рендерит весь Root Layout, поэтому событие будет вызвано только 1 раз.
Что бы исправить ситуацию, нам нужно подписаться на событие перехода между страницами.
Подписка на события перехода по страницам
Next.js Содержит в себе пакет Router, который позволяет подписаться на нужное нам событие.
Выглядит это следующим образом:
В итоге у нас должно получиться вот так:
Теперь настало время добавить компонент в Root Layout.
Добавление в Root Layout
Тут всё довольно просто, я решил добавить компонент после закрывающего тега .
Работа в Dev режиме
Также мне не нужно чтобы счётчик срабатывал когда я запускаю приложение в режиме отладки, поэтому неплохо бы добавить какой-то признак того что мы в режиме отладки
В итоге использование компонента будет выглядеть следующим образом:
Итоговый результат
Итоговый код компонента YandexMetrikaContainer
Итоговый код компонента Root Layout
Альтернативные решения
Вот ещё пара похожих пакетов react-metrika и next-yandex-metrika.
Все они делают примерно одно и то же. Подробно останавливаться на них не вижу смысла.
На этом всё, спасибо за внимание! 🎉
Подписывайтесь на мой Youtube канал и на Telegram 🙂