📊

Next.js で作るWebアプリケーションを Google Analytics 4 で解析する(2024年2月)

2024/02/05に公開

はじめに

この記事について

こんにちは、 @zomysan(Twitter) です。この記事では、Next.js で作った Web アプリケーションに Google Analytics(以下 GA) で解析をするためのタグを追加する方法について書きます。

それって script タグを設置するだけじゃないの? というトピックですが、たしかに動かすだけなら簡単であるものの実現するのにいろんな選択肢があり、何を考えて選べばいいのか迷う点もあるのでまとめてみました。参考になれば幸いです。

この記事の対象

この記事は以下のような人を対象としています。

  • Next.js で作った Web アプリケーションに GA4 のための script タグを設置したい
  • バージョンによっていろんな方法があり、結局何を選べばいいのかわからない
  • Single Page Application だとページ遷移イベントを送信しないといけないの?
  • Next.js 公式の GoogleAnalytics コンポーネントを使ったのにエラーが出て困っている

まとめ

ざっくりまとめると以下の通りです。

  • GA4 なら SPA でもタグだけ設置すればOK。ページ遷移イベントも含めてばっちり取得できる
  • タグの設置は Script コンポーネント、または GoogleAnalytics コンポーネント(Next.js v14〜)を使う
  • GoogleAnalytics は2024年2月時点でドキュメント通りにやっても動かない。"@next/third-parties": "14.0.5-canary.59" を別途インストールすれば動く

解説

それぞれのトピックについて掘り下げます。

SPA の場合も、タグの設置だけすればいい

GA4 では、GA のスクリプトがブラウザの閲覧履歴のステータスが変更されたことを検知し、自動でイベントを記録してくれます。よって、useEffectuseRouter を使ってパス変更を検知して… といった実装をアプリケーションに追加しなくても大丈夫です。

これについては、Next.js の公式ドキュメントにも明記されています。

https://Next.js.org/docs/pages/building-your-application/optimizing/third-party-libraries#tracking-pageviews

Google Analytics automatically tracks pageviews when the browser history state changes. This means that client-side navigations between Next.js routes will send pageview data without any configuration.
Google Analytics は、ブラウザ履歴の状態が変化すると自動的に pageview を追跡します。すなわち、なにも設定しなくても Next.js ルート間のクライアント側のページ遷移についても pageview データを送信します。

また、Google Analyticsのドキュメントにもブラウザの History の変化に基づいてイベントを収集されている旨が書かれています。

https://support.google.com/analytics/answer/9234069#:~:text=previous_os_version-,page_view,-(ウェブ)

page_viewイベントが自動的にトリガーされるタイミング:ページが読み込まれるたび、またはアクティブなサイトによって閲覧履歴のステータスが変更されるたび

拡張計測機能によりデフォルトで収集されます。

Script コンポーネントを使って script タグを埋め込む

まずはscript タグを埋め込む方法として、 Script コンポーネントを使う方法を述べます。

Google Analytics でプロパティおよびウェブストリームを作成すると、解析データを受信するためのタグが提示されます。以下のようなタグですね。

Google Analytics のダッシュボードで提示される js
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX');
</script>

パフォーマンスを気にしないならこのまま適当に埋め込んでもいいんですが、Script コンポーネントを使えばページ全体で script の内容をキャッシュしてくれます。Script は Next.js v11 で導入されたコンポーネントで、外部ソース script の読み込みや動作を最適化するためのものです。 strategy プロパティを指定することで、読み込みのタイミングを調整することもできます。

https://Next.js.org/docs/pages/building-your-application/optimizing/scripts

Script を使って埋め込んでみると、以下のように書けます。スクリプトの内容を外部の source から読み込むだけでなく、インラインで書くこともできるので、2番目の Script コンポーネントではそのようにしています。

_app.tsx
import Script from "next/script";

const MyApp({ Component, pageProps }: AppProps) => (
    <>
        <Script
            strategy="afterInteractive"
            src={"https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"}
        />
        <Script
            id="gtag-config"
            strategy="afterInteractive"
        >
            {`
                window.dataLayer = window.dataLayer || [];
                function gtag(){dataLayer.push(arguments);}
                gtag('js', new Date());
                
                gtag('config', 'G-XXXXXXXXXX');
            `}
        </Script>
        <Component {...pageProps} />
    </>
);

export default MyApp;

GoogleAnalytics コンポーネントを使ってもっとラクをする(Next.js v14〜)

Next.js v14 以降のバージョンなら、 Script タグでスクリプトを埋め込まなくても GoogleAnalytics コンポーネントに gaId を渡すだけでかんたんにスクリプトを埋め込めます。

https://Next.js.org/docs/messages/next-script-for-ga

さきほど提示した _app.tsx と比較して一目瞭然ですね。

_app.tsx
import { GoogleAnalytics } from '@next/third-parties/google';

const MyApp({ Component, pageProps }: AppProps) => (
    <>
        <GoogleAnalytics gaId="G-XXXXXXXXXX" />
        <Component {...pageProps} />
    </>
);

export default MyApp;

しかしこの GoogleAnalytics 、Next.js v14 以降なら追加でパッケージを追加することなく使えるはずなのですが、パッケージの不具合でそのままでは型エラーが出てしまいます。

Cannot find module '@next/third-parties/google' or its corresponding type declarations.ts(2307)

これについては Next.js のリポジトリに Issue が立っており、とりあえず @next/third-parties14.0.5-canary.59 バージョンをインストールすることで問題なく使えるようになる、といったことが書かれています。

https://github.com/vercel/next.js/issues/58697

npm install @next/third-parties@14.0.5-canary.59
or
yarn add @next/third-parties@14.0.5-canary.59
or
pnpm add @next/third-parties@14.0.5-canary.59

ちゃんと動いてないなら Script で自前で書こうかなとチラッと思ったんですが、そのうち修正されるであろうことを見越し、私はとりあえずこの回避策を入れつつ、 GoogleAnalytics コンポーネントで楽をすることにしました。

おわりに

繰り返しになりますが、GA4 の解析タグを Next.js に埋め込む場合、以下のようにすればOKです。

  • GA4 なら SPA でもタグだけ設置すればOK。ページ遷移イベントも含めてばっちり取得できる
  • タグの設置は Script コンポーネント、または GoogleAnalytics コンポーネント(Next.js v14〜)を使う
  • GoogleAnalytics は2024年2月時点でドキュメント通りにやっても動かない。"@next/third-parties": "14.0.5-canary.59" を別途インストールすれば動く

@next/third-parties のエラーについてはそのうち解消されると思いますので、その時にはまた記事を修正します。

SocialPLUS Tech Blog

Discussion