React-Router için Google Analytics nasıl kurulur?


86

React sitemde Google Analytics'i kurmaya çalışıyorum ve birkaç paketle karşılaştım, ancak hiçbiri örnekler açısından sahip olduğum türden bir kuruluma sahip değil. Birinin buna biraz ışık tutmasını umuyordum.

Baktığım paket react-ga .

Benim render metodum index.jsbuna benziyor.

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'));

4
Aşağıda react-router-4/ için bir cevap yayınlandı react-router-dom, buradaki en iyi cevap react-router'ın önceki sürümleri içindir ve maalesef v4 ile çalışmayacaktır.
Peter Berg

React SSR kullanırken bunu StaticRouter ile nasıl eklerim?
Subhendu Kundu

Yanıtlar:


85

Geçmiş nesnenize bir referans tutun. yani

import { createBrowserHistory } from 'history';

var history = createBrowserHistory();

ReactDOM.render((
    <Router history={history}>
        [...]

Ardından, her sayfa görüntülemeyi kaydetmek için bir dinleyici ekleyin. (Bu, window.ganesneyi zaten her zamanki şekilde ayarladığınızı varsayar .)

history.listen((location) => {
    window.ga('set', 'page', location.pathname + location.search);
    window.ga('send', 'pageview');
});

16
Bu, gönderilen etkinlikleri veya diğer isabet türlerini hesaba katmaz. Yine de sayfa yüklenirken URL'ye başvuruyor olacaklar. Bunun yerine, sayfa görüntülemeyi göndermeden önce izleyicide yeni değeri ayarlamanız gerekir, ör ga('set', 'page', location.pathname + location.search); ga('send', 'pageview');.
Philip Walton

1
Merhaba David, örneğiniz ga sitesindeki normal ga kodunu mu kullanıyor yoksa react-ga paketini mi kullanıyor? Teşekkürler.
John Fu

Henüz nasıl düzelteceğime karar vermedim, ancak bu bilgi parçası da yararlı olabilir: stackoverflow.com/questions/30052693/… (bazı durumlarda ilişkilendirmenin neden doğru çalışmadığını açıklar ve ayrıca yüksek hemen çıkma oranları sunar ).
DeTeam

Gönder komutunda üçüncü parametre istemezsiniz. "Sayfa görüntüleme isabetleri için gönderme komutu teknik olarak isteğe bağlı bir sayfa alanını üçüncü parametre olarak kabul ederken, tek sayfalı uygulamaları izlerken sayfa alanını bu şekilde geçirmeniz önerilmez. Bunun nedeni, gönderme komutuyla iletilen alanların izleyicide ayarlanmamasıdır— bunlar yalnızca mevcut isabet için geçerlidir. Uygulamanız sayfa görüntüleme dışı isabet (ör. etkinlikler veya sosyal etkileşimler) gönderirse izleyiciyi güncellememek sorunlara neden olur, çünkü bu isabetler izleyicinin oluşturulduğu zaman sahip olduğu sayfa değeriyle ilişkilendirilecektir. "
Joshua Robinson


30

Google Analytics'in bir izleme kimliği ile yüklendiğini ve başlatıldığını göz önünde bulundurursak.

Burada, <Route>sayfa görünümlerini izlemek için bileşeni kullanan react-router sürüm 4 için bir çözüm bulunmaktadır .

<Route path="/" render={({location}) => {
  if (typeof window.ga === 'function') {
    window.ga('set', 'page', location.pathname + location.search);
    window.ga('send', 'pageview');
  }
  return null;
}} />

Bu bileşeni basitçe <Router>(ancak a'nın doğrudan alt öğesi olarak değil) içinde işlersiniz <Switch>.

Olan şey, konum eğilimi her değiştiğinde, bu bileşenin bir sayfa görüntülemeyi tetikleyen (aslında hiçbir şeyi oluşturmayan) yeniden oluşturulmasına neden olmasıdır.


1
React-router 4. Yapamayacağı bir şey var mı ?!
Anthony Cregan

1
Aşağıda, tek tek yolları değiştirmeyi içermeyen başka bir react-router-4 çözümü yayınladı. Ne yazık ki bu kesinlikle "zehirini seç" tipi bir durum.
Peter Berg

1
Bu, "/" konumuna gitmenin hiçbir şey vermeyeceği anlamına gelmez mi?
Dana Woodman

3
Sadece istediğinizi yayan başka bir rota var @DanaWoodman. Bu rotanın içinde olmadığını varsayarSwitch
bozdoz

Bu, açılış sayfasındaki iki sayfa görüntülemeyi izleyecek mi? GA olarak görmek, açılış sayfasını otomatik olarak izler ve bunun için fazladan bir sayfa görüntüleme etkinliği tetikleriz. Veya GA bunu filtreliyor mu?
ArneHugo

27

Bunu yazarken önerildiği görülen React Router v4 ve Google Analytics Global Site Etiketini kullanıyorum .

Ve işte benim çözümüm:

Sarılmış bir bileşeni oluşturma withRouter dan 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);

Bileşeni yönlendiricinize eklemeniz yeterlidir (ideal olarak eşleşecek herhangi bir rotadan ve herhangi bir Switch bileşeninden sonra inanıyorum, çünkü analitik işlevi site oluşturma işleminize göre öncelikli olmamalıdır):

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>
);

Belirtildiği gibi:

withRouter, rota her değiştiğinde, render props ile aynı props ile bileşenini yeniden oluşturacaktır.

Dolayısıyla, rota değiştiğinde, GoogleAnalyticsbileşen güncellenecek, yeni konumu sahne olarak history.actionalacak ve ya PUSHyeni bir geçmiş öğesi için ya POPda geçmişte geriye doğru giden sinyal olacak (ki bu bir sayfa görünümünü tetiklememeli, ancak if ifadelerini componentWillUpdateuygun gördüğünüz şekilde componentDidUpdatedüzenleyebilirsiniz ( this.propsbunun yerine deneyebilirsiniz , ancak hangisinin daha iyi olduğundan emin değilim).


bozdoz Global Site Etiketini sayfanıza nasıl eklediniz. Vücut etiketinin altına html sayfanıza <script async src = " googletagmanager.com/gtag/js?id=GA_TRACKING_ID " > </…> eklediniz mi ?
me-me

1
@ me-me Evet. Ama vücut etiketi içinde:<body> ... <script ...></script></body>
bozdoz

En son React ve React Router için birkaç ince ayar yapılması gerekiyordu. Değişim componentWillMountiçin componentDidMount. Değişim page_pathTo this.props.location.pathname. Switch ve GoogleAnalytics bileşenlerini <div>
mjhm

Nerede gördüğünüzden componentWillMountve ne kadar page_pathfarklı olduğundan emin değilim , ancak Switch ve GA bileşenini <React.Fragment>bir div. Teşekkürler!
bozdoz

2
Hey @JoshuaRobinson, alt kısma "... Bence bir sayfa görünümünü tetiklememeli, ama ayarlayabilirsin ..." yazdım. Bu soru, Google Analytics'i React Router ile entegre etmekle ilgiliydi, hangi görünümleri kaydetmeniz gerektiğiyle değil. Bunu söyledikten sonra, Google'ın kendi tarafında farklı şekilde izleyeceğini görerek bileşenimi ayarlayabilirim. Teşekkürler.
bozdoz

19

react-router-domPaketi sizden kullanıyorsanız, react-router-4bunu şu şekilde halledebileceğinizi unutmayın:

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>)
  }
}

