PageSpeed Insights 99/100 из - за Google Analytics - как я могу кэшировать GA?

Я нахожусь в поиске, чтобы достичь 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/

Что еще я могу сделать, чтобы добраться до 100/100 а также с помощью Google Analytics?

спасибо.

19 ответов


Ну, если 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 баллов, это сделает это.


существует подмножество библиотеки JS Google Analytics под названием ga-lite что вы можете кэшировать, как хотите.

библиотека использует общедоступный REST API Google Analytics для отправки данных отслеживания пользователей в Google. Вы можете прочитать больше из сообщение в блоге о ga-lite.

отказ от ответственности: Я автор этой библиотеки. Я боролся с этой конкретной проблемой, и лучшим результатом, который я нашел, было внедрение этого решения.


Я бы не беспокоился об этом. Не ставьте его на свой собственный сервер, похоже, что это проблема с Google, но так же хорошо, как и получается. Размещение файла на собственном сервере создаст много новых проблем.

им, вероятно, нужно, чтобы файл вызывался каждый раз, а не получать его из кэша клиента, так как таким образом вы не будете считать посещения.

Если у вас есть проблема, чтобы чувствовать себя хорошо с этим, запустите URL Google insights на самом Google insights, есть смейтесь, расслабьтесь и продолжайте работать.


вот действительно простое решение с использованием 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');
}

Примечание: это сценарий GA по умолчанию. У вас могут быть другие ga() вызовы, и если это так, вам нужно будет всегда проверять агент пользователя перед вызовом ga(), в противном случае он может ошибиться.


в документах Google они идентифицировали pagespeed фильтр, который будет загрузить скрипт асинхронно:

ModPagespeedEnableFilters make_google_analytics_async

вы можете найти документацию здесь: https://developers.google.com/speed/pagespeed/module/filter-make-google-analytics-async

одна вещь, чтобы подчеркнуть, что фильтр считается высоким риском. Из документов:

фильтр make_google_analytics_async является экспериментальным и не имеет обширного реального мира тестирование. Один случай, когда переписывание приведет к ошибкам, - если фильтр пропускает вызовы методов Google Analytics, возвращающих значения. Если такие методы найдены, перезапись пропускается. Однако дисквалификационные методы будут пропущены, если они приходят до загрузки, находятся в атрибутах, таких как "onclick", или если они находятся во внешних ресурсах. Эти случаи должны быть редкими.


вы можете попробовать разместить аналитику.в JS локально и обновлять его содержимое с помощью скрипта кэширования или вручную.

файл JS обновляется только несколько раз в год и если вам не нужны новые функции отслеживания обновить его вручную.

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


хранить локальную аналитику.js, но это не рекомендуется google: https://support.google.com/analytics/answer/1032389?hl=en

Это не рекомендуется, потому что google может обновлять скрипт, когда они хотят, так что просто сделать скрипт, который загружает аналитику javascript каждую неделю, и вы не будете иметь проблем !

кстати это решение предотвращает adblock от блокировки сценариев Google analytics


вы можете прокси-скрипт Google analytics через свой собственный сервер, сохранить его локально и автоматически обновлять файл каждый час, чтобы убедиться, что это всегда последняя версия от google.

Я сделал это на нескольких сайтах сейчас, и все работает нормально.

Прокси-маршрут Google Analytics в NodeJS / MEAN Stack

вот как я реализовал его на мой блог это построено со средним стеком.

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);
    }
});

Google Метод действия прокси-сервера Analytics в ASP.NET MVC

вот как я реализовал его на других сайтах, построенных с 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);
        }
    }
}

это CompressAttribute, используемый MVC ProxyController для сжатия Gzip

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

на стороне клиента я добавляю путь аналитики с текущей датой до часа, чтобы браузер не использовал кэшированную версию более часа старый.

<!-- 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>

varvy.com ( 100/100 Google скорость страницы insight) загружает код 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);

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 баллов, это сделает это.


Для 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


чтобы устранить эту проблему, вам нужно будет загрузить файл локально и запустить задание cron для продолжения обновления. Примечание: это не делает ваш сайт быстрее, так что лучше просто игнорировать его.

однако для демонстрационных целей следуйте этому руководству: http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/


попробуйте это просто вставить перед

<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


Google предостережения против использования локальных копий сценариев analtics. Однако, если вы это делаете, вы, вероятно, захотите использовать локальные копии плагинов и сценария отладки.

второй беспокойство с агрессивным кэшированием вы будете получать хиты с кэшированных страниц, которые могут быть изменены или удалены с сайта.


Это может сделать трюк :)

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

в зависимости от использования данных Google Analytics, Если вам нужна основная информация (например, посещения, взаимодействия с пользовательским интерфейсом), вы можете не включать аналитику.js вообще, но все еще собирает данные в GA.

одним из вариантов может быть использование протокола измерения в кэшированном скрипте. 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 с требуемой полезной нагрузкой.

однако, если вам требуется более высокий уровень детализации, это, вероятно, не будет стоить ваших усилий.


вы можете настроить дистрибутив cloudfront, который имеет www.google-analytics.com в качестве исходного сервера и установите более длинный заголовок истечения срока действия в настройках дистрибутива cloudfront. Затем измените этот домен в фрагменте Google. Это предотвращает нагрузку на ваш собственный сервер и необходимость обновления файла в задании cron.

это настройка и забыть. Таким образом, вы можете добавить предупреждение о выставлении счетов в cloudfront в случае, если кто-то "копирует" ваш фрагмент и крадет вашу пропускную способность ;-)

Edit: я пробовал, и это не так просто, Cloudfront проходит через заголовок Cache-Control без простого способа удалить его


открыть 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. И единственная проблема с этим решением-регулярно обновлять скрипт аналитики вручную.


вы можете минимизировать все свои скрипты на странице, включая analytics.js использование:

Не забудьте уменьшить файлы перед его использованием. В противном случае он будет потреблять больше времени обработки.