@rkaliev/nuxt-yandex-metrika
@rkaliev/nuxt-yandex-metrika
Русский | English
Модуль Nuxt 4 для Яндекс Метрики.
Возможности
- Nuxt 4, типизированный API, типизированные
$yandexMetrikaи runtime config - Composable
useYandexMetrika(), безопасный для SSR - Автоматический учёт просмотров страниц, включая страницу входа, с заголовками страниц
- Mock API в режиме разработки с отладочным логированием
- Корректный откат, если скрипт не загрузился
- Поддержка пикселя
<noscript> - Ожидание согласия на cookie (
requireConsent): до вызоваgrantConsent()ничего не загружается и не отправляется
Установка
npm install @rkaliev/nuxt-yandex-metrika@3
Настройка
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@rkaliev/nuxt-yandex-metrika'],
yandexMetrika: {
id: '12345678', // или переменная окружения NUXT_PUBLIC_YANDEX_METRIKA_ID / YM_ID
},
})
Все опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
id |
string |
'' |
Номер счётчика Яндекс Метрики |
disabled |
boolean |
false |
Полностью отключить сбор статистики |
debug |
boolean |
false |
Выводить все вызовы API в консоль |
useCDN |
boolean |
false |
Загружать tag.js с CDN |
noJS |
boolean |
true |
Добавить пиксель <noscript> |
autoTracking |
boolean |
true |
Автоматически учитывать переходы между страницами |
requireConsent |
boolean |
false |
Запускать счётчик только после grantConsent() (см. Согласие на cookie) |
clickmap |
boolean |
true |
Карта кликов |
trackLinks |
boolean |
true |
Учёт переходов по внешним ссылкам |
accurateTrackBounce |
boolean | number |
true |
Точный показатель отказов (число задаёт порог отказа в мс) |
webvisor |
boolean |
false |
Вебвизор |
defer |
boolean |
true |
Отложенная инициализация |
triggerEvent |
boolean |
true |
Генерировать событие yacounter<id>inited |
ecommerce |
boolean | string |
false |
Контейнер данных электронной коммерции |
ut |
string |
'noindex' |
Параметр ut (запрет индексации страниц) |
trackHash |
boolean |
false |
Учитывать изменение хеша в адресной строке (см. Автотрекинг) |
sendTitle |
boolean |
true |
Передавать заголовки страниц; поставьте false, если в заголовках есть личные данные |
childIframe |
boolean |
false |
Записывать содержимое iframe без счётчика |
trustedDomains |
string[] |
[] |
Доверенные домены для записи содержимого дочернего iframe |
disableYtm |
boolean |
false |
Отключить Yandex Tag Manager на странице |
type |
number |
0 |
Тип счётчика (1 для Рекламной сети Яндекса) |
params |
object | array |
{} |
Параметры визита, передаются при инициализации (пустое значение не передаётся) |
userParams |
object |
{} |
Параметры посетителя, передаются при инициализации (пустое значение не передаётся) |
Использование
Composable (рекомендуется)
<script setup>
const ym = useYandexMetrika()
function onBuy() {
ym.reachGoal('purchase', { price: 1000 })
}
</script>
Методы API
| Метод | Описание |
|---|---|
hit(url, options?) |
Отправить просмотр страницы |
reachGoal(target, params?, callback?, ctx?) |
Отправить достижение цели |
params(params) |
Передать параметры визита |
userParams(params) |
Передать параметры посетителя |
setUserID(userID) |
Передать ID посетителя |
getClientID(callback) |
Получить ClientID |
notBounce(options?) |
Отметить визит как неотказ |
addFileExtension(ext) |
Добавить расширение файлов для учёта скачиваний |
extLink(url, options?) |
Отправить переход по внешней ссылке |
file(url, options?) |
Отправить скачивание файла |
replacePhones() |
Подменить номера телефонов |
grantConsent() |
Запустить счётчик, если задан requireConsent (иначе ничего не делает) |
$yandexMetrika
Тот же API доступен как $yandexMetrika: useNuxtApp().$yandexMetrika и $yandexMetrika в шаблонах. Он есть только на клиенте; в коде, который выполняется и на сервере, используйте useYandexMetrika().
TypeScript
useYandexMetrika(), $yandexMetrika (useNuxtApp() и шаблоны) и useRuntimeConfig().public.yandexMetrika типизированы без дополнительной настройки. Типы API экспортируются из пакета:
import type { YandexMetrikaApi, HitOptions, YandexMetrikaInitOptions, ModuleOptions } from '@rkaliev/nuxt-yandex-metrika'
При skipLibCheck: false в tsconfig TypeScript выдаёт TS2430 на PublicRuntimeConfig: Nuxt выводит для yandexMetrika более узкий тип из значений по умолчанию. Значение Nuxt по умолчанию, skipLibCheck: true, это не затрагивает.
Переменные окружения
Номер счётчика можно задать переменной окружения вместо nuxt.config.ts:
NUXT_PUBLIC_YANDEX_METRIKA_ID=12345678
# или
YM_ID=12345678
YM_ID читается только при сборке. NUXT_PUBLIC_YANDEX_METRIKA_ID читается при сборке и, как переопределение runtime config Nuxt, при запуске сервера. Пиксель <noscript> добавляется, только если номер известен при сборке.
Как это работает
- Production: загружает
tag.jsв фоне, не блокируя гидратацию, и инициализирует счётчик. Вызовы до загрузки скрипта ставятся в очередь и отправляются, когда он загрузится. Еслиtag.jsуже есть на странице (сmc.yandex.ruили с зеркала jsDelivr, в том числеtag.js?id=…из официального кода счётчика), повторно он не вставляется. - Разработка: используется mock API; с
debug: trueкаждый вызов выводится в консоль - SSR: на сервере
useYandexMetrika()возвращает пустой (noop) API, на клиенте — настоящий или mock - Скрипт не загрузился: переключается на mock API и пишет
console.error - Не задан номер счётчика: сборка выводит предупреждение (кроме
disabled: true), используется mock API disabled: true: используется mock API, ничего не отправляется
Автотрекинг
С autoTracking: true (по умолчанию) модуль отправляет просмотры страниц через hit(); defer: true не даёт счётчику отправить собственный автоматический хит, поэтому каждая страница учитывается один раз.
- Страница входа учитывается; реферер для неё Метрика берёт из
document.referrer - Учитывается каждый переход на клиенте на новый URL, включая изменение только query.
referer— предыдущий учтённый URL - Хит отправляется, когда страница отрисована, вместе с её
title. СsendTitle: falseхит отправляется безtitle, как только страница готова - Хита нет, если переход не удался или был прерван, а также если URL не изменился
- URL включают
app.baseURL - Страницы ошибок (например, 404 на клиенте) учитываются
- Пререндеренные (SSG) страницы учитываются один раз, с настоящим URL
Изменения хеша через роутер (router.push('#section'), <NuxtLink to="#section">) учитываются как любое другое изменение URL. trackHash: true включает учёт изменений хеша и в самой Метрике, поэтому изменение хеша может быть учтено дважды; сборка предупреждает об этом сочетании. Используйте что-то одно: trackHash с autoTracking: false или только autoTracking.
Известные ограничения:
- Хиты переходов опираются на хуки страниц
<NuxtPage>. Приложение без<NuxtPage>получает только хит страницы входа и хиты страниц ошибок; остальные отправляйте черезhit(). - Если асинхронная страница выбрасывает фатальную ошибку после того, как задала свой заголовок, хит получает заголовок этой страницы, а не страницы ошибки.
- Если setup асинхронной страницы выбрасывает нефатальную ошибку, эта страница и изменения её query не учитываются до отрисовки следующей страницы.
- Хит страницы ошибки ждёт её head до 300 мс. Если страница ошибки загружает содержимое лениво и это занимает дольше (стандартная страница ошибки Nuxt при медленной первой загрузке), хит получает заголовок предыдущей страницы.
Согласие на cookie
Для сайтов, которым нужно согласие на cookie до запуска аналитики (например, по 152-ФЗ), задайте requireConsent: true:
export default defineNuxtConfig({
yandexMetrika: {
id: '12345678',
requireConsent: true,
},
})
Пока не вызван grantConsent(), tag.js не загружается, счётчик не инициализируется и ничего не отправляется. Вызовы до согласия (reachGoal(), hit(), просмотры страниц от автотрекинга) отбрасываются, а не копятся в очереди; с debug: true каждый из них пишет в консоль dropped, waiting for consent: <method>. Пиксель <noscript> не добавляется: он ставил бы cookie посетителям без JavaScript, у которых согласие его не остановит. Пиксель определяется при сборке: если вы включаете requireConsent только в runtime (NUXT_PUBLIC_YANDEX_METRIKA_REQUIRE_CONSENT), задайте ещё noJS: false. Колбэк getClientID(), переданный до согласия, никогда не вызывается.
Вызовите grantConsent(), когда посетитель соглашается:
<script setup>
const ym = useYandexMetrika()
function accept() {
saveConsent() // ваш баннер сохраняет выбор
ym.grantConsent()
}
</script>
После согласия счётчик запускается и отправляет хит текущей страницы без реферера: страницы, просмотренные до согласия, не отправляются никогда, даже как реферер. Дальнейшие переходы учитываются как обычно. Повторный grantConsent() ничего не делает.
Модуль не запоминает согласие. Ваше приложение хранит его само (cookie или localStorage) и вызывает grantConsent() при каждой загрузке страницы, если посетитель уже согласился, например в клиентском плагине. Чтобы отозвать согласие, нужна перезагрузка страницы без grantConsent(): загруженный tag.js выгрузить нельзя.
Миграция с v1 (на v2)
Несовместимые изменения
- Пакет переименован:
@rkaliev/nuxtjs-yandex-metrika→@rkaliev/nuxt-yandex-metrika - Требуется Nuxt 3+
this.$yandexMetrika→ composableuseYandexMetrika()(или$yandexMetrikaчерезuseNuxtApp())defer: trueтеперь по умолчаниюnoJS: trueтеперь по умолчанию
Шаги миграции
- Обновите пакет:
npm install @rkaliev/nuxt-yandex-metrika@2 - Обновите
nuxt.config.ts:- modules: ['@rkaliev/nuxtjs-yandex-metrika'], + modules: ['@rkaliev/nuxt-yandex-metrika'], - Замените
this.$yandexMetrikaнаuseYandexMetrika()в компонентах
Обновление до 3.1
Менять код не нужно. Проверьте поддерживаемые версии Node.js в engines в package.json.
После обновления меняется статистика автотрекинга:
- Страница входа учитывается: просмотров становится больше, заметнее всего в сессиях из одной страницы
- Неудавшиеся переходы и переходы на тот же URL больше не учитываются
- Хиты передают заголовок своей страницы
Полный список изменений — в CHANGELOG.
Миграция с v2 (на v3)
Несовместимые изменения
- Требуется Nuxt 4.0.0+
- Требуется Node.js 18+ (в 3.1 требование повышено, см. Обновление до 3.1)
Шаги миграции
- Обновите пакет:
npm install @rkaliev/nuxt-yandex-metrika@3 - API не менялся — достаточно обновить зависимость
Всё ещё на Nuxt 3? Используйте линейку v2:
npm install @rkaliev/nuxt-yandex-metrika@nuxt3
Разработка
npm ci
npm run dev:prepare # Сгенерировать типы .nuxt/; нужно после каждой установки
npm run dev # Запустить playground на http://localhost:3000
npm run lint # ESLint
npm run test:types # Проверить типы модуля, тестов и playground
npm test # Unit- и интеграционные тесты
npm run test:e2e # Браузерные тесты (первый запуск: npx playwright-core install chromium)
npm run build # Собрать модуль в dist/
Выпуск версии
Версии публикуются в npm вручную запускаемым workflow Release (.github/workflows/release.yml) через npm trusted publishing: npm-токен не нужен, у каждой версии есть provenance.
Однократная настройка:
- GitHub: Settings → Environments → создать
npm(можно с обязательными ревьюерами). - npmjs.com: настройки пакета → Trusted publishing → GitHub Actions, репозиторий
rkaliev/nuxtjs-yandex-metrika, workflowrelease.yml, environmentnpm. В Allowed actions разрешите прямую публикацию: workflow вызываетnpm publish.
Для каждого выпуска:
- Поднимите
versionвpackage.json, добавьте запись вCHANGELOG.md(русский) иCHANGELOG.en.md(английский), запушьте вmasterи дождитесь CI. - Поставьте тег на коммит:
git tag vX.Y.Z && git push origin vX.Y.Z. - Actions → Release → Run workflow с этим тегом.
dry-runвключён по умолчанию: выполняются все проверки иnpm publish --dry-run. - Запустите ещё раз с выключенным
dry-run, чтобы опубликовать. Для версии, которая не должна статьlatest, укажитеdist-tag. - Создайте GitHub Release для тега.
Лицензия
Related Packages
The most powerful module to work with Yandex Metrika in your Nuxt.js application
The most powerful module to work with Google Analytics in your Nuxt.js applicati...
Add Pulse Analytics — privacy-first web analytics — to a Nuxt site with one modu...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 3.2.1 | ^3.0 | MIT | |
| 3.2.0 | ^3.0 | MIT | |
| 3.1.0 | ^3.0 | MIT | |
| 3.0.0 | ^3.0 | MIT | |
| 2.0.3 | ^3.0 | MIT | |
| 2.0.2 | ^3.0 | MIT |