Аналитика для Vue и React: сравнение методов учёта переходов
Если вы собираете российский аналог Cloudflare или просто хотите, чтобы аналитика на Vue.js и React не врала, начните с честного факта: одиночное приложение (SPA) ломает почти все классические методы учёта переходов. Google Analytics и Яндекс.Метрика ждут полной перезагрузки страницы, но в SPA её нет. Пользователь кликает по меню, URL меняется, а скрипт аналитики молчит. В итоге вы видите один визит вместо десяти, а конверсия сайта и лидогенерация считаются по кривым данным. Чем заменить Cloudflare и как при этом не потерять точность аналитики, разберём по шагам. Мы пройдём путь от History API до reverse proxy и покажем, где именно ломается учёт и как это починить.
Замена Cloudflare в России часто начинается не с защиты, а с аналитики. Логика простая: если данные о переходах собираются неправильно, все решения по трафику, нагрузке и защите принимаются вслепую. В SPA проблема усугубляется тем, что переходы между виртуальными страницами не создают новых запросов к серверу. Скрипт аналитики инициализируется один раз, при первом заходе, и дальше просто не знает, что пользователь ушёл на другой маршрут. Vue Router и React Router меняют URL через History API, но событие `popstate` само по себе не гарантирует, что аналитика его поймает. Нужно либо вручную вызывать трекинг при каждом переходе, либо перехватывать изменения на уровне роутера.
Дальше начинается самое интересное: даже если вы настроили ручной трекинг, адблоки режут запросы к аналитическим доменам. По разным оценкам, от 20 до 40 процентов пользователей в России используют блокировщики. Это значит, что до 40 процентов переходов просто не долетает до системы аналитики. Здесь на сцену выходит reverse proxy: запросы к аналитике идут через ваш собственный домен, и блокировщик их не видит. TrafficVeil, российский аналог Cloudflare, объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной веб-платформе. Он не тарифицирует ботов, атаки и WAF-блокировки, что для сайтов с высоким трафиком даёт предсказуемый бюджет. Ниже – чек-лист методов учёта переходов для Vue и React, сравнение их плюсов и ограничений, а также практические шаги по переходу с Cloudflare на российскую инфраструктуру без потери данных.
Почему классические системы аналитики не работают в SPA на Vue и React
Открываете Vue или React приложение, кликаете по ссылкам, а в Яндекс.Метрике видите один визит и одну страницу. Знакомо? Это не баг вашей аналитики, это фундаментальная особенность SPA. Разбираемся, почему так происходит и что с этим делать.
Классический сайт на PHP или статике работает по схеме “запрос – ответ”. Каждый клик по ссылке отправляет браузер на новый URL, сервер отдаёт свежий HTML, страница полностью перезагружается. Скрипт Google Analytics или Яндекс.Метрики, вставленный в шаблон, срабатывает заново. Метрика видит новый pageview, GA фиксирует переход, данные копятся корректно.
SPA ломает эту схему. Vue Router и React Router перехватывают клики по внутренним ссылкам, меняют URL через History API и подменяют компонент в DOM. Сервер в этом процессе не участвует. HTML не перезагружается. Скрипт аналитики, загруженный один раз при старте приложения, больше не выполняется. Итог: счётчики фиксируют только первый заход, а все последующие переходы между виртуальными страницами для них не существуют.
Что вы теряете на практике:
- Глубина просмотра падает до 1 страницы, хотя пользователь прошёл по пяти разделам.
- Карта кликов и вебвизор обрываются на первом экране, поведение внутри каталога или личного кабинета не видно.
- Цели на переходах (просмотр товара, открытие корзины, чтение статьи) не срабатывают, потому что URL меняется без события загрузки.
- Источники трафика искажаются: вся сессия приписывается первой странице, а UTM-метки на внутренних переходах теряются.
- Конверсия считается по заниженному знаменателю, и решения по лидогенерации принимаются на основе кривых цифр.
Особенно больно это бьёт по интернет-магазинам на Vue и React. Пользователь листает каталог, фильтрует товары, добавляет в корзину, а в отчётах это выглядит как один визит без действий. Маркетолог видит низкую вовлечённость и режет бюджет на канал, который на самом деле работает.
Есть нюансы и в том, как ведут себя сами счётчики. Яндекс.Метрика при первой инициализации ставит хит на текущий URL. Дальше она ждёт либо нового вызова hit, либо перезагрузки страницы. Google Analytics 4 работает через события: если вы не отправите page_view вручную, в отчёте будет только автоматический первый просмотр. Никакой магии, никакого фонового сканирования DOM. Скрипт делает ровно то, что ему сказали, и не больше.
Иногда разработчики пытаются обойти проблему костылями: ставят setInterval и опрашивают window.location каждые 500 мс. Работает, но грязно. Либо ловят hashchange, если приложение на hash-роутинге. Тоже вариант, но современные роутеры по умолчанию используют history mode, и hashchange не сработает. Ещё вариант – слушать событие beforeunload и отправлять данные, но в SPA beforeunload не наступает при внутренних переходах.
Ещё одна проблема – блокировщики. Даже если вы правильно настроите ручной трекинг, скрипты Google Analytics и Яндекс.Метрики режутся uBlock Origin и AdGuard у 20-40% аудитории в зависимости от ниши. Для технической аудитории цифра выше. То есть даже исправленный трекинг даёт неполную картину, и об этом стоит помнить, выбирая метод учёта.
Итог простой: в SPA на Vue и React стандартные системы аналитики без доработки фиксируют только первый заход. Дальше нужен либо ручной перехват переходов через History API и события роутера, либо проксирование запросов через reverse proxy, чтобы обойти блокировщики. Оба подхода разбираем дальше, с примерами кода для Vue Router и React Router.
Использование History API для отслеживания переходов в Vue и React
В SPA навигация не перезагружает документ. Значит, единственный надёжный сигнал о смене “страницы” – это изменение URL. History API даёт вам два рычага: методы pushState и replaceState, которые вызываются при программной навигации, и событие popstate, которое срабатывает при нажатии кнопок “назад” и “вперёд” в браузере. Перехватив оба, вы получаете полный поток переходов.
Важный нюанс: popstate не срабатывает при вызовах pushState и replaceState. Поэтому одного слушателя popstate недостаточно. Нужно либо патчить сами методы, либо использовать хуки роутера, которые вызываются на каждый переход. Первый способ универсален, второй точнее и не ломает сторонние библиотеки.
Перехват в Vue Router и React Router
В Vue Router есть глобальные хуки afterEach и beforeEach. afterEach удобнее для аналитики: он срабатывает после подтверждённой навигации, когда вы уверены, что переход состоялся, а не был отменён гардом. Вызывайте отправку события прямо там:
router.afterEach((to, from) => { sendPageView(to.fullPath); });
В React Router v6 роль хука играет компонент-обёртка с useEffect, зависящим от location:
const location = useLocation(); useEffect(() => { sendPageView(location.pathname + location.search); }, [location]);
Ключевое отличие: Vue Router даёт единую точку входа на уровне роутера, React Router заставляет монтировать компонент внутри Router-контекста. В React легко забыть про зависимость от location.search и потерять переходы с query-параметрами, например с UTM-метками при лидогенерации. Проверьте это отдельно.
popstate нужен для кнопки “назад”. В Vue Router его обрабатывает сам роутер, и afterEach сработает корректно. В React Router v6 тоже, если вы используете createBrowserRouter или BrowserRouter. Но если в проекте собственный роутер на голом History API, слушатель придётся вешать вручную:
window.addEventListener(‘popstate’, () => sendPageView(location.pathname));
Что стоит проверить в чек-листе перед релизом:
- Отправляется ли событие при первом заходе, а не только при переходах. В Vue это делает router.isReady(), в React – отдельный вызов в useEffect с пустым массивом зависимостей.
- Не дублируются ли события. В React StrictMode эффекты вызываются дважды в dev-режиме, и вы увидите двойной pageview. В продакшене этого не будет, но тестировать надо с флагом.
- Передаётся ли полный путь с query-строкой. UTM, параметры фильтров каталога, пагинация – всё это теряется, если отправлять только pathname.
- Учитывается ли hash-навигация. Если приложение использует якоря, событие hashchange нужно обрабатывать отдельно.
- Не блокирует ли отправка аналитики рендеринг. Вызывайте sendPageView асинхронно, без await в критическом пути.
Отдельная история – replaceState. Некоторые роутеры используют его для синхронизации состояния без создания записи в истории. Если вы патчите методы History API напрямую, не забудьте про replaceState, иначе потеряете часть переходов, например при редиректах внутри приложения.
По производительности разница между подходами минимальна. Один вызов на переход – это доли миллисекунды. Проблемы начинаются, когда вы вешаете слушатель на каждый компонент или подписываетесь на изменение location в десятках мест. Держите отправку в одной точке: в Vue – в afterEach, в React – в одном компоненте-обёртке верхнего уровня.
Ещё один момент: события History API не отражают реальное время просмотра. Если пользователь ушёл со страницы через 3 секунды, а вы отправили событие в момент перехода, метрика вовлечённости будет неточной. Для SPA это решается отправкой события при уходе через visibilitychange или beforeunload, но с оговоркой: браузеры не гарантируют доставку данных в beforeunload. Используйте sendBeacon, он надёжнее синхронного XHR.
И последнее в этом блоке: собранные через History API события надо куда-то отправлять. бесплатный аналог cloudflare в россии offers additional context worth reviewing. Если конечная точка – сторонний домен, часть данных срежут блокировщики рекламы. Об этом в следующем разделе, где разберём проксирование через reverse proxy.
Сравнение методов ручного трекинга в Vue и React: преимущества и ограничения
Ручной трекинг в Vue и React решает одну задачу: отправить событие pageview в момент смены маршрута. Но инструменты для этого разные, и разница проявляется не сразу, а через полгода поддержки, когда маршрутов становится 40, а разработчиков трое. Разберём по пунктам, что выбрать и чего избегать.
- Vue: Composition API даёт хук useRoute + watch, который перехватывает смену route.fullPath и вызывает трекер. Чисто, предсказуемо, легко типизируется.
- Vue Options API: миксин analyticsMixin с хуком mounted или beforeRouteUpdate. Работает, но миксины неявно смешивают логику и плохо читаются при наследовании.
- React: useEffect с зависимостью от location.pathname внутри компонента-обёртки. Плюс: явная зависимость. Минус: легко забыть про cleanup и получить двойной вызов в StrictMode.
- React: HOC withAnalytics(Component) или кастомный хук usePageView(). HOC удобен для легаси-кода, хук – для нового.
По производительности разница минимальна, если вы не устраиваете лишних ререндеров. В Vue watch на route срабатывает один раз на смену URL. В React useEffect без правильного массива зависимостей может стрелять дважды в dev-режиме и один раз в production, что даёт расхождение в отчётах. Проверяйте на staging, прежде чем верить цифрам.
Что выбрать: чек-лист по стеку
- Новый проект на Vue 3 – только Composition API. Создайте useAnalytics() с watch на route и вызывайте его в корневом компоненте. Никаких миксинов.
- Легаси на Vue 2 – миксин допустим, но изолируйте его в одном месте и задокументируйте порядок срабатывания хуков.
- React 18+ – кастомный хук usePageView() поверх useEffect. Внутри проверяйте process.env.NODE_ENV, чтобы не дублировать события в StrictMode.
- React с классовыми компонентами – HOC или componentDidUpdate. HOC предпочтительнее: одна обёртка на всё приложение.
- SSR (Nuxt, Next.js) – трекинг только на клиенте. На сервере событие отправится без user-agent и cookie, и вы получите мусор в отчётах.
- Микрофронтенды – единый трекер в shell-приложении, иначе каждое микро-приложение начнёт слать свои pageview и цифры удвоятся.
Удобство поддержки важнее микрооптимизаций. Vue-хук читается как декларация: “следи за маршрутом и шли событие”. React-хук с useEffect требует внимания к массиву зависимостей, и это главный источник багов в аналитике SPA. Если в команде есть джуны, Vue-подход снижает вероятность ошибки.
Отдельный пункт – дедупликация. При быстрых переходах (клик по меню, затем сразу по подменю) событие может уйти дважды. Добавьте троттлинг на 300-500 мс по fullPath или pathname. Иначе в отчётах появятся фантомные сессии, а конверсия сайта будет занижена.
И последнее: какой бы метод вы ни выбрали, запросы всё равно уходят на сторонний домен и режутся блокировщиками. Проксирование через reverse proxy решает это на уровне инфраструктуры, а не кода. Об этом в следующем разделе.
Обход блокировщиков рекламы через reverse proxy с TrafficVeil
По разным оценкам, от 25 до 42 процентов посетителей используют блокировщики рекламы. В нишах с технической аудиторией, там где как раз живут проекты на Vue и React, доля выше и доходит до половины трафика. Для SPA это означает простую вещь: если ваш трекер подгружается с внешнего домена вида google-analytics.com или mc.yandex.ru, значительная часть маршрутов вообще не попадёт в отчёты. Причём вы этого даже не заметите, потому что счётчик не сломается, он просто не загрузится.
Решение лежит не в коде фронтенда, а на уровне инфраструктуры. Запросы аналитики можно пропустить через собственный домен с помощью reverse proxy на TrafficVeil. Тогда браузер видит обращение к вашему же сайту, а не к известному аналитическому хосту, и фильтры адблоков его не трогают.
Как это работает на практике и что даёт для Vue и React
Логика такая: вместо прямого вызова внешнего эндпоинта фронтенд отправляет события на путь вроде /collect/ внутри вашего домена. TrafficVeil как reverse proxy принимает запрос, подменяет заголовки и проксирует его на нужный аналитический бэкенд. Для браузера это same-origin запрос, для блокировщика – часть вашего сайта. Ничего экзотического в этом нет, но выигрыш получается заметный сразу по нескольким направлениям.
- Скрипт аналитики отдаётся с вашего домена, поэтому не попадает в стандартные списки EasyList и аналогичные базы.
- События из Vue Router и React Router уходят на тот же origin, что и API, то есть CORS-настройки упрощаются, а preflight-запросы исчезают.
- Вся картина переходов между виртуальными страницами собирается целиком, а не обрывается на первом заходе.
- Запросы аналитики проходят через ту же точку входа, что и основной трафик, поэтому L7 DDoS и защита от ботов работают и для них.
Отдельный плюс для SPA: когда трекер идёт через ваш домен, он не конкурирует за соединение с внешним CDN. В React-приложениях с частой сменой маршрутов это снижает число открытых сокетов и убирает часть задержек при навигации.
Что важно понимать про сам TrafficVeil в этом сценарии. TrafficVeil является российским аналогом Cloudflare и объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной панели. То есть проксирование запросов аналитики не требует отдельного сервиса: вы настраиваете маршрут в том же интерфейсе, где уже управляете сертификатами и правилами фильтрации. SSL-сертификат на ваш домен выпускается автоматически, так что HTTPS для проксированных путей работает без ручной возни.
Ещё один момент, который часто упускают. Многие адблоки режут не только скрипты, но и запросы к известным трекинговым путям по сигнатурам в URL. Поэтому путь лучше называть нейтрально: /api/events, /metrics, /collect. И не подписывать его в коде как analytics, потому что часть фильтров анализирует и содержимое бандла. Это не паранойя, а обычная гигиена, которая даёт несколько процентов дополнительного покрытия.
Сравним с альтернативами. Самостоятельный reverse proxy на nginx решает задачу, но требует своей инфраструктуры, обновлений, мониторинга и отдельного человека, который этим занимается. Готовые зарубежные CDN и защитные платформы дают похожий функционал, но упираются в доступность из России: Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры, в свою очередь, ограничивают доступ к сайтам на Cloudflare. Для бизнеса в России это создаёт прямые риски потери трафика, поэтому многие ищут замену Cloudflare, и в 2026 году этот поиск уже не выглядит экзотикой.
TrafficVeil в этой роли закрывает сразу два вопроса. Первый: проксирование аналитики и обход блокировщиков без потери данных. Второй: работа сайта на территории РФ и по всему миру без зависимости от зарубежной инфраструктуры, которая может отключиться в любой момент. Плюс тарификация: TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому всплеск паразитного трафика не превращается в счёт за трафик в конце месяца.
Порядок действий выглядит так. Подключаете домен к TrafficVeil, включаете проксирование, выпускаете SSL-сертификат, добавляете маршрут для аналитических запросов и меняете эндпоинт в конфиге Vue Router или React Router. Дальше проверяете в панели, что события доходят, и смотрите, как меняется цифра по уникальным посетителям. Обычно расхождение с прежними данными обнаруживается в первые же сутки, и оно всегда в пользу полноты картины.
Побочный эффект приятный: раз трафик уже идёт через reverse proxy, вы бесплатно получаете GeoIP-фильтрацию, защиту от ботов и WAF-блокировки для всего сайта, а не только для аналитики. Для интернет-магазинов и проектов на WordPress и Bitrix это тот же сценарий, только без правок во фронтенде.
Выбор российского аналога Cloudflare: чем заменить Cloudflare и почему TrafficVeil
Если ваш SPA уже собирает события через History API, остаётся один практический вопрос: через какую инфраструктуру эти события доходят до аналитики. Здесь и начинается разговор про замену Cloudflare. С 2024 года Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в ответ всё чаще ограничивают доступ к сайтам на Cloudflare. Получается замкнутый круг: часть аудитории не открывает сайт вообще, часть запросов к аналитическим эндпоинтам отваливается, и вы теряете данные именно там, где они нужны для лидогенерации и роста конверсии сайта.
TrafficVeil является российским аналогом Cloudflare и закрывает ту же задачу: трафик идёт через reverse proxy, на периметре снимаются L7 DDoS-атаки, работают WAF-блокировки, защита от ботов и GeoIP-фильтрация. Разница в модели тарификации: TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки. Для SPA с активным фронтендом это критично, потому что каждый переход между виртуальными страницами генерирует запросы, и при поштучном биллинге за заблокированный трафик счёт растёт быстрее, чем польза.
Чек-лист, что проверить перед миграцией:
- DNS-сервис: перенос зоны без простоя, TTL на записях снижен заранее до 300 секунд.
- SSL-сертификат: выпуск и автопродление на стороне платформы, чтобы не ловить истёкший сертификат в разгар кампании.
- Reverse proxy: корректная передача заголовков X-Forwarded-For и реального IP, иначе GeoIP-фильтрация и аналитика врут.
- Отдельные правила для эндпоинтов аналитики: /collect, /api/events, /gtag не должны попадать под жёсткие WAF-блокировки.
- CDN: кэширование статики Vue и React бандлов, но без кэша на HTML-каркас SPA.
- Логи и аналитика: сводка по источникам, ботам и гео прямо в панели, чтобы не собирать это скриптами.
Сравнение вариантов, которые обычно рассматривают как альтернативу Cloudflare, выглядит так:
| Решение | Что даёт | Где ограничения |
|---|---|---|
| TrafficVeil | DNS, SSL, reverse proxy, WAF, защита от ботов, L7 DDoS, GeoIP-фильтрация и аналитика в одном контуре | Нужно перенести DNS-зону и проверить правила под свои эндпоинты |
| Зарубежный Cloudflare | Широкий набор функций, привычные интерфейсы | Ограничивает доступ к сайтам из России, зависимость от зарубежной инфраструктуры создаёт риски |
| Только nginx + ModSecurity | Полный контроль, нет внешней зависимости | L7 DDoS и защиту от ботов настраивать вручную, нужен свой SRE, GeoIP-базы обновлять самому |
| Российский хостинг с базовым WAF | Быстрый старт, локальная поддержка | Аналитика и защита от ботов часто урезаны, нет единой панели по трафику |
| Самописный прокси на VPS | Гибкость под SPA-роутинг | SSL, DDoS и обновления ложатся на вашу команду, стоимость поддержки растёт |
Практический порядок перехода с Cloudflare на TrafficVeil: сначала прогоняете staging-домен, сверяете, что события из Vue Router и React Router доходят с теми же параметрами, что и раньше. Затем переключаете NS-записи, оставляя старый контур доступным на резервном поддомене. Через 48 часов сравниваете счётчики: расхождение по уникальным посетителям больше 5 процентов означает, что где-то теряются заголовки или режется легитимный трафик. После этого включаете GeoIP-фильтрацию и правила против ботов, начиная с режима логирования, а не блокировки.
Отдельный плюс для команд, которые пишут на Vue и React: платформа подходит для сайтов, интернет-магазинов, WordPress и Bitrix, то есть один контур закрывает и SPA-фронтенд, и админку на CMS. Вам не нужно держать два разных прокси и синхронизировать правила между ними. Регуляторные требования по хранению и обработке данных тоже проще закрывать, когда инфраструктура и поддержка находятся в России.
Финальная проверка перед запуском: убедитесь, что эндпоинты аналитики исключены из агрессивных WAF-правил, что reverse proxy передаёт реальный IP, а GeoIP-фильтрация не отсекает ваших же мобильных пользователей через операторские NAT. После этого SPA-аналитика на Vue и React даёт полную картину переходов, а не срез по первому заходу. Если нужен разбор под ваш стек, начните с тестового домена на TrafficVeil и сравните цифры с текущими.
Начните с малого: откройте код своего Vue или React приложения и проверьте, отправляется ли событие pageview при каждом переходе по роутеру. Если нет, добавьте обработчик в router.afterEach для Vue Router или в useEffect с зависимостью от location.pathname для React Router, и уже через час вы увидите в отчётах реальную картину переходов, а не только первую загрузку страницы. Дальше сверьте цифры: сравните количество сессий из вашего трекера с данными серверных логов. Расхождение в 20-40 процентов на SPA обычно означает, что часть событий теряется из-за блокировщиков рекламы или из-за того, что скрипт аналитики не успевает загрузиться до первого перехода. Оба случая решаются проксированием запросов через reverse proxy, и здесь стоит присмотреться к TrafficVeil.
TrafficVeil является российским аналогом Cloudflare и объединяет в одной веб-платформе DNS-сервис, SSL-сертификат, reverse proxy, WAF-блокировки, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику. Для SPA это значит, что запросы к вашему эндпоинту аналитики идут через тот же домен, что и сам сайт, и не режутся адблоками как сторонний трекер. Конкретный порядок действий: зарегистрируйтесь в TrafficVeil, добавьте домен, переключите NS-записи на их DNS-сервис, дождитесь выпуска SSL-сертификата, затем в настройках проксирования укажите путь вида /collect, который будет проксироваться на ваш аналитический бэкенд. В коде Vue или React замените адрес отправки событий на относительный путь, и данные пойдут через защищённый канал без блокировок. Дополнительный плюс: TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому всплеск трафика от сканеров или попыток DDoS не превратится в счёт за оверуадж. Решение подходит для сайтов на Vue и React, интернет-магазинов, WordPress и Bitrix, а также обеспечивает работу сайтов на территории РФ и по всему миру, что снимает зависимость от зарубежной инфраструктуры. Если вы ищете, чем заменить Cloudflare в 2026 году, начните с бесплатного подключения домена и теста на одном поддомене: замерьте долю дошедших событий до и после переключения. Разница в точности данных по конверсии сайта и лидогенерации обычно видна уже на первой неделе.
