Асинхронная Google Analytics [Javascript Golf] - PullRequest
18 голосов
/ 18 октября 2010

К сожалению, это может быть неправильный вопрос Code-Golf, так как, скорее всего, это только Javascript;однако, поскольку это, вероятно, будет единственным полезным в мире соревнованием по коду-гольфу Я собираюсь опубликовать его.


Фрагмент Асинхронное отслеживание Google Analytics используется многими веб-сайтами.

Сценарий выглядит примерно так:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

Победитель будет определен по кратчайшему значению RAW DEFLATE (здесь равно разница между сжатым кодом HTTP 1.1 DEFLATE (он же zlib) и RAW DEFLATE) по числу байтов, которое загружает и инициализирует Async Google Analytics на странице.

В случае ничьей победитель будет определен по количеству необработанных символов.Если у нас все еще есть ничья, мы решим к последнему редактированию / времени подачи.

Некоторые правила:

  • Проверка gaq || [] не требуется и следует удалить.
  • должен быть «осведомлен» о протоколе (http vs https).
  • не должен загрязнять глобальное пространство имен (за исключением _gaq var).
  • должен быть доступен для копирования в любой (X) HTML-документ, т. Е. Не зависит от разметки страницы.
  • должен работать во всех браузерах A-Grade .
  • Для этого НЕ необходимо пройти JSLINT или любые валидаторы HTML.
  • должен установить флаг async.
  • должен использовать thisdeflator для подсчета байтов сжатого с помощью deflate выхода.

Совет:

  • Понимание основ алгоритма DEFLATE .И что более важно, сжатие LZ77.


UDPATE 216/275

Поскольку моя оригинальная версия была побита, я отправлю ее сюда:
Примечание. В этом сообщении содержится ошибка, из-за которой для async устанавливается значение false для всех запросов http

(function(d,t,g){_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];g=d.createElement(t);g.src=(g.async=location.protocol[5]?"//ssl":"//www")+".google-analytics.com/ga.js";(t=d.getElementsByTagName(t)[0]).parentNode.insertBefore(g,t)})(document,"script")

Ответы [ 9 ]

7 голосов
/ 18 октября 2010

Обновлено с версиями, протестированными в FF3.6, Opera10, Chrome6, MSIE8:

194/270 : с асинхронным, с кэшированием getElementsByTagName

(_gaq=document.createElement("script")).src=(/^....s/.test(location)?"//ssl":"//www")+".google-analytics.com/ga.js",(_gaq.a=_gaq.async=document.getElementsByTagName("script")[0]).parentNode.insertBefore(_gaq,_gaq.a),_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]]

192/297 : с асинхронной синхронизацией, без кэша

(_gaq=document.createElement('script')).src=(/^....s/.test(location)?'//ssl':'//www')+'.google-analytics.com/ga.js',_gaq.async=document.getElementsByTagName('script')[0].parentNode.insertBefore(_gaq,document.getElementsByTagName('script')[0]),_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]

189/259 : без асинхронности, с кэшированием getElementsByTagName

(_gaq=document.createElement('script')).src=(/^....s/.test(location)?'//ssl':'//www')+'.google-analytics.com/ga.js',(_gaq.a=document.getElementsByTagName('script')[0]).parentNode.insertBefore(_gaq,_gaq.a),_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]

188/286 : без асинхронной работы, без кэширования

(_gaq=document.createElement('script')).src=(/^....s/.test(location)?'//ssl':'//www')+'.google-analytics.com/ga.js',document.getElementsByTagName('script')[0].parentNode.insertBefore(_gaq,document.getElementsByTagName('script')[0]),_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]

184/242 , без асинхронности, appendChild (без кеша), неизвестно, поддерживается ли он везде

(_gaq=document.createElement('script')).src=(/^....s/.test(location)?'//ssl':'//www')+'.google-analytics.com/ga.js',document.getElementsByTagName('script')[0].parentNode.appendChild(_gaq),_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]

Кредиты

  • Касабланка : /^https/.test(location)
  • matyr : относительный путь, запятые между операторами, присвоение async
  • некоторые : без анонимной функции и использования _gaq, отсутствие кэширования getElementsByTagName, назначение асинхронного перемещения, /^....s/
  • Дэвид Мердок падение type="text/javascript"

Кроме того, изменение ' на " может улучшить сжатие в вашем источнике HTML, если вы используете " "для цитирования атрибутов тега.

