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 обманывает вас, вы можете обмануть так:
это user-agent для 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 баллов, это сделает это.
есть подмножество библиотеки Google Analytics js под названием ga-lite что вы можете кэшировать, как вы хотите.
библиотека использует публичный REST API Google Analytics для отправки данных отслеживания пользователей в Google. Вы можете прочитать больше от сообщение в блоге о ga-lite.
отказ от ответственности: Я являюсь автором этой библиотеки. Я боролся с этой конкретной проблемой, и лучшим результатом, который я нашел, было внедрение этого решения.
Я бы не беспокоился об этом. Не ставьте его на свой сервер, похоже, это проблема с Google, но так хорошо, как он получает. Размещение файла на вашем собственном сервере создаст много новых проблем.
им, вероятно, нужно, чтобы файл вызывался каждый раз, а не получал его из кэша клиента, так как таким образом вы не будете считать посещения.
Если у вас есть проблема, чтобы чувствовать себя хорошо с этим, запустите Google insights URL на самом 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 Метод действия Прокси аналитики в 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 Page speed 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
использование:
- некоторые серверные технологии (https://github.com/matthiasmullie/minify)
- внешняя служба (http://www.cloudflare.com)
Не забудьте минимизировать файлы перед его использованием. В противном случае он будет потреблять больше времени обработки.