【Next.js】Next.jsにGoogleアナリティクスを設定する
通常のWebサイトでは、Googleアナリティクスを設定する場合、<head>
タグ内にトラッキングコードをペーストするだけでよいです。しかし、Next.jsで作成したサイトでは、通常の方法とは異なる部分があるため、まとめてみました。
Googleアナリティクス4導入
Googleアナリティクス公式ページへアクセスして「測定を開始」を選択
アカウント名を入力(任意)
データ共有オプションはデフォルトのままにして、「次へ」を選択
計測するサイトのプロパティ名を入力(任意)
日本の場合は、レポートのタイムゾーンを日本
にする
日本の場合は、通貨を日本円(JPY)
「次へ」を選択
該当するものを選択して作成を選択
日本の場合プルダウンメニューから日本
を選択後、規約に同意して同意する
を選択
自分のメール配信画面が表示された場合は、デフォルトのまま保存を選択
データストリームの設定
「ウェブ」を選択
計測をしたいウェブサイトのURL
を入力
ストリーム名
を入力(任意)
「ストリームを作成」を選択
詳細画面が表示されるので、内容確認後に閉じてください。
データストリームの作成が完了しました。
トラッキングコードを設置する
作成したデータストリームを選択
タグの実装手順を表示するを選択
「手動でインストールする」を選択するとトラッキングコードが表示されます。
_app.jsにコードを設置する
lib/gtag.js
を作成する
GA_MEASUREMENT_ID
を環境変数を使用して管理していく。
環境変数はクライアント側(ブラウザ側)
で利用したいため、接頭辞NEXT_PUBLIC_
をつけてNEXT_PUBLIC_GA_ID
とする。
+ export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_ID;
.env
を作成
xxxxxxxxxxxxxxxxxxxx
の部分は、GAタグのid
です。(画像の赤で塗りつぶしをしている部分)
+ NEXT_PUBLIC_GA_ID=xxxxxxxxxxxxxxxxxxxx
next/script
による<Script>コンポーネント
を使用して、ページがインタラクティブになった直後に実行されるように、strategy="afterInteractive"
を指定する。
インラインスクリプトは、dangerouslySetInnerHTML
を使用して記述していきます。
+ import Script from "next/script";
+ import * as gtag from "src/lib/gtag";
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
+ <Script
+ strategy="afterInteractive"
+ src={`https://www.googletagmanager.com/gtag/js?id=${gtag.GA_MEASUREMENT_ID}`}
+ />
+ <Script
+ id="gtag-init"
+ strategy="afterInteractive"
+ dangerouslySetInnerHTML={{
+ __html: `
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+
+ gtag('config', '${gtag.GA_MEASUREMENT_ID}');
+ `,
+ }}
+ />
<Component {...pageProps} />
</>
);
}
export default MyApp;
タグの設置は完了ですが、現段階ではNext.jsのページ遷移が認識されない状態。
理由は<Component />
が変わっているだけのため。
ページ遷移を認識させる
pageview
という関数をgtag.js
に用意します。
この関数をページ遷移に応じて実行することによって、Googleアナリティクスにデータが送ることができる。
export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_ID;
+ export const pageview = (url) => {
+ window.gtag("config", GA_MEASUREMENT_ID, {
+ page_path: url,
+ });
};
next/router
を使用して、Router内のイベントで用意されている、ページ遷移が終了した際に発火するrouteChangeComplete
のイベントリスナーとして先ほど作成をした関数、pageview
を登録します。
url
が渡されるタイミングはイベントが発生したとき。
useEffect
を使用して、イベントリスナーへの登録と削除を行う。
+ import { useRouter } from "next/router";
+ import { useEffect } from "react";
function MyApp({ Component, pageProps }: AppProps) {
+ const router = useRouter();
+ useEffect(() => {
+ const handleRouterChange = (url: any) => {
+ gtag.pageview(url);
+ };
+ router.events.on("routeChangeComplete", handleRouterChange);
+ return () => {
+ router.events.off("routeChangeComplete", handleRouterChange);
+ };
+ }, [router.events]);
return (
<>
<Script
strategy="afterInteractive"
src={`https://www.googletagmanager.com/gtag/js?id=${gtag.GA_MEASUREMENT_ID}`}
/>
<Script
id="gtag-init"
strategy="afterInteractive"
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${gtag.GA_MEASUREMENT_ID}');
`,
}}
/>
<Component {...pageProps} />
</>
);
}
export default MyApp;
計測を確認してみる
Webサイトにアクセス後、レポート
→リアルタイム
を選択して過去30分間のユーザー
がカウントされていれば計測ができています。
参考文献
Discussion