Pull to refresh

Comments 39

попробуйте, тогда возникнут другие проблемы :)… в данной статье рассматриваются возможные узкие места. в реальности они могут быть а могут и не быть, в зависимости от ситуации…
Отличная статья, насрал Вам плюсом в карму :)
И я тоже поднасрал!
Спасибо за статью, непременно поковыряю в ближайшее время!
Чертовски приятно, что наши соотечественники делают вещи наравне с буржуями.
Надеюсь, что скоро тенденция искать все новинки и плюшки сначала за бугром изменится.
Засранцы :)
Нет чтоб освятить карму, так они туда это…
Не могли бы вы поподробнее рассказать о реализации алгоритма?
алгоритма параллельной загрузки с последовательным применением? — исходя из названия грузим все сразу, и по мере загрузки скриптов, выполняем их последовательно. если раньше загрузился более дальний по очередности скрипт, он не выполнятся, а ждет пока все предшествующие ему загрузятся и выполнятся…
На ClientSide 2007 был доклад по модульности в JS.

Здесь есть элегантный пример последовательного вызова загруженных JS файлов.
jsx.ru/Texts/ModulesInJS/index.html
одним ccs-ом, можно подгружать другие css. одним html-ом можно подгружать другие html. продолжите сами…
а одним js можно подгрузить и html, и css, и все что угодно :)
стилистика статьи — просто отстой.
Такой концентрации канцелярщины и мусорных оборотов еще поискать надо.

Пишите проще, к вам потянутся люди.
Вопрос на засыпку: почему при использовании fullajax — каждый скрипт (22байта) грузится(выполняется?) в 1.5-3 раза дольше чем при использовании jquery? 80-126ms против 107-255?
И как себя ведут не тестовые скрипты в 22байта, а нормального размера скрипт в Nкб ( хотя бы 7-15)?

22байта — абсолютно не серьезно и на «рабочих» скриптах результаты могут быть совсем другие. Не могли бы вы протестировать библиотеки в более приближенных к жизни обстоятельствах?
тоже хороший вопрос. в 1.5. раза дольше ответ от сервера, потому что к нему несколько параллельных запросов одновременно. Вот и думает немного дольше. при большом наплыве народу время отклика примерно одинаковое.

При более приближенных к жизни обстоятельствах ситуация еще плачевнее. В статью добавил картинки и ссылки на дополнительные тесты. Выводы делайте сами.
А кипалив не работает в этом случае? Все было бы гораздо быстрее с ним…
А почему 1.2.6? Вероятно, 1.3.2 может себя вести иначе.
ждал вопроса :), 1.3.2 ведет себя аналогично.
Напиши Рисигу, вероятно, есть причины такого поведения. Это правда интересно.
кстати, и правда, собрался писать ему :)… причин может быть несколько, я думаю одними из них есть — сложность реализации и размер библиотеки.
> Как видно, jQuery, при асинхронной дозагрузке контента, прибавляет к адресам скриптов приставку типа _=1239115067323, для того чтобы скрипт не кешировался.

Use cache=true, Luke. docs.jquery.com/Ajax/jQuery.ajax#options
ну и? какие ваши соображения относительно этого момента?
Просто традиционно отмечаю, что jQuery умеет несколько больше гитик, чем Вы думаете…

В целом же материал вполне интересный.
да я и до этого знал, что jQuery имеет кеш. Помимо документации, я и исходники анализирую. Относительно этого пункта оптимизации — вопрос следующий: «Зачем включен по умолчанию антикеш для скриптов?»
Знали, а написали, что не умеет. Нехорошо, мелко.

А написать метод $.getCachedscript или даже перекрыть $.getscript — дело пяти строчек кода…
где написал что не умеет? тут?

> Соответственно, процесс дозагрузки скриптов явно продуман не до конца. Однако, цель статьи не в том чтобы раскритиковать работу jQuery.
Потому что обычно там данные, а как раз данные не нужно кэшировать. Долой кривые настройки корпоративных прокси.
насчет корпоративных прокси трудно что-то сказать… наверно это дело имеет место… думаю об этом должны заботится разработчики сайтов, путем изменения имени скрипта (к примеру версия в имени) при изменении его содержимого
За самими скриптами — следят, похожим образом forms.js?ver=1234A
А вот за данными на страницах — так не последишь.
да именно так, в данной статье рассмотрена оптимизация запроса скриптов, оптимизация запроса данных — это отдельный вопрос.
Вообщем, у библиотеки есть две проблемы:

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';

$[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.

критических замечаний нет, и это радует

спасибо за уделенное время, я учту ваши некоторые замечания
да еще $.Default.initCPLNLS() = копипаст с $.Default.initCPLNLL() тоже в принципе по делу,
уже вынес общее :)
Sign up to leave a comment.

Articles