因为Google Analytics,我的PageSpeed Insights得分为99/100 - 我应该如何缓存GA?

260
我正在追求100/100的PageSpeed得分,差不多达到目标了。我正在努力寻找一个好的解决方案来缓存Google Analytics。
以下是我收到的消息:
利用浏览器缓存 为静态资源设置到期日期或最大年龄的HTTP标头,指示浏览器从本地磁盘加载先前下载的资源,而不是通过网络获取。 利用以下可缓存资源的浏览器缓存: http://www.google-analytics.com/analytics.js(2 小时)
我找到的唯一解决方案是 2012 年的,我认为这不是一个好的解决方案。基本上,您需要复制 GA 代码并将其托管在自己的服务器上。然后,每天运行一个 Cron 作业,重新检查 Google,以获取最新的 GA 代码并替换它。

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

还有什么其他方法可以在使用Google Analytics的同时达到100/100?

谢谢。


1
我使用了cron方法,没有使用cron(在加载和缓存onload时)。如果您需要,我可以分享PHP代码。我已经解决了GA修复建议的问题。但是还有一个小问题:我留下了“Cache-Control: max-age=604800”头部,这比5分钟缓存时间要长得多。 - Roman Losev
6
但这真的是一个好主意吗?在您的服务器上缓存此文件意味着浏览器将不得不重新下载它,而不是重复使用已经通过访问其他使用Google Analytics的网站缓存的文件。因此,这实际上可能会稍微减慢您的访问者速度。 - s427
可能是Leverage browser caching for 3rd party JS的重复问题。 - Joe
20个回答

5

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的分数,那么这样做可以达到目的。


1

2
请注意,这是针对 ga-lite 而不是标准分析的。 - Rob Forrest

1
在2020年,页面速度洞察的用户代理是: 移动端使用 "Chrome-Lighthouse",桌面端使用 "Google Page Speed Insights"。
<?php if (!isset($_SERVER['HTTP_USER_AGENT']) || stripos($_SERVER['HTTP_USER_AGENT'], 'Chrome-Lighthouse') === false  || stripos($_SERVER['HTTP_USER_AGENT'], 'Google Page Speed Insights') === false): ?>
// your google analytics code and other external script you want to hide from PageSpeed Insights here
<?php endif; ?>

0
根据您对Google Analytics数据的使用,如果您只需要基本信息(例如访问量、用户界面交互),您也许可以不使用analytics.js,在GA中仍然收集数据。
一个选项是使用缓存脚本中的测量协议。Google Analytics:测量协议概述 当您将传输方法明确设置为图像时,您可以看到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请求。

但是,如果您需要更详细的信息,这可能不值得您的努力。


连接到Pagespeed在哪里? - Nico Haase
通过不加载 analytics.js,你避免了网页速度惩罚。 - Jonathan
除了数据仍然记录在Google Analytics中,我认为我的答案是有效的,并清楚地说明根据所需的Google Analytics详细级别,这可能是一个值得考虑的选项,重要的是它仍将记录访问、UI交互和潜在的其他指标。如果OP正在寻求最后1%的优化,这可能是值得考虑的优化。 - Jonathan
@NicoHaase 我已经编辑了我的评论,希望能更清楚地表达我的观点。很想听听你的想法。 - Jonathan
我个人不喜欢实现自己的逻辑来收集GA数据的方式。即使它现在能够工作,如果Google更改了他们的代码,你必须采用自己的实现方式。如果你错过了正确的做法,就无法收集数据。对于一些公司来说,这对业务至关重要,而且不是IT修复代码之前可以停止工作的东西。 - Nico Haase
显示剩余2条评论

0

谷歌警告不要使用本地副本的分析脚本。 但如果你这样做,你可能会想使用插件和调试脚本的本地副本。

对于过度缓存的第二个问题是,你会从缓存页面中获取点击量 - 这些页面可能已经更改或从网站中删除。


0

“这并不会让你的网站更快”这并不一定是正确的。理论上,将包含分析代码的非关键联接JS文件进行gzip压缩,由于共享字典,应该比单独的分析文件压缩得稍微小一些。也许这样做会带来更多麻烦,不值得尝试。 - Ray Foss

0

您可以设置一个Cloudfront分布,其原始服务器为www.google-analytics.com,并在Cloudfront分布设置中设置更长的到期标头。然后修改Google代码片段中的该域。这样可以避免对自己的服务器造成负载,并且无需在cron作业中不断更新文件。

这是设置并忘记。因此,您可能希望向Cloudfront添加计费警报,以防有人“复制”您的代码片段并窃取您的带宽;-)

编辑:我尝试了一下,发现不是很容易,Cloudfront通过Cache-Control标头传递,没有很好的方法可以移除它。


0

在新标签页中打开 https://www.google-analytics.com/analytics.js 文件,复制所有代码。

现在在您的网站目录中创建一个文件夹,将其重命名为 google-analytics。

在同一文件夹中创建一个文本文件,并粘贴您上面复制的所有代码。

将该文件重命名为 ga-local.js。

现在更改 URL 以调用您本地托管的 Google Analytics 脚本文件。它将看起来像这样:https://domain.xyz/google-analytics/ga.js

最后,将您的新 Google Analytics 代码放置在网页页脚中。

完成了。现在检查您的网站是否有 Google PageSpeed Insights 的警告。它将不再显示“利用浏览器缓存 Google Analytics”的警告。而此解决方法唯一的问题是需要手动定期更新分析脚本。


0
这可能会有用 :)
<script>
  $.ajax({
  type: "GET",
  url: "https://www.google-analytics.com/analytics.js",
  success: function(){},
  dataType: "script",
  cache: true
  });
</script>

-13

6
analytics.js 已经从源代码中被压缩了。 - João Pimentel Ferreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接