Комментарии 39
спасибо, хочу еще =)
а если попробовать слепить все js в один файл?
Отличная статья, насрал Вам плюсом в карму :)
Не могли бы вы поподробнее рассказать о реализации алгоритма?
алгоритма параллельной загрузки с последовательным применением? — исходя из названия грузим все сразу, и по мере загрузки скриптов, выполняем их последовательно. если раньше загрузился более дальний по очередности скрипт, он не выполнятся, а ждет пока все предшествующие ему загрузятся и выполнятся…
На ClientSide 2007 был доклад по модульности в JS.
Здесь есть элегантный пример последовательного вызова загруженных JS файлов.
jsx.ru/Texts/ModulesInJS/index.html
Здесь есть элегантный пример последовательного вызова загруженных JS файлов.
jsx.ru/Texts/ModulesInJS/index.html
О, тоесть можно одним js-ником подгружать другие js?
стилистика статьи — просто отстой.
Такой концентрации канцелярщины и мусорных оборотов еще поискать надо.
Пишите проще, к вам потянутся люди.
Такой концентрации канцелярщины и мусорных оборотов еще поискать надо.
Пишите проще, к вам потянутся люди.
Вопрос на засыпку: почему при использовании fullajax — каждый скрипт (22байта) грузится(выполняется?) в 1.5-3 раза дольше чем при использовании jquery? 80-126ms против 107-255?
И как себя ведут не тестовые скрипты в 22байта, а нормального размера скрипт в Nкб ( хотя бы 7-15)?
22байта — абсолютно не серьезно и на «рабочих» скриптах результаты могут быть совсем другие. Не могли бы вы протестировать библиотеки в более приближенных к жизни обстоятельствах?
И как себя ведут не тестовые скрипты в 22байта, а нормального размера скрипт в Nкб ( хотя бы 7-15)?
22байта — абсолютно не серьезно и на «рабочих» скриптах результаты могут быть совсем другие. Не могли бы вы протестировать библиотеки в более приближенных к жизни обстоятельствах?
тоже хороший вопрос. в 1.5. раза дольше ответ от сервера, потому что к нему несколько параллельных запросов одновременно. Вот и думает немного дольше. при большом наплыве народу время отклика примерно одинаковое.
При более приближенных к жизни обстоятельствах ситуация еще плачевнее. В статью добавил картинки и ссылки на дополнительные тесты. Выводы делайте сами.
При более приближенных к жизни обстоятельствах ситуация еще плачевнее. В статью добавил картинки и ссылки на дополнительные тесты. Выводы делайте сами.
А почему 1.2.6? Вероятно, 1.3.2 может себя вести иначе.
> Как видно, jQuery, при асинхронной дозагрузке контента, прибавляет к адресам скриптов приставку типа _=1239115067323, для того чтобы скрипт не кешировался.
Use cache=true, Luke. docs.jquery.com/Ajax/jQuery.ajax#options
Use cache=true, Luke. docs.jquery.com/Ajax/jQuery.ajax#options
ну и? какие ваши соображения относительно этого момента?
Просто традиционно отмечаю, что jQuery умеет несколько больше гитик, чем Вы думаете…
В целом же материал вполне интересный.
В целом же материал вполне интересный.
да я и до этого знал, что jQuery имеет кеш. Помимо документации, я и исходники анализирую. Относительно этого пункта оптимизации — вопрос следующий: «Зачем включен по умолчанию антикеш для скриптов?»
Знали, а написали, что не умеет. Нехорошо, мелко.
А написать метод $.getCachedscript или даже перекрыть $.getscript — дело пяти строчек кода…
А написать метод $.getCachedscript или даже перекрыть $.getscript — дело пяти строчек кода…
Потому что обычно там данные, а как раз данные не нужно кэшировать. Долой кривые настройки корпоративных прокси.
Вообщем, у библиотеки есть две проблемы:
1) применимость строго в рамках домена страницы (потому как XHR aka AJAX) — соответственно ценность асинхронной загрузки JS снижается, поскольку все используемые JS можно упаковать в один файл, пройтись yuicompressor и включить gzip на сервере. Точка.
2) руки авторов. Глянул в код — первые 100 строчек хорошо, а дальше — тихий ужас. Использовать такое в коммерческих проектах — большой риск. Чувствуется опыт программирования в PHP и отсутствие опыта программирования в JS.
А вцелом, продолжайте. Может что-то и вырастет из этого начинания ;-)
1) применимость строго в рамках домена страницы (потому как XHR aka AJAX) — соответственно ценность асинхронной загрузки JS снижается, поскольку все используемые JS можно упаковать в один файл, пройтись yuicompressor и включить gzip на сервере. Точка.
2) руки авторов. Глянул в код — первые 100 строчек хорошо, а дальше — тихий ужас. Использовать такое в коммерческих проектах — большой риск. Чувствуется опыт программирования в PHP и отсутствие опыта программирования в JS.
А вцелом, продолжайте. Может что-то и вырастет из этого начинания ;-)
1) похоже у вас небольшой опыт в разработке сложных комплексных решений одностраничных веб приложений и простых сайтов с использованием AHAH. Упаковка в один файл и gzip никак не противоречат асинхронной загрузке, а наоборот ее улучшают как и в простом случае.
2) вы ошиблись с опредедлением опыта. если вам что-то не понятно в коде, это не значит что это неправильно. код всегда можно улучшать, предела совершенству нет, однако есть предел эффективности.
продолжаем и уже давно выросло.
вы не поняли цель статьи — что даже jQuery можно сделать лучше, главное головой думать и осознавать что происходит, повторюсь — предела нет совершенству.
2) вы ошиблись с опредедлением опыта. если вам что-то не понятно в коде, это не значит что это неправильно. код всегда можно улучшать, предела совершенству нет, однако есть предел эффективности.
продолжаем и уже давно выросло.
вы не поняли цель статьи — что даже jQuery можно сделать лучше, главное головой думать и осознавать что происходит, повторюсь — предела нет совершенству.
> Упаковка в один файл и gzip никак не противоречат асинхронной загрузке, а наоборот ее улучшают как и в простом случае.
То есть вы хотите сказать, что в браузере загрузка N файлов в M потоков в рамках одного домена выгоднее загрузки 1 файла в один поток? Вы действительно так думаете?
> если вам что-то не понятно в коде, это не значит что это неправильно.
Вас публично ткнуть в ваш же код, чтобы вам стыдно стало?
> вы не поняли цель статьи
Цель статьи, как и проекта лежит на ладони — попытка пиара на теме сомнительной ценности с ужасным качеством реализации. Надо быть слепым чтобы не увидеть messages вашего сайта: «Смотрите, какие мы молодцы! Мы профи! Мы уникальны! Купите нас скорее!»
То есть вы хотите сказать, что в браузере загрузка 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';
$[n]($.HTMLThread);
$[n]($.History);
$[n]($.DATAThread);
// конструкция интересная, но наводит на мысль о незнании или непонимании автором концепции замыканий.
document._write = document.write;
document._writeln = document.writeln;
// пфф… опять таки, кто разрешил лезть в 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-го курса. Выполнена на крепкую троечку, не более того. ;-)
=======================================
Открываем 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';
$[n]($.HTMLThread);
$[n]($.History);
$[n]($.DATAThread);
// конструкция интересная, но наводит на мысль о незнании или непонимании автором концепции замыканий.
document._write = document.write;
document._writeln = document.writeln;
// пфф… опять таки, кто разрешил лезть в 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.
критических замечаний нет, и это радует
спасибо за уделенное время, я учту ваши некоторые замечания
по делу замечено
0) trim — ресурсоемок
1) get() — можно записать с одним return
2) копипаст DATAThread(), HTMLThread() — это давно мечтаю сделать через один объект, и таки сделаю
3) код не читабелен, да есть такое дело, ну это наложение многих причин, в том числе и того что я хорошо читаю обфусфицированый код, поэтому наверно пишу сокращенно и иногда логически трудно понимаемо
некоторые пояснения простых вещей
1) конструкции типа
var n = 'addEventsListener'; $[n]($.HTMLThread);
используются для оптимизации размера кода, это в результате меньше чем использовать прямое название функций, выигрыш не очень велик но существует.
2) document._write = document.write; сохранение функциональности исходной функции document.write, так как дальше будет переопределение таковой.
— уверен вам трудно многое понять что для чего и почему, в силу того что никогда не сталкивались и врятли столкнетесь с проблемами и ситуациями которые встречаются при AHAH.
критических замечаний нет, и это радует
спасибо за уделенное время, я учту ваши некоторые замечания
да еще $.Default.initCPLNLS() = копипаст с $.Default.initCPLNLL() тоже в принципе по делу,
уже вынес общее :)
уже вынес общее :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Асинхронная загрузка javascript файлов. Ускорение и оптимизация процесса, увеличение производительности