См. Комментарии к этой записи для получения дополнительной информации

Поскольку этот пост теперь является вики сообщества и принятым ответом, я удалил свои первые попытки (вы можете найти их в истории ревизий, если вам это интересно), и отображаются только самые последние ревизии. Смотрите комментарии к этой записи для получения дополнительной информации. / некоторые

4 голосов
/ 29 июля 2011

183/223 (17,94%) - асинхронно, с протоколом, загрязнение пространства имен отсутствует

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(a,b,c,d){a["get"+b+"sByTagName"](c)[0].parentNode.appendChild(d=a["create"+b](c),d.src=d.async="//google-analytics.com/ga.js",d)}(document,"Element","script");

185/228(18,86%) - асинхронный, с поддержкой протокола, нет загрязнение пространства имен (с переменными d и e)

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(b,a,c){d=a["create"+b](c),d.async=d.src="//google-analytics.com/ga.js",e=a["get"+b+"sByTagName"](c)[0],e.parentNode.insertBefore(d,e)}("Element",document,"script");

186/233 (20,17%) - асинхронный, с поддержкой протокола, отсутствие загрязнения пространства имен

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],(function(a,b,c,d,e){d=a["create"+b](c),d.async=d.src="//google-analytics.com/ga.js",e=a["get"+b+"sByTagName"](c)[0],e.parentNode.insertBefore(d,e)})(document,"Element","script")

Работает на Chrome, Firefox,IE 7+, Opera и Safari.

3 голосов
/ 19 октября 2010

(1) первая попытка

_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']],function(s,g){g=document.createElement(s),g.async=g.src=(/^https/.test(location)?'//ssl.':'//')+'google-analytics.com/ga.js',s=document.getElementsByTagName(s)[0],s.parentNode.insertBefore(g,s)}('script')

Дефлированная длина: 199 байт.Исходная длина: 259 байт.Экономия 23,17%

(2) (1) + некоторые 4-й

_gaq=document.createElement('script'),_gaq.async=_gaq.src=(/^https/.test(location)?'//ssl.':'//')+'google-analytics.com/ga.js',document.getElementsByTagName('script')[0].parentNode.insertBefore(_gaq,document.getElementsByTagName('script')[0]),_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]
* 1017: 192 байта.Исходная длина: 297 байт.35,35% экономии
2 голосов
/ 18 октября 2010

Обновлено в соответствии с обновленными правилами:

Включая теги <script>: дефлированная длина: 226 байт. Исходная длина: 298 байт.

Без тегов <script>: Дефлированная Длина: 216 байт. Исходная длина: 281 байт.

<script>_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];(function(d,g){g=d.createElement('script');g.async=true;g.src='http'+(/^https/.test(location)?'s://ssl':'://www')+'.google-analytics.com/ga.js';d=d.getElementsByTagName('script')[0];d.parentNode.insertBefore(g,d);})(document);</script>

Добавление @ некоторых идей (только проверка location[4] и использование 1 для true) экономит еще 4 байта (212), но я не могу поверить этому.

1 голос
/ 04 ноября 2013

Это может быть обманом, хотя технически он подчиняется всем правилам.;)

<script>var _gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];</script><script src="//www.google-analytics.com/ga.js" async></script>
0 голосов
/ 12 мая 2014

Это нарушает несколько правил, но оно самое короткое и то, что я использую, 165/196 (16%) :

_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]+function(d,e,s){d['get'+e+'sByTagName'](s)[0].appendChild(d['create'+e](s)).src ='//google-analytics.com/ga.js'}(document,'Element','script')

Некоторые заметки:

  • Он не устанавливает асинхронный атрибут, но это идеальный асинхронный в современных браузерах.
  • Он не переписывает URL-адрес в зависимости от текущего протокола, но он должен работать на защищенных сайтах, поскольку использует URL-адрес, относящийся к протоколу (я ни в коем случае не эксперт, но открываю https://google -analytics.com / ga.js в моем браузере дает мне зеленый значок замка)
  • Я обнаружил, что не разумно помещать скрипт в конец документа и опускать </script></body></html>, чтобы пережевать несколько байтов, скрипт никогда не будет оценен ..
  • Я уверен, что если кто-то предан и достаточно волшебен, даже это можно сделать короче; -)

Более читаемое форматирование:

_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']]
+function(d,e,s){
    d['get'+e+'sByTagName'](s)[0]
        .appendChild(d['create'+e](s))
        .src ='//google-analytics.com/ga.js'
}(document,'Element','script')
0 голосов
/ 09 октября 2011

