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")
Ответы
Ответ 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')