Bunun, historypaketi ( npm install history) yüklemenizi gerektirdiğini unutmayın . Bu zaten bir react-router-dom bağımlılığıdır, bu yüzden buraya herhangi bir sayfa ağırlığı eklemiyorsunuz.

Ayrıca unutmayın: BrowserRouter bileşenini kullanmak VE ga izlemenizi bu şekilde araç olarak kullanmak mümkün değildir. Bu sorun değil çünkü BrowserRouter bileşeni , Router nesnesinin etrafında gerçekten ince bir sarmalayıcıdır. Biz burada BrowserRouter işlevselliği yeniden <Router history={history}>nerede const history = createBrowserHistory();.


initGA'yı hiç aramaz mısınız?
Muhammad Umer

@MuhammadUmer doğru, düzeltti
Peter Berg

Neden GA’yı statik HTML’nize eklemiyorsunuz? Seni artı 1'ledim Çünkü tarih nesnesini dinlemenin doğru yol olduğunu düşünüyorum.
Vince V.

@VinceV. Derlemenizdeki historynesneyi makul bir şekilde başlatabilir ve ardından windownesnenin geçmişini depolayabilir ve ona bir komut dosyası etiketinde erişebilirsiniz, <head>ancak bence bu sonuçta derleme işlem hattınızı daha karmaşık hale getirecektir. ¯_ (ツ) _ / ¯
Peter Berg

