попробуйте, тогда возникнут другие проблемы :)… в данной статье рассматриваются возможные узкие места. в реальности они могут быть а могут и не быть, в зависимости от ситуации…
И я тоже поднасрал!
Спасибо за статью, непременно поковыряю в ближайшее время!
Чертовски приятно, что наши соотечественники делают вещи наравне с буржуями.
Надеюсь, что скоро тенденция искать все новинки и плюшки сначала за бугром изменится.
алгоритма параллельной загрузки с последовательным применением? — исходя из названия грузим все сразу, и по мере загрузки скриптов, выполняем их последовательно. если раньше загрузился более дальний по очередности скрипт, он не выполнятся, а ждет пока все предшествующие ему загрузятся и выполнятся…
Вопрос на засыпку: почему при использовании fullajax — каждый скрипт (22байта) грузится(выполняется?) в 1.5-3 раза дольше чем при использовании jquery? 80-126ms против 107-255?
И как себя ведут не тестовые скрипты в 22байта, а нормального размера скрипт в Nкб ( хотя бы 7-15)?
22байта — абсолютно не серьезно и на «рабочих» скриптах результаты могут быть совсем другие. Не могли бы вы протестировать библиотеки в более приближенных к жизни обстоятельствах?
тоже хороший вопрос. в 1.5. раза дольше ответ от сервера, потому что к нему несколько параллельных запросов одновременно. Вот и думает немного дольше. при большом наплыве народу время отклика примерно одинаковое.
При более приближенных к жизни обстоятельствах ситуация еще плачевнее. В статью добавил картинки и ссылки на дополнительные тесты. Выводы делайте сами.
> Как видно, jQuery, при асинхронной дозагрузке контента, прибавляет к адресам скриптов приставку типа _=1239115067323, для того чтобы скрипт не кешировался.
Use cache=true, Luke. docs.jquery.com/Ajax/jQuery.ajax#options
да я и до этого знал, что jQuery имеет кеш. Помимо документации, я и исходники анализирую. Относительно этого пункта оптимизации — вопрос следующий: «Зачем включен по умолчанию антикеш для скриптов?»
насчет корпоративных прокси трудно что-то сказать… наверно это дело имеет место… думаю об этом должны заботится разработчики сайтов, путем изменения имени скрипта (к примеру версия в имени) при изменении его содержимого
1) применимость строго в рамках домена страницы (потому как XHR aka AJAX) — соответственно ценность асинхронной загрузки JS снижается, поскольку все используемые JS можно упаковать в один файл, пройтись yuicompressor и включить gzip на сервере. Точка.
2) руки авторов. Глянул в код — первые 100 строчек хорошо, а дальше — тихий ужас. Использовать такое в коммерческих проектах — большой риск. Чувствуется опыт программирования в PHP и отсутствие опыта программирования в JS.
А вцелом, продолжайте. Может что-то и вырастет из этого начинания ;-)
1) похоже у вас небольшой опыт в разработке сложных комплексных решений одностраничных веб приложений и простых сайтов с использованием AHAH. Упаковка в один файл и gzip никак не противоречат асинхронной загрузке, а наоборот ее улучшают как и в простом случае.
2) вы ошиблись с опредедлением опыта. если вам что-то не понятно в коде, это не значит что это неправильно. код всегда можно улучшать, предела совершенству нет, однако есть предел эффективности.
продолжаем и уже давно выросло.
вы не поняли цель статьи — что даже jQuery можно сделать лучше, главное головой думать и осознавать что происходит, повторюсь — предела нет совершенству.
> Упаковка в один файл и gzip никак не противоречат асинхронной загрузке, а наоборот ее улучшают как и в простом случае.
То есть вы хотите сказать, что в браузере загрузка N файлов в M потоков в рамках одного домена выгоднее загрузки 1 файла в один поток? Вы действительно так думаете?
> если вам что-то не понятно в коде, это не значит что это неправильно.
Вас публично ткнуть в ваш же код, чтобы вам стыдно стало?
> вы не поняли цель статьи
Цель статьи, как и проекта лежит на ладони — попытка пиара на теме сомнительной ценности с ужасным качеством реализации. Надо быть слепым чтобы не увидеть messages вашего сайта: «Смотрите, какие мы молодцы! Мы профи! Мы уникальны! Купите нас скорее!»
Ну если так хочется, ловите. Disclaimer: многа букаф ;-)
=======================================
Открываем fullajax.ru/temp/asyncjs/fullajax1.html и лезем в Firebug. Оппа! У window появился ряд новых свойств, в том числе:
SRAX (ну это понятно, точка входа),
a (это что?),
abort, abortData, arrayIndexOf, arrayRemoveOf, dax, error, get, getData, getInterface, go, hax, id, info, log, post, postData, warn.
Кроме этого, Firebug ябедничает, что некоторые функции не всегда возвращают значение, есть ряд undeclared variables и ряд undefined property.
Теперь заглянем в код. Качаем архив с сырцами и открываем fullajax.js.
Таакс… Хорошо… Хорошо… оппа, модификация String.prototype — кто разрешил?
String.prototype.trim() = ресурсоемкое решение.
String.prototype.replaceAll() = элегантно!
String.prototype.endWith() = борщ! + можно сделать эффективнее.
hax():
if (options.nohistory == null) options.nohistory = options.noHistory; // это типа для обратной совместимости? ;-)
get() — в условии if — ошибка, можно написать это с одним return.
post() — копипаст с get().
dax() — копипаст с hax().
SRAX.extend():
var overwrite = !skipexist; // прикольно звучит, да?
===================
SRAX.init():
— var n = 'addEventsListener';
// пфф… опять таки, кто разрешил лезть в document?
===================
$.Default.initCPLNLS() = копипаст с $.Default.initCPLNLL()
IE_XHR_ENGINE: ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'] = зачем это в таком явном виде? Завтра ожидается новый XMLHTTP от MS?
delHost() = лишний if, лишнее присваивание
paintHtml(), paintHtml2() == когда будет paintHtml3()?
===================
DATAThread(), HTMLThread()
— 1. Копипаст в 200+ строчек!!!
2. _this = this. // Так и есть, автор не умеет пользоваться замыканиями. А все потому что Java.
3. борщ в коде, например:
if (!options.url && options.src) options.url = options.src;
if (!options.cb && options.callback) options.cb = options.callback;
if (options.cbo == null && options.callbackOps != null) options.cbo = options.callbackOps;
if (options.anticache == null && options.nocache != null) options.anticache = options.nocache;
if (overwrite) ops = {};
$.extend(ops, options);
if (ops.async == null) ops.async = true;
ops.url = $.delHost(ops.url);
this.options = ops;
return _this;
===================
Дальше смотреть не стал — зрение дороже. Код абсолютно нечитабелен, приватные по смыслу свойства и методы торчат снаружи SRAX и даже в window — кто не спрятался, я не виноват!
Резюме: курсовая работа студента 3-го курса. Выполнена на крепкую троечку, не более того. ;-)
по делу замечено
0) trim — ресурсоемок
1) get() — можно записать с одним return
2) копипаст DATAThread(), HTMLThread() — это давно мечтаю сделать через один объект, и таки сделаю
3) код не читабелен, да есть такое дело, ну это наложение многих причин, в том числе и того что я хорошо читаю обфусфицированый код, поэтому наверно пишу сокращенно и иногда логически трудно понимаемо
некоторые пояснения простых вещей
1) конструкции типа
var n = 'addEventsListener'; $[n]($.HTMLThread);
используются для оптимизации размера кода, это в результате меньше чем использовать прямое название функций, выигрыш не очень велик но существует.
2) document._write = document.write; сохранение функциональности исходной функции document.write, так как дальше будет переопределение таковой.
— уверен вам трудно многое понять что для чего и почему, в силу того что никогда не сталкивались и врятли столкнетесь с проблемами и ситуациями которые встречаются при AHAH.
критических замечаний нет, и это радует
спасибо за уделенное время, я учту ваши некоторые замечания
Асинхронная загрузка javascript файлов. Ускорение и оптимизация процесса, увеличение производительности