web-dev-qa-db-ja.com

Google AnalyticsのためPageSpeed Insights 99/100 - GAをキャッシュする方法

私はPageSpeedで100/100に到達することを探求しています、そして私はほとんどそこにいます。 Google Analyticsをキャッシュするための優れたソリューションを見つけようとしています。

これが私が得るメッセージです:

ブラウザのキャッシュを活用する静的リソースのHTTPヘッダーに有効期限または最大保存期間を設定すると、ブラウザはネットワーク経由ではなくローカルディスクから以前にダウンロードしたリソースを読み込むように指示されます。次のキャッシュ可能なリソースにブラウザのキャッシュを活用します。 http://www.google-analytics.com/analytics.js (2時間)

私が見つけた唯一の解決策は2012年からであり、私はそれが良い解決策だとは思わない。基本的にはGAコードをコピーして自分でホストしてください。その後、cronジョブを実行して1日に1回Googleを再チェックし、最新のGAコードを入手して置き換えます。

http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/ /

Google Analyticsを使用しながら100/100に到達するには、他に何ができますか。

ありがとうございました。

235
sjmartin

まあ、Googleがあなたをだましているなら、あなたはGoogleを裏返すことができます。

これはpageSpeedのユーザーエージェントです:

“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.8 (KHTML, like Gecko; Google Page Speed Insights) Chrome/19.0.1084.36 Safari/536.8”

分析スクリプトをPageSpeedに提供しないようにするために、条件式を挿入できます。

<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Speed Insights') === false): ?>
// your analytics code here
<?php endif; ?>

明らかに、それは本当の改善をすることはありませんが、あなたの唯一の懸念が100/100のスコアを得ることであるならば、これはそれをするでしょう。

232
NiloVelez

ga-lite というGoogle Analytics jsライブラリのサブセットがありますが、これは必要に応じてキャッシュできます。

このライブラリは、Google Analyticsのpublic REST AP​​Iを使用してユーザー追跡データをGoogleに送信します。 ga-liteに関するブログ投稿 からより多くを読むことができます。

免責事項: 私はこの図書館の著者です。私はこの特定の問題に苦労し、私が見つけた最良の結果はこの解決策を実行することでした。

36
jehna1

これは基本的なGAトラッキングのための、JSを使った非常に簡単な解決策です。(これは、コメントから変換された)Edgeのキャッシュ/プロキシでも動作します。

if(navigator.userAgent.indexOf("Speed Insights") == -1) {
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).Push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXXX-X', 'auto');
  ga('send', 'pageview');
}

注:これはデフォルトのGAスクリプトです。他のga()呼び出しがあるかもしれません、もしそうなら、あなたはga()を呼び出す前に常にユーザーエージェントをチェックする必要があるでしょう、そうでなければエラーとなるかもしれません。

19
Half Crazed

私はそれについて心配しないでしょう。それをあなた自身のサーバーに置かないでください、これはグーグルの問題であるように思えます、しかしそれが得るのと同じくらい良いです。自分のサーバーにファイルを置くと、多くの新しい問題が発生します。

クライアントのキャッシュからファイルを取得するのではなく、毎回ファイルを呼び出す必要があるでしょう。

それで問題が解決しない場合は、Google insightsのURLをGoogle insights自体で実行し、笑って、リラックスして、仕事を続けてください。

17
Leo Muller

Googleのドキュメントで、彼らはスクリプトを非同期にロードするpagespeedフィルタを特定しました。

ModPagespeedEnableFilters make_google_analytics_async

あなたはここでドキュメントを見つけることができます: https://developers.google.com/speed/pagespeed/module/filter-make-google-analytics-async

強調するべき1つのことは、フィルタが高リスクと考えられているということです。ドキュメントから:

Make_google_analytics_asyncフィルタは実験的なもので、実世界での広範なテストは行われていません。書き換えによってエラーが発生するケースの1つは、フィルタが値を返すGoogle Analyticsのメソッドの呼び出しを見逃している場合です。そのようなメソッドが見つかった場合、書き換えはスキップされます。ただし、不適切なメソッドがロード前に発生した場合、「onclick」などの属性に含まれている場合、または外部リソースに含まれている場合は失格となります。これらのケースはまれであると予想されます。

10
Cameron Scott

Analytics.jsをローカルでホスティングしてその内容をキャッシュスクリプトで、または手動で更新することができます。

Jsファイルは年に数回更新されるだけで、新しい追跡機能が不要な場合は手動で更新します。

https://developers.google.com/analytics/devguides/collection/analyticsjs/changelog

6
JJTalik