BrowserRouterBileşeni kullanıyorsanız, alternatif bir çözüm sunan aşağıdaki yanıta bakın.
Toshe

14

react-router-gaÖzellikle BrowserRouterambalajı kullanırken son derece hafif ve yapılandırması kolay olan mükemmel paketi kullanmanızı öneririm .

Bileşeni içe aktarın:

import Analytics from 'react-router-ga';

Ardından şunları <Analytics>ekleyin BrowserRouter:

<BrowserRouter>
    <Analytics id="UA-ANALYTICS-1">
        <Switch>
            <Route path="/somewhere" component={SomeComponent}/>
        </Switch>
    </Analytics>
</BrowserRouter>

Kullanıcı yalnızca sayfa görüntülemelerini izlemekle ilgileniyorsa, bu son derece basit bir çözüm gibi görünüyor. Çok yalın!
peyo

11

Mark Thomas Müller'in burada önerdiği şekli beğendim :

Senin içinde index.js

import ReactGA from 'react-ga'

ReactGA.initialize('YourAnalyticsID')

ReactDOM.render(<App />, document.getElementById('root'))

Rotalarınız nerede:

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>
        )
    }
}

Kısa, ölçeklenebilir ve basit :)


neden bir küresel, bir yerel izleme var?
Thellimist

11

Çünkü react-router v5.1.0bu çok daha kolay çözülebilir useLocation.

usePageTracking.js

import { useEffect} from "react";
import { useLocation } from "react-router-dom";
import ReactGA from "react-ga";

const usePageTracking = () => {
  const location = useLocation();

  useEffect(() => {
    ReactGA.initialize("UA-000000000-0");
    ReactGA.pageview(location.pathname + location.search);
  }, [location]);
};

export default usePageTracking;

App.js

const App = () => {
  usePageTracking();

  return (...);
};

Ayrıca bakınız:

İşte biraz daha akıllı bir versiyon:

usePageTracking.js

import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
import ReactGA from "react-ga";

const usePageTracking = () => {
  const location = useLocation();
  const [initialized, setInitialized] = useState(false);

  useEffect(() => {
    if (!window.location.href.includes("localhost")) {
      ReactGA.initialize("UA-000000000-0");
    }
    setInitialized(true);
  }, []);

  useEffect(() => {
    if (initialized) {
      ReactGA.pageview(location.pathname + location.search);
    }
  }, [initialized, location]);
};

export default usePageTracking;

En son "gtag" ile bunun gerekli olduğundan emin değilim. Processing data layer push: {event: "gtm.historyChange-v2", gtm.historyChangeSource: "pushState", gtm.oldUrlFragment: "", gtm.newUrlFragment: "", gtm.oldHistoryState: null, gtm.newHistoryState: {key: "j5xoc4", state: undefined}, gtm.oldUrl: "https://site/", gtm.newUrl: "https://site/new-url?search-params", gtm.triggers: "1_36"}
Gezindiğimde

6

Her zaman kitaplığın önerdiği yolu izleyin

React-GA belgelerine, React Router ile kullanılması önerilen bir topluluk bileşeni eklediler: https://github.com/react-ga/react-ga/wiki/React-Router-v4-withTracker

Uygulama

import withTracker from './withTracker';

ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <Route component={withTracker(App, { /* additional attributes */ } )} />
    </ConnectedRouter>
  </Provider>,
  document.getElementById('root'),
);

Kod

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;

