因Google Analytics而导致PageSpeed Insights 99/100 - 如何缓存GA?

sjm*_*tin 239 google-analytics insight pagespeed

我正在寻求在PageSpeed上达到100/100而我几乎就在那里.我正在尝试找到一个很好的解决方案来缓存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?

谢谢.

Nil*_*lez 235

好吧,如果谷歌欺骗你,你可以欺骗谷歌:

这是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”
Run Code Online (Sandbox Code Playgroud)

您可以插入条件以避免将分析脚本提供给PageSpeed:

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

显然,它不会有任何真正的改进,但如果你唯一关心的是获得100/100分,那么就可以做到.

  • 通过JS加载它然后:)`if(navigator.userAgent.indexOf("Speed Insights")== -1){/*analytics here*/} (48认同)
  • 聪明......可惜我使用边缘缓存,因为只有当请求到达每个请求的原点时,此脚本才会起作用:( (4认同)
  • 警告:这不再起作用。由Lighthouse强力驱动的Page Speed Insights使用默认的userAgent,该代理不再可用。 (4认同)
  • 恕我直言,这是作弊!认为您可以将该规则应用于许多其他事情,例如通过不加载内容来提高速度。迟早,Google 可能会通过比较来自不同用户代理的 HTML 来惩罚使用此规则的网站。 (2认同)

jeh*_*na1 37

有一个名为ga-lite的Google Analytics js库的子集,您可以根据需要进行缓存.

该图书馆使用Google Analytics的公共REST API将用户跟踪数据发送给Google.您可以在关于ga-lite的博客文章中阅读更多内容.

免责声明:我是这个图书馆的作者.我努力解决这个具体问题,我发现最好的结果就是实现这个解决方案.


Hal*_*zed 19

这是一个使用JS的非常简单的解决方案,用于基本的GA跟踪,它也适用于边缘缓存/代理(这是从注释转换而来):

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');
}
Run Code Online (Sandbox Code Playgroud)

注意:这是默认的GA脚本.您可能有其他ga()呼叫,如果是这样,您需要在呼叫前始终检查用户代理ga(),否则可能会出错.

  • 对"注意:"部分做出反应,您可以将"ga"声明为"ga = function(){};`在片段之前以"ga();`执行时静默失败",这样您就不必检查代码中到处存在此函数. (2认同)
  • 如何在脚本中添加它 &lt;script async src="https://www.googletagmanager.com/gtag/js?id=UA-xx6600xx-1"&gt;&lt;/script&gt; (2认同)

Leo*_*ler 16

我不担心.不要把它放在你自己的服务器上,听起来这是谷歌的一个问题,但它一样好.将文件放在您自己的服务器上会产生许多新问题.

他们可能每次都需要调用该文件,而不是从客户端的缓存中获取它,因为这样您就不会计算访问次数.

如果您对此感觉不错,请在Google洞察本身上运行Google数据分析网址,大笑,放松并继续您的工作.

  • 他想知道他怎么能达到100,而不是99就可以了. (68认同)
  • 这个答案是不正确的,从中下载Analytics.js文件不会影响分析是否跟踪.托管您自己的分析文件的问题是您必须手动更新到最新版本(一年几次). (4认同)
  • 对于那些因为99而迷失的人来说,这是一个不错的答案.更好地把你的时间花在真正的问题上. (3认同)

Cam*_*ott 10

在Google文档中,他们已经确定了一个pagespeed过滤器,它将异步加载脚本:

ModPagespeedEnableFilters make_google_analytics_async
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到相关文档:https://developers.google.com/speed/pagespeed/module/filter-make-google-analytics-async

需要强调的一点是,过滤器被认为是高风险的.来自文档:

make_google_analytics_async过滤器是实验性的,并没有进行过广泛的实际测试.如果过滤器错过了对返回值的Google Analytics方法的调用,则重写会导致错误的一种情况.如果找到这样的方法,则跳过重写.但是,如果它们在加载之前出现,在"onclick"等属性中,或者如果它们在外部资源中,那么将取消不合格方法.预计这些案件很少见.


小智 6

您可以尝试在本地托管analytics.js并使用缓存脚本或手动更新其内容.

js文件每年只更新几次,如果您不需要任何新的跟踪功能,请手动更新.

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

  • 请注意,Google明确不支持此操作:https://support.google.com/analytics/answer/1032389?hl = zh-CN (2认同)

Fro*_*giz 6

存储localy analytics.js,但不建议谷歌:https: //support.google.com/analytics/answer/1032389?hl = en

不建议原因谷歌可以在他们想要的时候更新脚本,所以只需做一个每周下载分析javascript的脚本,你就不会遇到麻烦了!

顺便说一下,此解决方案可以防止adblock阻止Google Analytics分析脚本


ar0*_*968 6

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);
Run Code Online (Sandbox Code Playgroud)

  • 如果访问者不滚动但仅单击一个链接,该怎么办。他将不会被计入分析。 (7认同)

Jas*_*son 5

您可以通过自己的服务器代理谷歌分析脚本,在本地保存并每小时自动更新文件,以确保它始终是谷歌的最新版本.

我现在已经在几个网站上完成了这一切,并且一切正常.

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新了Google Analytics脚本

在客户端,我将分析路径附加到当前日期到小时,以便浏览器不会使用超过一小时的缓存版本.

<!-- 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>
Run Code Online (Sandbox Code Playgroud)


Sav*_* KP 5

对于 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";
    }
Run Code Online (Sandbox Code Playgroud)

然后将路径https://www.google-analytics.com/analytics.js更改为https://yoursite.com/analytics.js


Sur*_*yaa 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; ?>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

NiloVelez已经说过:显然,它不会带来任何真正的改进,但如果您唯一关心的是获得 100/100 分数,那么它就可以了。