Задайте вопрос и получите краткое содержание документа через любого ИИ-провайдера на этой странице
История версий
- "Init doc — пакет @intlayer/analytics, отслеживание на уровне провайдера/узла, A/B-тестирование, дашборд"v9.0.008.07.2026
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Документация Intlayer Analytics
@intlayer/analytics — это дополнительный пакет, который показывает, какой контент на самом деле видят ваши посетители (какая страница, в какой локали и какой именно фрагмент переведенного контента), чтобы вы могли лучше понимать свою аудиторию и проводить A/B-тестирование контента.
Содержание
Что отслеживается
@intlayer/analytics объединяет в пакеты три типа анонимных событий:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Событие | Где фиксируется | О чем оно говорит |
|---|---|---|
page_view | На уровне провайдера (IntlayerProvider) | Какую страницу и локаль просмотрел пользователь при начальной загрузке, смене маршрута или смене локали. |
content_exposure | На уровне узла (useIntlayer / плагины) | Какой ключ словаря / путь к ключу был фактически разрешен и отображен — и, если это часть эксперимента, какой вариант. |
conversion | Везде, где вызывается useConversion() | Достижение цели (регистрация, клик, покупка...), связанное с A/B-вариантом, который видел пользователь в этой сессии. |
События собираются в памяти и отправляются как один пакетный запрос примерно каждые 20 секунд — а не при каждом нажатии клавиши или рендеринге — поэтому аналитика никогда не влияет на время первого рендеринга и не добавляет запросы на каждое взаимодействие.
Как это работает для A/B-тестирования контента
Intlayer уже позволяет вам объявлять Варианты контента (например, словарь hero-banner с вариантами control и black_friday). @intlayer/analytics замыкает цикл:
getVariant(experimentKey, variants)детерминированно назначает каждую анонимную сессию варианту — это чистая функция от ID сессии и ключа эксперимента, поэтому назначение стабильно на протяжении всей сессии и не требует серверных запросов до первого рендеринга (без мерцания и сдвигов макета).- Каждое событие
content_exposureсодержит показанныйvariant. useConversion()позволяет связать цель (например,"cta_click") с этим вариантом.- Эндпоинт результатов экспериментов в дашборде сравнивает коэффициенты конверсии по вариантам, включая статистическую значимость (z-тест).
Установка
@intlayer/analytics — это одноранговая (peer), опциональная зависимость. Фреймворки не устанавливают её автоматически. Добавьте её вместе с intlayer:
Копировать код в буфер обмена
npm install @intlayer/analyticsЕсли вы её не установите, все точки интеграции будут разрешаться в пустые операции (no-op) — см. Нулевые затраты, если не установлено ниже.
Настройка
Аналитика повторно использует существующий блок конфигурации editor — вам не нужно заполнять отдельную схему конфигурации для analytics:
Копировать код в буфер обмена
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
backendURL: "https://back.intlayer.org", // Также используется как конечная точка для сбора аналитики
clientId: "your-client-id", // Также используется как ключ проекта аналитики
clientSecret: "your-client-secret",
},
};
export default config;editor.backendURL— базовый URL, на который отправляются события аналитики (POST {backendURL}/api/analytics/events).editor.clientId— открытый ключ проекта, присваиваемый каждому принятому событию. Он также действует как переключатель включения: аналитика остается полностью отключенной (и удаляется при tree-shaking, см. ниже), пока не настроенclientId.
Если вы самостоятельно размещаете (self-host) Intlayer, аналитика автоматически указывает на ваш собственный экземпляр, поскольку она использует общий editor.backendURL.
Поддержка фреймворков
Аналитика встроена в общий IntlayerProvider из react-intlayer, поэтому она доступна уже сегодня везде, где используется этот провайдер:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Фреймворк | Статус |
|---|---|
| React | ✅ Доступно |
Next.js (next-intlayer) | ✅ Доступно (через react-intlayer) |
React Native / Expo (react-native-intlayer) | ✅ Доступно (через react-intlayer) |
| Vue, Svelte, Angular, Solid, Preact, Lit, Astro, Vanilla | 🚧 Запланировано — тот же клиент, привязки на уровне провайдера по образцу развертывания @intlayer/editor |
Использование
Автоматическое отслеживание на уровне провайдера
Никаких изменений в коде не требуется. Как только установлен @intlayer/analytics и настроен editor.clientId, IntlayerProvider автоматически:
- инициализирует клиент аналитики при монтировании,
- записывает
page_viewпри начальной загрузке, - записывает
page_viewпри каждой смене локали, - запускает цикл очистки (flush) с интервалом около 20 с и отправляет оставшиеся события при размонтировании / закрытии вкладки (через
navigator.sendBeacon, с откатом наfetch(..., { keepalive: true })).
Автоматическое отслеживание на уровне узла
Каждый раз, когда useIntlayer разрешает фрагмент контента для отображения, интерпретатор сообщает о событии content_exposure для этого точного dictionaryKey + пути к ключу + локали — опять же, никаких изменений в коде не требуется. Повторяющиеся показы одного и того же узла в пределах окна очистки объединяются в одно событие со счетчиком (count), поэтому список, перерисовывающийся 50 раз, не отправляет 50 событий.
Отслеживание конверсий для A/B-тестирования
Используйте useConversion(), чтобы связать цель с вариантом, который видела сессия:
Разрешение варианта на стороне клиента
Конфиденциальность и производительность
- Анонимность по дизайну: сессии идентифицируются по ротируемому id; сервер когда-либо сохраняет только SHA-256 хэш этого id — никогда сам id и никогда IP-адрес.
- Приблизительное местоположение: только код страны, полученный из заголовков геолокации CDN (
cf-ipcountry,x-vercel-ip-country, ...) — IP не считывается и не сохраняется. - URL исключают параметры поиска по умолчанию, поэтому строки запроса никогда не фиксируются.
- Семплирование:
sampleRateпозволяет сохранять только часть событий показа контента в приложениях с высоким трафиком. - Пакетная передача: один запрос примерно каждые 20 секунд (
flushInterval) или раньше, если буфер заполнен (maxBufferSize) — никогда не отправляется один запрос на каждое событие.
Нулевые затраты, если не установлено
@intlayer/analytics следует тому же паттерну опциональных зависимостей, что и @intlayer/editor:
- каждая точка интеграции загружает пакет через динамический
import(), обернутый вtry/catch— приложение, которое никогда не устанавливает@intlayer/analytics, не увеличивает размер сборки (bundle) и не тратит ресурсы во время выполнения, а также никогда не видит ошибок; - переменная окружения времени компиляции (
INTLAYER_ANALYTICS_ENABLED), автоматически устанавливаемая в'false'пакетом@intlayer/config, когда не настроенeditor.clientId, позволяет бандлерам удалять весь код интеграции (dead-code-eliminate); - аналитика отключена внутри iframe предварительного просмотра редактора/CMS Intlayer, поэтому сессии в редакторе никогда не учитываются как реальный трафик.
Дашборд: Страница Analytics
Как только ваш проект соберет события, страница Analytics в дашборде Intlayer (видна в боковой панели после выбора проекта) покажет:
- Активные пользователи — уникальные посетители за выбранное скользящее окно (7 / 30 / 90 дней).
- Пользователи сегодня и пользователи за последние 7 дней.
- Просмотры страниц за выбранное окно.
- График динамики уникальных посетителей по дням.
- Вкладки с разбивкой по Локалям и Местоположению, ранжирующие вашу аудиторию по локали и по стране.
Справочник API бэкенда
Все эндпоинты для чтения требуют аутентификации; прием данных публичный и ассоциируется по clientId в теле запроса.
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Метод | Эндпоинт | Описание |
|---|---|---|
POST | /api/analytics/events | Прием пакета событий (публичный, ассоциируется по clientId в теле). |
GET | /api/analytics/overview | Общие показатели страниц/локалей для аутентифицированного проекта. |
GET | /api/analytics/audience?days=30 | Уникальные посетители, просмотры страниц, серии по дням, разбивка (локаль + страна). |
GET | /api/analytics/content-stats | Общие показатели показов контента, сгруппированные по ключу словаря / пути / локали. |
GET | /api/analytics/experiments/:experimentKey | Коэффициенты конверсии по вариантам и статистическая значимость для A/B-теста. |
Вы также можете вызывать их программно с помощью CMS SDK:
Копировать код в буфер обмена
import { createIntlayerCMS } from "@intlayer/api";import { analyticsEndpoint } from "@intlayer/api/analytics";const cms = createIntlayerCMS();const { data: audience } = await analyticsEndpoint(cms).getAudience(30);