Подтвердить что ты не робот

Async Google Analytics [Javascript Golf]

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


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

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

<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 (aka zlib) и RAW DEFLATE) байтом, который будет загружать и инициализировать Async Google Analytics на странице.

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

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

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

Совет:

  • Понимать основы алгоритма 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")
4b9b3361

Ответ 1

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

194/270: с async, с кешем 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: нет async, с кешем 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: нет async, нет кеша

(_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, нет async, 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']]

Кредиты

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

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

Подробнее см. комментарии к этому сообщению

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

Ответ 2

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

(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) + некоторые 4th

_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']]

Дефлированная длина: 192 байта.   Длина оригинала: 297 байт.   Экономия 35,35%

Ответ 4

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

Включая теги <script>: Deflated Length: 226 bytes. Длина оригинала: 298 байт.

Без тегов <script>: Deflated Length: 216 bytes. Исходная длина: 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), но я не могу взять на это риск.

Ответ 5

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

<script>var _gaq=[["_setAccount","UA-XXXXX-X"],["_trackPageview"]];</script><script src="//www.google-analytics.com/ga.js" async></script>

Ответ 6

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

Ответ 7

(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%

против. нет async:

(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%

против. нет async:

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%

-

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

Ответ 8

Сначала попробуй, придумай для всех всех здесь.

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

_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 Не использовал (document, "script" )?

_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)}()

Изменить: с помощью regex/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"]]

Ответ 9

Это нарушает несколько правил, но это кратчайший до сих пор и то, что я использую, 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')

Некоторые примечания:

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

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

_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')