1
SSR (sunucu tarafı oluşturma) kullanırsam, GA, sayfayı yenilemeden gerçek sayfanın başlığını bilmiyor.
Francis Rodrigues

1
Kullanarak monte on başlığını değiştirebilirsiniz Tepki
Paras

Gönderdiğiniz için teşekkürler!
Sailesh Kotha

nereden storegeliyor
user_78361084

Nereden geliyor Providerve ConnectedRouternereden geliyor? Bu eksik bir cevaptır ve olumsuz oy verilmelidir
user_78361084

2

Öncelikle, index.js'de ga'yı çağırmak için onUpdate işlevini ayarlayın

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>
  );
}

Ve 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)};
}

Burada hangi yönlendirici sürümü kullanılıyor?
Pavan

react yönlendirici dom v2 veya v3 içindir, v4 için değil
Hugo Gresse

2

İşte bazı çözümlerle tüm yolları izlemenin en basit yolu:

npm i --save history react-ga

bir dosya oluştur 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

ve sonra ayarladığınız yere aktarın 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

Referanslar:

Gustavo Gonzalez | medium.com

Tarih | GitHub


2

React -router kitaplığını kullanarak sayfa çağrılarını izlemek için Segment analiz kitaplığını kullanmanızı ve React hızlı başlangıç ​​kılavuzunu izlemenizi öneririm . <Route />Bileşenin, sayfa oluşturulduğunda işlemesine ve çağrıları componentDidMountçağırmak için kullanmasına izin verebilirsiniz page. Aşağıdaki örnek, bunu yapabileceğiniz bir yolu göstermektedir:

    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>
        );
      }
    }

Ben devam ettiren olduğum https://github.com/segmentio/analytics-react . Segment ile, herhangi bir ek kod yazmak zorunda kalmadan birden fazla analiz aracını (250'den fazla hedefi destekliyoruz) denemekle ilgileniyorsanız, bir düğmeyi çevirerek farklı hedefleri açıp kapatabilirsiniz. 🙂


1

Karma veya tarayıcı geçmişi kullanıyorsanız şunları yapabilirsiniz:

import trackingHit from 'tracking';

import { Router, browserHistory } from 'react-router';
browserHistory.listen(trackingHit);
// OR
import { Router, hashHistory } from 'react-router';
hashHistory.listen(trackingHit);

nerede ./tracking.es6

export default function(location) {
    console.log('New page hit', location.pathname);
    // Do your shizzle here
}

0

index.js ile temel react-ga uygulaması

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'));

@BigDong closeHeader'ın ne olduğunu bilmiyorum. OP'ye bu soruyu sormanız gerekir, çünkü render kodu ona aittir. Ben sadece onun kodu için react-ga'yı nasıl uygulayacağınızı gösteriyorum (yorumlarımı arayın)
Isaac Pak

0

@ David-l-walsh ve @bozdoz önerilerine göre

Ben yürütmek bir HOC yarattı window.ga('set','page','{currentUrl})vewindow.ga('send', 'pageview'); işlevini doğrudan yönlendirici sayfasında kolayca kullanılan ...

bu HOC:

import React from 'react';
import { history } from '../../store'; // or wherever you createBrowserHistory(); invokation is

function withGAHistoryTrack(WrappedComponent) {
  return class extends React.Component {
    constructor(props) {
      super(props);
    }

    componentDidMount() {
      const { location } = history;
      const page = location.pathname + location.search;

      if (typeof window.ga === 'function') {
        window.ga('set', 'page', page);
        window.ga('send', 'pageview');
      }
    }

    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
}

export default withGAHistoryTrack;

ve yönlendirici sayfasında bu şekilde kullanılır:

<Route
 path={'yourPath'}
 component={withGAHistoryTrack(yourComponent)}
 exact
/>

0

Bazı etkinliklerde (onClick vb. Gibi) url'yi dinamik olarak güncellemek için aşağıdakiler kullanılabilir:

 //Imports
 import ReactGA from "react-ga";
 import { createBrowserHistory } from "history";

 // Add following on some event, like onClick (depends on your requirement)
 const history = createBrowserHistory();
 ReactGA.initialize("<Your-UA-ID-HERE>");
 ReactGA.pageview(history.location.pathname);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.