localy analytics.jsを保存します。ただし、googleではお勧めしません。 https://support.google.com/analytics/answer/1032389?hl=ja

グーグルが望むときにスクリプトを更新することができるので、これは推奨されない。毎週分析JavaScriptをダウンロードするスクリプトを実行すれば問題ないだろう!

ところで、このソリューションでは、adblockがGoogle Analyticsスクリプトをブロックすることを防ぐことができます

6
Froggiz

varvy.com100/100 Googleページ速度の洞察 )ユーザーがページをスクロールした場合にのみgoogle analitycsコードが読み込まれます。

var fired = false;

window.addEventListener("scroll", function(){
    if ((document.documentElement.scrollTop != 0 && fired === false) || (document.body.scrollTop != 0 && fired === false)) {

        (function(i,s,o,g,r,a,m{i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).Push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-XXXXXXXX-X', 'auto');
        ga('send', 'pageview');

        fired = true;
    }
}, true);
5
ar099968

Google Analyticsスクリプトを自分のサーバー経由でプロキシし、ローカルに保存し、1時間ごとにファイルを自動更新して、常にGoogleの最新バージョンにすることができます。

私は今、いくつかのサイトでこれをやっていて、すべてうまくいっています。

NodeJS/MEANスタックのGoogle Analyticsプロキシルート

これが私がMEANスタックで構築された 私のブログ 上でどのように実装されたかです。

router.get('/analytics.js', function (req, res, next) {
    var fileUrl = 'http://www.google-analytics.com/analytics.js';
    var filePath = path.resolve('/content/analytics.js');

    // ensure file exists and is less than 1 hour old
    fs.stat(filePath, function (err, stats) {
        if (err) {
            // file doesn't exist so download and create it
            updateFileAndReturn();
        } else {
            // file exists so ensure it's not stale
            if (moment().diff(stats.mtime, 'minutes') > 60) {
                updateFileAndReturn();
            } else {
                returnFile();
            }
        }
    });

    // update file from remote url then send to client
    function updateFileAndReturn() {
        request(fileUrl, function (error, response, body) {
            fs.writeFileSync(filePath, body);
            returnFile();
        });
    }

    // send file to client
    function returnFile() {
        res.set('Cache-Control', 'public, max-age=' + oneWeekSeconds);
        res.sendFile(filePath);
    }
});

ASP.NET MVCでのGoogle Analyticsプロキシアクションメソッド

これが私がASP.NET MVCで構築された他のサイトにそれを実装した方法です。

public class ProxyController : BaseController
{
    [Compress]
    public ActionResult GoogleAnalytics()
    {
        var fileUrl = "https://ssl.google-analytics.com/ga.js";
        var filePath = Server.MapPath("~/scripts/analytics.js");

        // ensure file exists 
        if (!System.IO.File.Exists(filePath))
            UpdateFile(fileUrl, filePath);

        // ensure file is less than 1 hour old
        var lastModified = System.IO.File.GetLastWriteTime(filePath);
        if((DateTime.Now - lastModified).TotalMinutes > 60)
            UpdateFile(fileUrl, filePath);

        // enable caching for 1 week for page speed score
        Response.AddHeader("Cache-Control", "max-age=604800");

        return JavaScript(System.IO.File.ReadAllText(filePath));
    }

    private void UpdateFile(string fileUrl, string filePath)
    {
        using (var response = WebRequest.Create(fileUrl).GetResponse())
        using (var dataStream = response.GetResponseStream())
        using (var reader = new StreamReader(dataStream))
        {
            var body = reader.ReadToEnd();
            System.IO.File.WriteAllText(filePath, body);
        }
    }
}

これは、MVC ProxyControllerがGzip圧縮に使用するCompressAttributeです。

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

Google Analyticsスクリプトを更新しました

クライアント側では、分析パスに現在の日付を1時間以内で追加するので、ブラウザは1時間以上経過したキャッシュバージョンを使用しません。

<!-- analytics -->
<script>
    (function (i, s, o, g, r, a, m) {
        i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
            (i[r].q = i[r].q || []).Push(arguments)
        }, i[r].l = 1 * new Date(); a = s.createElement(o),
        m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
    })(window, document, 'script', '/analytics.js?d=' + new Date().toISOString().slice(0, 13), 'ga');
</script>
5
Jason

PHP

これをあなたのHTMLまたはPHPコードに追加してください:

<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Speed Insights') === false): ?>
  <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).Push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-PUT YOUR GOOGLE ANALYTICS ID HERE', 'auto');
    ga('send', 'pageview');
  </script>
<?php endif; ?>

JavaScript

