Данный раздел демонстрирует, как должна работать универсальная система отслеживания данных на сайтах SPA на примере фреймворка React.
Универсальность реализуется с помощью использования уровня данных - dataLayer, в качестве слоя в который сайт отправляет все аналитические события, в том числе событие "просмотра страницы" - pageview. Как только новая (виртуальная) страница загружается, в dataLayer отправляется событие с параметрами, необходимыми для отслеживания просмотров страниц. С помощью Google Tag Manager данное событие можно отправить в любую аналитическую или рекламную систему, тег которой добавлен в GTM.
Окей, здесь мы пропустим длинные описания более менее всем понятных вещей:
С охотой поясню эти вещи при необходимости в беседе.
Я просмотрел достаточно большое число готовых решений, доступных на github – некоторые в своей основе содержат рациональный подход, но имеют ограничения, в частности большинство решений настроено исключительно на GA. Другие, хотя и более универсальные, но на мой взгляд перегружены кодом — они создают свой API или просто имеют непрозрачный алгоритм, который трудно полностью протестировать и понять. Поэтому я решил взять за основу наиболее эффективные на мой взгляд подходы и постарался объединить их в данном простом решении.
Некоторые ссылки на источники, которые я использовал:
Как универсальное аналитическое решение работает.
Сайт отправляет аналитическое событие не в каждую систему аналитики по отдельности, а только один раз - в dataLayer. Google Tag Manager отслеживает события в dataLayer и сопутствующие значения параметров. Все теги развернутые в GTM могут воспользоваться этими данными и при необходимости отправить соответсвующее событие (hit) каждый в свою систему.
Модуль аналитики призван решить целый ряд задач — отправка данных о просмотре страницы (pageview), отправка данных об аналитических событиях, например, регистрация нового пользователя, отправка данных о параметрах визита, например id зарегистрированного пользователя и т. д.
В одностраничном приложении (SPA) просмотр новой страницы — это ререндеринг элементов DOM с обновлением URL адреса страницы. Т.е. открытие новой (виртуальной) страницы сопровождается рендерингом компонента с контентом, привязанного к роутингу.
Рендеринг компонента в React – это цикл шагов, от подготовки содержимого до вывода (mount). Нам нужно отправлять событие просмотра страницы один раз за данный цикл создания и вывода компонента. При этом на шаге отправки события pageview нам должны быть доступны основные параметры выводимой страницы — путь, название (title) и в случае зарегистрированного пользователя его userId.
Поэтому самым распространенным подходом является отправка события pageview на шаге componentDidMount(). Базовый код для данной части может быть таким:
componentDidMount() { const page = this.props.location.pathname; this.trackPage(page); } trackPage = page => { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "pageview", pagePath: page, pageTitle: document.title }) };
Прописывать данный код в компонентах каждой виртуальной страницы - не самый эффективный способ решения задачи, к тому же в таком случае легко забыть про какую-нибудь страницу и где-то пропустить добавление кода.
Поэтому наш аналитический модуль будет реализован, как HOC компонент, обернув который вокруг дочернего компонента мы передадим ему все аналитические функции. Назовем его к примеру WithAnalytics. Базовый код аналитического модуля, как HOC компонента может быть таким:
// analytics.js import React from "react"; export default Component => class WithAnalytics extends React.Component { componentDidMount() { const page = this.props.location.pathname; this.trackPage(page); } trackPage = page => { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "pageview", pagePath: page, pageTitle: document.title }) }; render() { return ( <Component {...this.props} /> ) } };
Тогда в основном модуле навигации (routing) мы можем подключить наш аналитический модуль к дочерним компонентам следующим образом:
import WithAnalytics from "./analytics"; ° ° ° ° ° ° <Route path="/login" component={WithAnalytics(Login)} /> <Route exact path="/" component={WithAnalytics(Home)} /> <Route path="/category" component={WithAnalytics(Category)} /> <PrivateRoute path="/admin" component={WithAnalytics(Admin)} /> <Route path="/products" component={WithAnalytics(Products)} />
Это самая базовая реализация модуля универсальной аналитики на сайте. Следующимми шагом будет подключение отслеживания других аналитических событий помимо события pageview.
Данный подход естественно может быть скорректирован в плане конечного кода, если используются дополнительные надстройки или расширения для React сайтов, например, генераторы статических страниц. Суть по прежнему та же — привязать отправку события просмотра страницы в dataLayer при обновлении страницы, когда меняется ее адрес и заголовок.
Генераторы статических сайтов могут иметь встроенные функции (файлы конфигурирования) и возможность подключения плагинов (нас интересует плагин GTM), которые облегчают данную задачу.
К примеру, сайт, работающий на генераторе Gatsby, может реализовать отправку события просмотра страницы pageview в dataLayer с помощью следующего кода в файле конфигурирования gatsby-browser.js:
exports.onRouteUpdate = () => { return setTimeout(() => { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "pageview" });}, 300); }
Резюмируя, можно сказать, что для успешной технической имплементации систем аналитики на React сайтах нужно понимать принципы работы одностраничных приложений (SPA), уметь читать и понимать техническую документацию аналитических систем, т. е. понимать работу соответвующих javascript-сниппетов и знать основы отладки javascript кода.
При развертывании расширенной электронной коммерции отладка и проверка кодов может занять больше времени, чем сама первичная имплементация.