ga.jsを読み解いてみたけどあまり得るものがなかった

ga.jsの4.9.4を読んでみました。Javascriptの勉強になるかなと思ったので。

結論から言うと、あまり得るものがありませんでした。それならjQueryを読んだ方がよさそうだし、勉強という意味ではprototypeのほうが向いてるような気もしています。
でもGA読んでみたいじゃん。

事前準備

まず、ga.jsOnline javascript beautifierで圧縮解除。1540行ほどなのと、後半は関数定義なので読み飛ばしていいかなと思ったので実質1000行くらいでしょうか。
ga.js

所感

ざっと見て一言。「トリッキーすぎる」。
勉強のためにこんなのを読む必要はありませんでした。そもそも、windowを変数Lに入れて、window.document.locationにアクセスするのにL[w][y]って書いたりしてるし、そんな潰れた関数名を配列に入れてforで回して…みたいなことをやっているので、そもそも意味不明です。

やっていることとしては、現状のパスやリファラやクッキー状況を見て、イベントに応じたリクエストをGAのサーバに投げる、というものなので難しくないのかなーと思ってたら、アホみたいに難しいだけなので、おすすめしません。

そんな中でいくつか得るものがあったところだけをメモ。

変数をかっこよく圧縮する

1:false

boolean判定のとき、falseと書くと5バイト使っちゃいますが、!1と書くと2バイトで済みます。
!1 == false かつ !1 === false なので、今後はfalseって書くときは僕も!1 って書こうかと思います。

2:undefined

undefinedを判定するケースって意外と使い方が難しいです。==で判定すると厳密には違っていてもtrueになったりするので。
ga.jsでは、まず最初に「var k= void 0」と置いています。(void 0) === undefined なので、確実な判定が行えるというわけですね。

3:0がたくさん付いた数

setTimeOut(5000)とか、ランダムに大きい数を作りたいときなんかで使えそうです。目安としては1000以上。
1000 === 1E3 です。10000 === 1E4 です。つまり、ゼロの代わりにEとゼロの個数を書きます。

POST時のトリック

リクエスト長が2036バイト以上の場合はPOSTでデータを送るけど、その方法です。
まず、幅と高さゼロのiframeを作り、その中でXMLHttpRequestにより通信します。そこでポイントとなるのは、3つ。

1.リクエスト時に、通常のGET用URLとは別のURLにアクセスしているところ。
2.リクエストパラメータにwithCredentials = true をつけているところ。
3.レスポンスヘッダがheader(‘Access-Control-Allow-Origin:*’);を使っているところ。

まず1について。通常はhttp://www.google-analytics.com/__utm.gifをリクエストするんですが、POSTの場合はhttp://www.google-analytics.com/p/__utm.gifになっています。またGETのときはレスポンスに3のヘッダはありません。
なぜかというと、2をセットすることで、インラインフレームからのcookie値送信を許可させているんですね。そのうえで3。なるほどですね。POST機能は最近になって追加されたものなので、最新技術を使ってるっぽいですね。

まとめ

Javascriptのトリッキーな書き方に興味があって、かつ暇な人は読めばいいよ。

普通にGoogle Analyticsを使いたい人はトラッキングコードのリファレンスを読む方が得るものが1E3倍くらい違います。(早速使ってみた)