投稿 2021.10.13
以下の記事で構築したブログにGoogle Analyticsを導入してみます。
GAはあまり使いこなせていないのですが、PV数が取得できる程度には実装してみます。
❯ npm install @types/gtag.js
.env.local を作成
※ローカルで確認する際はここにもトラッキングコードを追加します。
NEXT_PUBLIC_GA_ID=''
.env.production を作成
XXXXXXXXXXのところをトラッキングコードに置き換えます。
ダブルコート、シングルコートなどで囲みは不要です。
NEXT_PUBLIC_GA_ID=XXXXXXXXXX
Gtag.tsを作成
export const GA_TRACKING_ID = process.env.NEXT_PUBLIC_GA_ID || '';
export const pageview = (url: string): void => {
// GA_TRACKING_ID が設定されていない場合は、処理終了
if (!GA_TRACKING_ID) return;
window.gtag('config', GA_TRACKING_ID, {
page_path: url,
});
};
importを追加
import { useRouter } from 'next/router';
-
+import { GA_TRACKING_ID } from '../utils/Gtag';
import { Config } from '../utils/Config';
/>
</>
)}
+ {GA_TRACKING_ID && (
+ <>
+ <script async src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`} />
+ <script
+ dangerouslySetInnerHTML={{
+ __html: `
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+ gtag('config', '${GA_TRACKING_ID}', {
+ page_path: window.location.pathname,
+ });
+ `,
+ }}
/>
</>
)}
</Head>
</>
);
-import React from 'react';
+import React, { useEffect } from 'react';
import { AppProps } from 'next/app';
import '../styles/main.css';
import '../styles/prism-a11y-dark.css';
+import { GA_TRACKING_ID, pageview } from '../utils/Gtag';
+
// eslint-disable-next-line react/jsx-props-no-spreading
-const MyApp = ({ Component, pageProps }: AppProps) => <Component {...pageProps} />;
+export default function MyApp({ Component, pageProps, router }: AppProps) {
+ useEffect(() => {
+ // GA_TRACKING_ID が設定されていない場合は、処理終了
+ if (!GA_TRACKING_ID) return undefined;
+
+ const handleRouteChange = (url: string) => {
+ pageview(url);
+ };
+ router.events.on('routeChangeComplete', handleRouteChange);
+ return () => {
+ router.events.off('routeChangeComplete', handleRouteChange);
+ };
+ }, [router.events]);
-export default MyApp;
+ return (
+ <Component {...pageProps} />
+ );
+}
参考文献