Как установить метрику в приложение на Next.js? Нужно код счетчика вставить в шаблон таким образом, чтобы он присутствовал на всех страницах сайта.
Для этого я буду использовать код счётчика и компонент, который будет отслеживать изменения в URL-адресе и фиксировать просмотры.
Решение основано на официальной документации Яндекса.
Код счетчика
Для подключения Яндекс Метрики к Next.js используем компонент <Script />.
Код счетчика Яндекс Метрики для Next.js
Вместо XXXXXXXX вставляем свой id счетчика.
Не забудьте указать defer: true, это отключит автоматическую отправку данных о просмотрах.
Согласно официальной документации яндекса по установке и настройке счетчика для SPA-сайтов, фиксировать показы страниц необходимо с помощью функции hit, ее нужно вызывать при каждом изменении страницы.
Используем hit внутри компонента YandexMetrika(). Показы будут фиксироваться при изменении URL-адреса или параметров в нем.
Код компонента YandexMetrika
components\YandexMetrika\YandexMetrika.jsx
Вместо XXXXXXXX вставляем свой id счетчика.
Код счётчика и компонент готовы. Теперь покажу пример подключения для более старого Next.js: Pages Router и нового App Router.
Используя Next.js: App Router
В случае с использованием App Router, вставляем счетчик яндекс метрики в файл layout.tsx перед закрывающим тегом body.
app\layout.tsx
Туда же импортируем компонент <YandexMetrika />, который будет отправлять данные в метрику при изменении URL-адреса или параметров в нем и добавляем в наш Layout. Для Next.js 14 оборачиваем компонент в <Suspense>, чтобы избежать prerendering Error.
Для чистоты кода, можете вынести <Script /> с счетчиком в отдельный компонент или оставить как в примере.
Используя Next.js: Pages Router
В случае с использованием Pages Router, я вставляю счетчик яндекс метрики в _document.tsx.
src\pages\_document.tsx
Компонент <YandexMetrika /> будет находиться внутри общего макета <Layout />, в проекте он у меня один, поэтому я создал Custom App (файл _app.tsx) и обернул его этим макетом.
src\components\Layout\Layout.tsx
src\pages\_app.tsx
Подробнее про единый Layout и Custom App написано в официальной документации: Pages and Layouts