AstroとGA4/GTM
以下の記事の続きです。
この記事の話題
- Astro
- GA4(Google Analytics 4)
- GTM(Google Tag Manager)
重視した要件
- 計測関連のコードは本番環境でのみ動作させたい
- 固定ページ、ブログ記事、Webアプリなど、ページ種別で表示回数を分析したい
高速化は考慮しない
AstroとGoogle Analyticsで調べると、Partytownというライブラリを紹介する記事がそこそこヒットします。
これはどうやら、外部スクリプトを遅延読み込みして、Webサイトの読み込みを早くしてくれるものらしい。
導入した方が良さそう・・・とも思いましたが、自分はそもそもGA4/GTMについての理解が不足していたため、最初から導入するのはやめました。
エラーが起きた時にどこに原因があるのか切り分ける自信がなかったので。
Astroのドキュメントを読むとWindowオブジェクトの扱いが変わるようです。
ここだけ気をつければ大丈夫かも。
Webサイトの読み込みの遅さが気になってきたら導入を検討します。
本番環境でのみ動作させるために
Webで検索するといくつか方法があるようですね。
採用したのは環境変数を使うもの。
.envファイルに以下のように記載。
PUBLIC_GA_MEASUREMENT_ID = G-xxxxxxxx;
その上で、Astroのレイアウトコンポーネントで以下のように分岐。
const GA_MEASUREMENT_ID = import.meta.env.PUBLIC_GA_MEASUREMENT_ID;
:
:
{GA_MEASUREMENT_ID && (
// 本番環境に入れたいコード
)}
ここまでは良かったのですが、この後、GitHub Actionsでは.envではなくsecrets使わなきゃいかん、ということに気づきます。
Astro側のコードはそのままで、.envの内容をGitHubのRepository secretsに設定しました。
知っていればなんて事のない内容。
二度と忘れないように記事にしておきました。はい。
ページ種別で分析するために
Google Analyticsのカスタムディメンションにpage_typeを追加し、
- 固定ページ
- Webアプリ
- ブログ記事
- ブログやタグの一覧ページ
を分けて分析したいと考えました。
最終的には以下のコードで突破。
{GA_MEASUREMENT_ID && (
<>
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`}
/>
<script is:inline define:vars={{ GA_MEASUREMENT_ID, pageType }}>
window.dataLayer = window.dataLayer || [];
function gtag(){
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', GA_MEASUREMENT_ID, { page_type: pageType });
</script>
</>
)}
トラップは以下の通り。
- Astroのis:inlineやdefine:varsの使い方が良くわからなかった
- コード整形ツールが正しく解釈できず、format on saveで勝手にスクリプトを書き換えていた
- 「本番環境のみ」という要件に対応するために分岐のコードを入れていた
この3つが合わさって、{}や<>や""をどこに書くべきか判断不能な状態に陥りました。
GA4側へは純粋なHTMLを求めていますが、Astro内ではjsx/tsx的な書き方となり。
それをコード整形ツールのPrettierが誤認して変なところにや終了タグを勝手に挿入していました。
結局、Prettierの問題はレイアウトファイルをignoreに指定して無理やり黙らせました。
コードを部分的にignore指定する方法もなぜかAstroではうまくいかず…
こういった複数のツールの事情が複雑に絡み合う問題は、生成AI様にお伺いしてもすんなり解決できないことがありますね。
いくつかの書き方を試して、ようやく期待通りに計測できる状態となりました。
GA4/GTMのデバッグ
そんなこんなでトラブっている間に、これまで不勉強だったGA4/GTM関連のデバッグ方法について学びました。
Chromeの拡張機能を上手に活用すべきということも。
モバイル開発出身の新米フロントエンジニアなもんで、こんな記事ですみません。
こんなことに振り回されずに分析環境を提供してくれるWordPressやnoteは、やっぱりすごい。