【PSI +20点】 PageSpeedのBOTのみGAイベントを発火させないと20点スコアが上がる話

# GAのイベントを PSI Bot のみ発火させないとスコアが上がる
ユーザーのアクセス計測は通常通り可能

* 計測ツールのアクセス時にGAなどの計測ツールは不要なのでは
* PageSpeedの計測完了まで最小コンテンツのみ表示するやり方に多大なコストをかけたくない

上記2点の理由から GA の読み込みを Lighthouse のアクセス時はしない方針にしてみました。

以下で紹介する、計測ツールを入れたまま高速化する外部ツールもあるのですが
このシンプルな実装方法がベストだと考えてます。


## Before After
これだけで（おそらく）デメリットはなくスコアが大きく上がります。

半年経過しましたが、ペナルティーもなくインデックス数は増加
GAの計測も全く問題ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/81cedc75-e0bc-7191-c804-88e98585ee72.png)



## 結論First：実装はこのような形

```erb:GoogleBotのみGAのタグを発火させないことで＋20点できるコード）
<% # Hack: Lighthouseの場合GAの計測をしなくても良いためタグを読み込まないように変更（PageSpeedスコアに大きな影響あり） %>
<% unless request.headers["User-Agent"].include?("Chrome-Lighthouse") %>
  <script>
    gtag('js', new Date());
    gtag('config', 'UA-30999999-14');
    gtag('config', 'AW-439999999');
  </script>
  <% if Rails.env.production? %>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-KSKS98');</script>
  <% end %>
<% end %>
```


# GAの計測タグ系があるとそんなに遅くなるのか？

## 重要：体感値では全く速度は変わりません

Chromeのパフォーマンスタブで計測しても、読み込み速度 FCP LCP には大きな影響はありません。

ただ、PageSpeedの計測を行ったときに TBT （Blocking Time）だけが増加します。

![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f383134303337392f3233343433303939342d62633332386639612d386339382d343630392d623234372d3033396664346564323365372e706e67-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/89557046-b098-86cb-9278-dcfab28ac88b.png)



しかし、ブラウザのパフォーマンスタブ、分析情報タブでいくらTBT（Blocking)を探しても

Lighthouseで指摘されているようなブロックはどこにも見当たりません

## 果たして、体感速度に影響のないスコアのためだけの改善は必要でしょうか？

おそらく ga() のメソッドの実行結果を lightshouse は待機していて
実際の表示速度に影響はないもののBlockされている判定をしてしまっているのではないかと思ってます。


### GA,GTM タグあり
レンダリング：1.2秒
スコア70点

レンダリングはなんならタグがないより早い（3回計測）の中央値
![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f383134303337392f3233343433313538302d65303831363764622d633334382d346562332d383434642d3164356536656264663662622e706e67-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/bda5be82-9437-c70f-3128-7cd7c677f28a.png)


スコアはTBTが上がってしまい70点台と大きく下がる
![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f383134303337392f3233343433313833392d30343632313731302d646165332d343563382d393939612d3565386464626130333839332e706e67-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/b0cc42ad-8760-bdf3-c44d-55de75eb9b6c.png)



### GA、GTMのタグなし
レンダリング：1.5秒
スコア90点台

GAやGTMのタグがあってもなくてもユーザの体感速度は変わらない
（むしろタグがない方がChromeのパフォーマンス計測では遅かった）
![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f383134303337392f3233343433313538302d65303831363764622d633334382d346562332d383434642d3164356536656264663662622e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/aa20d637-f48f-7f5a-dbe9-956f08b71a10.png)


GAのタグとGTMのタグにより発生しているTBTがゼロになるのでスコアは上がる
![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f383134303337392f3233343433313833392d30343632313731302d646165332d343563382d393939612d3565386464626130333839332e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/9f025e15-1866-00e9-01a5-89de24aa6885.png)



## 別のアプローチも検討しました。
* web worker を用いて Thirdparty 系ライブラリを平行スレッドで読み込む
* Web WorkerはDOM APIにアクセスできないため不可能だった
* Party Town を用いて DOM アクセスを強制的に実行するのはありか？
* PageSpeed計測のためだけに、こういったBeta版ライブラリを導入するコストは高い ＋ 不安定

こういった外部ツールを利用することも考えたが
要は本来必要なファイルを遅延させたり
部分的に切り取ってレンダリングだけ優先させたりと

全てのコンテンツレンダリングをさせる前に評価させて
本当にユーザーが使うファイルは後からロードするという

### ”Googleを騙す” ことに変わりはないので

こういったツールを使うのも
Light house のアクセスだけGAを読み込まないことも
本質的には同じことをしているのではないだろうか

それであればこういったツールを使う方が煩雑でメンテナンスコストを上げるし
不要な js を追加で読むことにもなるので、本質的ではない。

ゆえにこういった対応が現状のウェブ業界におけるベストなのではと模索したがどうでしょうか。

https://postd.cc/how-we-cut-99-of-our-javascript-with-qwik-partytown/