Первая попытка, спасибо за идеи всем здесь.

200/253 (я не знаю, как оптимизировать для deflate ... единственное, что я сделал, это изменил имена переменных)

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(e,t){(c=e.createElement(t)).async=c.src=(/s:/.test(location)?"//ssl":"//www")+".google-analytics.com/ga.js";(e=e.getElementsByTagName(t)[0]).parentNode.insertBefore(c,e)}(document,"script")

195/258 Не поможет (документ, "скрипт") помочь?

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(){(e=document.createElement("script")).async=e.src=(/s:/.test(location)?"//ssl.":"//")+"google-analytics.com/ga.js";(t=document.getElementsByTagName("script")[0]).parentNode.insertBefore(e,t)}()

Для наименьшего возможного кода вам даже не нужен "ssl". и "www." префиксы. Это по-прежнему соответствует правилам конкурса ...

175/216

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(e,t){(a=e.createElement(t)).async=a.src="//google-analytics.com/ga.js";(e=e.getElementsByTagName(t)[0]).parentNode.insertBefore(a,e)}(document,"script")

174/224 А вторая и третья оптимизации объединены ...

_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]],function(){(e=document.createElement("script")).async=e.src="//google-analytics.com/ga.js";(t=document.getElementsByTagName("script")[0]).parentNode.insertBefore(e,t)}()

Редактировать: с помощью регулярных выражений / s: / now и других ...

194/266 Очевидно, повторное использование _gaq помогает ...

(_gaq=document.createElement("script")).async=_gaq.src=(/s:/.test(location)?"//ssl":"//www")+".google-analytics.com/ga.js",(_gaq._=document.getElementsByTagName("script")[0]).parentNode.insertBefore(_gaq,_gaq._),_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]]

166/229 и без "ssl" и "www" ...

(_gaq=document.createElement("script")).async=_gaq.src="//google-analytics.com/ga.js",(_gaq._=document.getElementsByTagName("script")[0]).parentNode.insertBefore(_gaq,_gaq._),_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]]
0 голосов
/ 29 октября 2010
(function(d,l,t,g){_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];(g=d.createElement(t)).src=(l[5]?"ssl.":"")+"google-analytics.com/ga.js";g.async=1;(t=d.getElementsByTagName(t)[0]).parentNode.appendChild(g,t)})(document,location.protocol,"script")

Дефлированная длина: 206 байтов.Исходная длина: 256 байт.19,53% экономии

против.без асинхронности:

(function(d,l,t,g){_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];(g=d.createElement(t)).src=(l[5]?"ssl.":"")+"google-analytics.com/ga.js";(t=d.getElementsByTagName(t)[0]).parentNode.appendChild(g,t)})(document,location.protocol,"script")

Дефлированная длина: 199 байт.Исходная длина: 246 байт.Экономия 19,11%

-

немного короче будет так:

var d=document,t="script",g;_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];(g=d.createElement(t)).src=(location.protocol[5]?"ssl.":"")+"google-analytics.com/ga.js";g.async=1;(t=d.getElementsByTagName(t)[0]).parentNode.appendChild(g,t)

Дефлированная длина: 196 байт.Исходная длина: 242 байта.19,01% экономии

против.без асинхронности:

var d=document,t="script",g;_gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];(g=d.createElement(t)).src=(location.protocol[5]?"ssl.":"")+"google-analytics.com/ga.js";(t=d.getElementsByTagName(t)[0]).parentNode.appendChild(g,t)

Дефлированная длина: 188 байтов.Исходная длина: 232 байта.Экономия 18,88%

-

дефлировано 188 байтов , а исходные 232 байта настолько коротки, насколько я могу идти ...;)

0 голосов
/ 19 октября 2010

Это, наверное, моя лучшая попытка, учитывая мою неопытность в Javascript.Здесь ничего особенного не происходит:

_gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
(function(d,e){e=d.createElement('script');e.id='s';e.async=1;
e.src='http'+('s'==d.location.protocol[5]?'s://ssl':'://www')+'.google-analytics.com/ga.js';
d=d.getElementByTagName('script');d.parentNode.insertBefore(e,d);})(document);

РЕДАКТИРОВАТЬ

Исправлены ошибки, о которых говорил @ some.

Дефлированная длина: 219 байт
Исходная длина: 285 байт

...