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?

Спасибо.

Ответ 1

Хорошо, если 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"

Вы можете вставить условное условие, чтобы избежать использования аналитики script для параметра PageSpeed:

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

Очевидно, что это не принесет никаких реальных улучшений, но если ваша единственная забота - получить 100/100 баллов, это сделает это.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Вот очень простое решение с использованием 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 [w370 > по умолчанию. У вас могут быть другие вызовы ga(), и если это так, вам нужно всегда проверять агент пользователя перед вызовом ga(), в противном случае он может выйти из строя.

Ответ 5

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

ModPagespeedEnableFilters make_google_analytics_async

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Кстати, это решение предотвращает блокировку рекламных блоков Google Analytics

Ответ 8

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

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

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

Вот как я реализовал его на мой блог, который был построен со стеком 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 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 Script

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

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

Ответ 9

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

Ответ 10

varvy.com (100/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);

Ответ 11

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

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

Ответ 12

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

<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

Ответ 13

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

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

Ответ 14

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

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

Ответ 16

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

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