Как настроить Google Analytics для React-Router?
Я пытаюсь настроить Google Analytics на своем сайте-ответчике и наткнулся на несколько пакетов, но ни один из них не имеет такого настроения, который я имею в терминах примеров. Хотел, чтобы кто-то мог пролить свет на это.
Пакет, на который я смотрю, react-ga.
Мой метод визуализации на моем index.js
выглядит следующим образом.
React.render((
<Router history={createBrowserHistory()}>
<Route path="/" component={App}>
<IndexRoute component={Home} onLeave={closeHeader}/>
<Route path="/about" component={About} onLeave={closeHeader}/>
<Route path="/gallery" component={Gallery} onLeave={closeHeader}/>
<Route path="/contact-us" component={Contact} onLeave={closeHeader}>
<Route path="/contact-us/:service" component={Contact} onLeave={closeHeader}/>
</Route>
<Route path="/privacy-policy" component={PrivacyPolicy} onLeave={closeHeader} />
<Route path="/feedback" component={Feedback} onLeave={closeHeader} />
</Route>
<Route path="*" component={NoMatch} onLeave={closeHeader}/>
</Router>), document.getElementById('root'));
Ответы
Ответ 1
Сохраните ссылку на свой объект истории. т.е.
import createBrowserHistory from 'history/createBrowserHistory';
var history = createBrowserHistory();
ReactDOM.render((
<Router history={history}>
[...]
Затем добавьте слушателя для записи каждого просмотра страницы. (Предполагается, что вы уже настроили объект window.ga
обычным способом.)
history.listen(function (location) {
window.ga('set', 'page', location.pathname + location.search);
window.ga('send', 'pageview');
});
Ответ 2
Учитывая, что Google Analytics загружается и инициализируется идентификатором отслеживания.
Вот решение для 4-го маршрутизатора версии 4 с помощью компонента <Route>
для отслеживания просмотров страниц.
<Route path="/" render={({location}) => {
if (typeof window.ga === 'function') {
window.ga('set', 'page', location.pathname + location.search);
window.ga('send', 'pageview');
}
return null;
}} />
Вы просто визуализируете этот компонент внутри <Router>
(но не как прямой дочерний элемент <Switch>
).
Что происходит, так это то, что всякий раз, когда изменяется расположение местоположения, он вызывает повторную визуализацию этого компонента (а вовсе не визуализацию), который вызывает просмотр страницы.
Ответ 3
Я использую React Router v4 и глобальный тег сайта Google Analytics, который рекомендуется на момент написания этой статьи.
И вот мое решение:
Создайте компонент, обернутый в withRouter, из response react-router-dom
:
import React from 'react';
import { withRouter } from 'react-router-dom';
import { GA_TRACKING_ID } from '../config';
class GoogleAnalytics extends React.Component {
componentWillUpdate ({ location, history }) {
const gtag = window.gtag;
if (location.pathname === this.props.location.pathname) {
// don't log identical link clicks (nav links likely)
return;
}
if (history.action === 'PUSH' &&
typeof(gtag) === 'function') {
gtag('config', GA_TRACKING_ID, {
'page_title': document.title,
'page_location': window.location.href,
'page_path': location.pathname
});
}
}
render () {
return null;
}
}
export default withRouter(GoogleAnalytics);
Просто добавьте компонент в свой маршрутизатор (я считаю, что в идеале после любых подходящих маршрутов и любых компонентов Switch, потому что функция аналитики не должна быть приоритетом над визуализацией вашего сайта):
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import IndexPage from './IndexPage';
import NotFoundPage from './NotFoundPage';
import GoogleAnalytics from './GoogleAnalytics';
const App = () => (
<Router>
<Switch>
<Route exact path="/" component={IndexPage} />
<Route component={NotFoundPage} />
</Switch>
<GoogleAnalytics />
</Router>
);
Как указано:
withRouter будет рендерить свой компонент каждый раз, когда маршрут меняется с теми же реквизитами, что и реквизит рендеринга.
Поэтому, когда маршрут меняется, компонент GoogleAnalytics
, он получит новое местоположение в качестве реквизита, и history.action
будет либо PUSH
для нового элемента истории, либо POP
чтобы сигнализировать о движении назад по истории (что, я думаю, не должно вызвать просмотр страницы, но вы можете настроить операторы if в componentWillUpdate
как считаете нужным (вместо этого вы можете даже попробовать componentDidUpdate
с this.props
, но я не уверен, что лучше)).
Ответ 4
Обратите внимание, что если вы используете react-router-dom
из react-router-4
вы можете справиться с этим следующим образом:
import { Router, Route } from 'react-router-dom';
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
const initGA = (history) => {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'YOUR_IDENTIFIER_HERE', 'auto');
ga('send', 'pageview');
history.listen((location) => {
console.log("tracking page view: " + location.pathname);
ga('send', 'pageview', location.pathname);
});
};
initGA(history);
class App extends Component { //eslint-disable-line
render() {
return
(<Router history={history} >
<Route exact path="/x" component={x} />
<Route exact path="/y" component={y} />
</Router>)
}
}
Обратите внимание, что для этого необходимо установить пакет history
(npm install history
). Это уже зависимость от activ-router-dom, поэтому вы не добавляете здесь вес страницы.
Также обратите внимание: невозможно использовать компонент BrowserRouter И инструмент для отслеживания вашего пути таким образом. Это нормально, потому что компонент BrowserRouter - это просто очень тонкая оболочка вокруг объекта Router. Мы воссоздаем функциональность BrowserRouter здесь с помощью <Router history={history}>
где const history = createBrowserHistory();
,
Ответ 5
Я бы посоветовал использовать превосходный пакет BrowserRouter
react-router-ga
, который чрезвычайно легок и прост в настройке, особенно при использовании оболочки BrowserRouter
.
Импортируйте компонент:
import Analytics from 'react-router-ga';
Затем просто добавьте <Analytics>
в ваш BrowserRouter
:
<BrowserRouter>
<Analytics id="UA-ANALYTICS-1">
<Switch>
<Route path="/somewhere" component={SomeComponent}/>
</Switch>
</Analytics>
</BrowserRouter>
Ответ 6
Во-первых, в вашем index.js установите функцию onUpdate для вызова ga
import ga from 'ga.js';
onUpdate() {
console.log('=====GA=====>', location.pathname);
console.log('=====GA_TRACKING_CODE=====>', GA_TRACKING_CODE);
ga("send", "pageview", location.pathname);
}
render() {
return (
<Router onUpdate={this.onUpdate.bind(this)}>...</Router>
);
}
И ga.js:
'use strict';
if(typeof window !== 'undefined' && typeof GA_TRACKING_CODE !== 'undefined') {
(function(window, document, script, url, r, tag, firstScriptTag) {
window['GoogleAnalyticsObject']=r;
window[r] = window[r] || function() {
(window[r].q = window[r].q || []).push(arguments)
};
window[r].l = 1*new Date();
tag = document.createElement(script),
firstScriptTag = document.getElementsByTagName(script)[0];
tag.async = 1;
tag.src = url;
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
})(
window,
document,
'script',
'//www.google-analytics.com/analytics.js',
'ga'
);
var ga = window.ga;
ga('create', GA_TRACKING_CODE, 'auto');
module.exports = function() {
return window.ga.apply(window.ga, arguments);
};
} else {
module.exports = function() {console.log(arguments)};
}
Ответ 7
Всегда идите с библиотекой рекомендованным способом
В документации React-GA они добавили компонент сообщества, рекомендуемый для использования с React Router: https://github.com/react-ga/react-ga/wiki/React-Router-v4-withTracker
Реализация
import withTracker from './withTracker';
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<Route component={withTracker(App, { /* additional attributes */ } )} />
</ConnectedRouter>
</Provider>,
document.getElementById('root'),
);
Код
import React, { Component, } from "react";
import GoogleAnalytics from "react-ga";
GoogleAnalytics.initialize("UA-0000000-0");
const withTracker = (WrappedComponent, options = {}) => {
const trackPage = page => {
GoogleAnalytics.set({
page,
...options,
});
GoogleAnalytics.pageview(page);
};
// eslint-disable-next-line
const HOC = class extends Component {
componentDidMount() {
// eslint-disable-next-line
const page = this.props.location.pathname + this.props.location.search;
trackPage(page);
}
componentDidUpdate(prevProps) {
const currentPage =
prevProps.location.pathname + prevProps.location.search;
const nextPage =
this.props.location.pathname + this.props.location.search;
if (currentPage !== nextPage) {
trackPage(nextPage);
}
}
render() {
return <WrappedComponent {...this.props} />;
}
};
return HOC;
};
export default withTracker;
Ответ 8
Если вы используете хэш или историю браузера, вы можете сделать:
import trackingHit from 'tracking';
import { Router, browserHistory } from 'react-router';
browserHistory.listen(trackingHit);
// OR
import { Router, hashHistory } from 'react-router';
hashHistory.listen(trackingHit);
где./tracking.es6
export default function(location) {
console.log('New page hit', location.pathname);
// Do your shizzle here
}
Ответ 9
базовая реакция-ga с вашим index.js
var ReactGA = require('react-ga'); // require the react-ga module
ReactGA.initialize('Your-UA-ID-HERE'); // add your UA code
function logPageView() { // add this function to your component
ReactGA.set({ page: window.location.pathname + window.location.search });
ReactGA.pageview(window.location.pathname + window.location.search);
}
React.render((
<Router history={createBrowserHistory()} onUpdate={logPageView} > // insert onUpdate props here
<Route path="/" component={App}>
<IndexRoute component={Home} onLeave={closeHeader}/>
<Route path="/about" component={About} onLeave={closeHeader}/>
<Route path="/gallery" component={Gallery} onLeave={closeHeader}/>
<Route path="/contact-us" component={Contact} onLeave={closeHeader}>
<Route path="/contact-us/:service" component={Contact} onLeave={closeHeader}/>
</Route>
<Route path="/privacy-policy" component={PrivacyPolicy} onLeave={closeHeader} />
<Route path="/feedback" component={Feedback} onLeave={closeHeader} />
</Route>
<Route path="*" component={NoMatch} onLeave={closeHeader} />
</Router>), document.getElementById('root'));
Ответ 10
Вот самый простой способ отследить все пути с некоторыми обходными путями:
npm я --save history react-ga
создать файл history.js
import { createBrowserHistory } from "history"
import ReactGA from "react-ga"
ReactGA.initialize(process.env.REACT_APP_GA)
const history = createBrowserHistory()
history.listen((location) => {
ReactGA.pageview(location.pathname)
})
// workaround for initial visit
if (window.performance && (performance.navigation.type === performance.navigation.TYPE_NAVIGATE)) {
ReactGA.pageview("/")
}
export default history
а затем импортировать его туда, где установлен ваш Router
import history from "./history"
...
class Route extends Component {
render() {
return (
<Router history={history}>
<Switch>
<Route path="/" exact component={HomePage} />
...
</Switch>
</Router>
)
}
export default Route
Рекомендации:
Густаво Гонсалес | medium.com
История | GitHub
Ответ 11
Я предлагаю использовать аналитическую библиотеку сегментов и следовать руководству по быстрому старту React для отслеживания вызовов страниц с использованием библиотекиact -router. Вы можете разрешить компоненту <Route/>
обрабатывать отображение страницы и использовать componentDidMount
для вызова вызовов page
. В приведенном ниже примере показан один способ сделать это:
const App = () => (
<div>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
</Switch>
</div>
);
export default App;
export default class Home extends Component {
componentDidMount() {
window.analytics.page('Home');
}
render() {
return (
<h1>
Home page.
</h1>
);
}
}
Я поддерживаю https://github.com/segmentio/analytics-react. С помощью сегмента вы сможете включать и выключать разные пункты назначения одним щелчком переключателя, если вы заинтересованы в испытании нескольких аналитических инструментов (мы поддерживаем направления 250+) без необходимости писать какой-либо дополнительный код. 🙂
Ответ 12
Мне нравится, как Марк Томас Мюллер предлагает здесь:
В вашем index.js
import ReactGA from 'react-ga'
ReactGA.initialize('YourAnalyticsID')
ReactDOM.render(<App />, document.getElementById('root'))
Где ваши маршруты:
import React, { Component } from 'react'
import { Router, Route } from 'react-router-dom'
import createHistory from 'history/createBrowserHistory'
import ReactGA from 'react-ga'
const history = createHistory()
history.listen(location => {
ReactGA.set({ page: location.pathname })
ReactGA.pageview(location.pathname)
})
export default class AppRoutes extends Component {
componentDidMount() {
ReactGA.pageview(window.location.pathname)
}
render() {
return (
<Router history={history}>
<div>
<Route path="/your" component={Your} />
<Route path="/pages" component={Pages} />
<Route path="/here" component={Here} />
</div>
</Router>
)
}
}
Коротко, масштабируемо и просто :)