これはJavaScriptでうまく機能します。

  <script>
  if(navigator.userAgent.indexOf("Speed Insights") == -1) {
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).Push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-<PUT YOUR GOOGLE ANALYTICS ID HERE>', 'auto');
    ga('send', 'pageview');
  }
  </script>

NiloVelez すでに言った: 明らかに、実際の改善はしないが、あなたの唯一の懸念が100/100のスコアを得ることであれば、これでうまくいくだろう。

4
Suriyaa

Nginxの場合:

location ~ /analytics.js {
        proxy_pass https://www.google-analytics.com;
        expires 31536000s;
        proxy_set_header Pragma "public";
        proxy_set_header Cache-Control "max-age=31536000, public";
    }

その後、パス https://www.google-analytics.com/analytics.jsに変更します。https://yoursite.com/analytics.js

3
Savad KP

これを試してみてください

<script async='async' src='https://cdn.jsdelivr.net/ga-lite/latest/ga-lite.min.js'></script> <script>var galite=galite||{};galite.UA="xx-xxxxxxx-x";</script>

Xx-xxxxxxx-xをあなたのコードに変更してください、ここで実装をチェックしてください http://www.gee.web.id/2016/11/how-to-leverage-browser-caching-for-google-analitycs。 html

1
Gee

https://www.google-analytics.com/analytics.js ファイルを新しいタブで開き、すべてのコードをコピーします。

ウェブディレクトリにフォルダを作成し、名前をgoogle-analyticsに変更します。

同じフォルダにテキストファイルを作成し、上でコピーしたすべてのコードを貼り付けます。

Ga-local.jsファイルの名前を変更

Google Analyticsコードで、ローカルにホストされているAnalyticsスクリプトファイルを呼び出すようにURLを変更します。これは次のようになります。すなわち、 https://domain.xyz/google-analytics/ga.js

最後に、新しいGoogle AnalyticsコードをWebページのフッターに配置します。

準備できた。 Google PageSpeed InsightsのWebサイトを確認してください。これは、Leverage Browser Caching Google Analyticsに対する警告を表示しません。そして、このソリューションの唯一の問題は、Analyticsスクリプトを手動で定期的に更新することです。

0
FormaL

Google 注意 鎮痛剤スクリプトのローカルコピーの使用に反対。あなたがそれをしている場合しかし、あなたはおそらくプラグインのローカルコピーとデバッグスクリプトを使用したいと思うでしょう。

アグレッシブキャッシュを使用した2番目の 懸念 は、キャッシュされたページからヒットする可能性があるということです。

0
Oren Bochman

オリジンサーバーとしてwww.google-analytics.comを持つクラウドフロントディストリビューションをセットアップし、クラウドフロントディストリビューション設定でより長い有効期限ヘッダーを設定できます。その後、Googleスニペットでそのドメインを変更します。これはあなた自身のサーバへの負荷とcronジョブでファイルを更新し続ける必要性を防ぎます。

これはセットアップです。誰かがあなたのスニペットを「コピー」してあなたの帯域幅を盗んだ場合に備えて、あなたはcloudfrontに請求アラートを追加したいかもしれません;-)

編集:私はそれを試してみました、それはそれほど簡単ではありません、それを削除する簡単な方法なしでCloudfrontはCache-Controlヘッダーを通過します

0
Jan M

この問題を解決するには、ファイルをローカルにダウンロードし、cronジョブを実行して更新し続ける必要があります。注:これはあなたのウェブサイトを少しも速くするわけではないので、無視するのが最善です。

ただし、デモンストレーションを目的として、このガイドに従ってください。 http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/

0
Mohammad

これはトリックをするかもしれません:)

<script>
  $.ajax({
  type: "GET",
  url: "https://www.google-analytics.com/analytics.js",
  success: function(){},
  dataType: "script",
  cache: true
  });
</script>
0
Nuno Sarmento

Google Analyticsのデータの使用方法によっては、基本情報(訪問、UIの操作など)が必要な場合は、analytics.jsをまったく含めずにGAでデータを収集することができます。

1つのオプションは、代わりにキャッシュされたスクリプトで測定プロトコルを使用することです。 Google Analytics:測定プロトコルの概要

トランスポートメソッドを明示的にimageに設定すると、GAが独自のイメージビーコンを構築する方法を見ることができます。

ga('set', 'transport', 'image');

https://www.google-analytics.com/r/collect
  ?v={protocol-version}
  &tid={tracking-id}
  &cid={client-id}
  &t={hit-type}
  &dl={location}

必要なペイロードを使用して、独自のGETリクエストまたはPOSTリクエストを作成できます。

ただし、もっと詳細なレベルが必要な場合は、おそらく努力する価値がないでしょう。

0
Jonathan