У меня возник один, на первый взгляд, странный вопрос.
Я пишу макрос (метапрограмму) который по коду на статически типизированном языке (Nemerle) генерирует клиентский JavaScript для Web-страниц. В том числе этот генератор должен формировать скрипты клиентских шаблонов. Шаблон — это генератор HTML. К шаблону можно будет производить декларативную привязку ViewModel (используется шаблон проектирования MVVM).
Так вот в коде Nemerle шаблон представлен в виде AST который формирует XML в формате XLinq (XElement(...)). Другими словами имеется уже разобранный HTML, а не просто текст.
Вопрос заключается в том можно ли генерировать JavaScript который будет работать не с текстом, а напрямую с DOM-ом HTML-я? Не приведет ли это к тормозам или очень большому объему скриптов (ведь их придется слать на клиента)?
Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Всем привет!
VD>У меня возник один, на первый взгляд, странный вопрос.
VD>Я пишу макрос (метапрограмму) который по коду на статически типизированном языке (Nemerle) генерирует клиентский JavaScript для Web-страниц. В том числе этот генератор должен формировать скрипты клиентских шаблонов. Шаблон — это генератор HTML. К шаблону можно будет производить декларативную привязку ViewModel (используется шаблон проектирования MVVM).
VD>Так вот в коде Nemerle шаблон представлен в виде AST который формирует XML в формате XLinq (XElement(...)). Другими словами имеется уже разобранный HTML, а не просто текст.
VD>Вопрос заключается в том можно ли генерировать JavaScript который будет работать не с текстом, а напрямую с DOM-ом HTML-я? Не приведет ли это к тормозам или очень большому объему скриптов (ведь их придется слать на клиента)?
VD>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
Манипуляции с DOM медленные, особенно удаление поддеревьев. Создавать лучше всего так:
e = document.createElement('div');
e.innerHTML = "что отрендерил шаблон";
Ну или e = $("что отрендерил шаблон")[0], если очень хочется впихнуть jQuery.
Здравствуйте, VladD2, Вы писали:
VD>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
Насколько я понимаю, рекомендуемое авторами jQuery — jQuery.tmpl
T>>Манипуляции с DOM медленные, особенно удаление поддеревьев.
VD>Шаблон должен только рендерить некую часть ХТМЛ-я и заменять ее то что было до этого.
VD>Вот примеры того что требуется реализовать: VD>http://knockoutjs.com/examples/templating.html VD>http://knockoutjs.com/examples/cartEditor.html
T>>Создавать лучше всего так:
T>>e = document.createElement('div'); T>>e.innerHTML = "что отрендерил шаблон";
VD>То есть тупо формировать код который сначала создаст строку, а потом скормит ее броузеру?
Да. Жаваскриптер Алексей подсказывает, что только V8 и какая-то опера делают createElement незначительно быстрее, чем innerHTML. Поэтому innerHTML выбирается как "неплохое на современных браузерах и лучшее на старых".
Здравствуйте, Курилка, Вы писали:
VD>>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
К>Насколько я понимаю, рекомендуемое авторами jQuery — jQuery.tmpl
Его же использует и кнокаут. Вопрос, насколько он шустрый. По моим ощущениям — не очень.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
T>>e = document.createElement('div'); T>>e.innerHTML = "что отрендерил шаблон"; VD>То есть тупо формировать код который сначала создаст строку, а потом скормит ее броузеру?
Если вы завяжетесь на innerHTML, то на вашем фреймворке никогда не удастся создать XML-документ (XHTML и прочее).
Здравствуйте, VladD2, Вы писали:
VD>Вопрос заключается в том можно ли генерировать JavaScript который будет работать не с текстом, а напрямую с DOM-ом HTML-я? Не приведет ли это к тормозам или очень большому объему скриптов (ведь их придется слать на клиента)?
Не сложно написать код переводящий некую структуру, описывающую разобранный HTML, в текст для последующей вставки через innerHTML или в фрагмент документа, для вставки методами DOM. Поэтому достаточно будет предавать эту структуру и код работающей с ней. Кроме того, все эти текстовые данные достаточно хорошо сжимаются при передаче.
VD>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
Разработчики могут склоняться к иным библиотекам. Возможно, лучшим решением будет написание абстракции, позволяющей подключить желаемую библиотеку.
T>>Ну, как обычно, + медленнее, чем join.
VD>А полноценного StringBuilder/StringBufer я так понимаю не?
VD>А массивы в ЖС шустро работают? Можно промежуточные результаты в них складывать, а потом join использовать?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Курилка, Вы писали:
VD>>>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
К>>Насколько я понимаю, рекомендуемое авторами jQuery — jQuery.tmpl
VD>Его же использует и кнокаут. Вопрос, насколько он шустрый. По моим ощущениям — не очень.
Про скорость вспоминается только этот пост годишней давности
Здравствуйте, VladD2, Вы писали:
T>>Ну, как обычно, + медленнее, чем join. VD>А полноценного StringBuilder/StringBufer я так понимаю не? VD>А массивы в ЖС шустро работают? Можно промежуточные результаты в них складывать, а потом join использовать?
Такие вопросы не вполне корректны, скорость тех или иных вещей очень сильно зависит от конкретного браузера и даже от его версии. К примеру, вот этот конкретный вопрос. IE когда-то очень медленно складывал строки (не знаю как сейчас), поэтому для него оптимальным решением было сложить строки в массив и вызвать join. Однако другие браузеры складывают строки быстро, и накладные расходы на формирование массива могут делать в них способ с join невыгодным. Однако в среднем, поскольку в IE выигрыш получается существенным, лучше использовать join.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Курилка, Вы писали:
VD>>>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
К>>Насколько я понимаю, рекомендуемое авторами jQuery — jQuery.tmpl
VD>Его же использует и кнокаут. Вопрос, насколько он шустрый. По моим ощущениям — не очень.
Я сравнивал следующие движки:
PURE
Mustache
jQuery.tmpl()
Trimpath JavaScript Micro-Templating (это фактически client side PHP processor)
EJS (Embedded JS)
jQuery.tmpl() и JavaScript Micro-Templating должны быть самыми быстрыми — templates компилируются в JS bytecode и исполняются.
Здравствуйте, anonymous, Вы писали:
A>Если вы завяжетесь на innerHTML, то на вашем фреймворке никогда не удастся создать XML-документ (XHTML и прочее).
Это по чему это? И что "прочее"?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, anonymous, Вы писали:
A>Такие вопросы не вполне корректны, скорость тех или иных вещей очень сильно зависит от конкретного браузера и даже от его версии. К примеру, вот этот конкретный вопрос. IE когда-то очень медленно складывал строки (не знаю как сейчас), поэтому для него оптимальным решением было сложить строки в массив и вызвать join. Однако другие браузеры складывают строки быстро, и накладные расходы на формирование массива могут делать в них способ с join невыгодным. Однако в среднем, поскольку в IE выигрыш получается существенным, лучше использовать join.
Вопрос как раз совершенно корректный и очевидный. Конечно же рассчитывать надо самый медленный из реально используемых робузеров. Так что если скажем IE 6 тормозит, то "+" лучше не использовать.
Ну, а массив + join хорош еще и тем, что в отличии от + — это динамическое решение. Скорость упрется только в скорость изменения размеров массива. "+" же будет по любому перезанимать память при каждом присвоении переменной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, anonymous, Вы писали:
A>Не сложно написать код переводящий некую структуру, описывающую разобранный HTML, в текст для последующей вставки через innerHTML или в фрагмент документа, для вставки методами DOM. Поэтому достаточно будет предавать эту структуру и код работающей с ней. Кроме того, все эти текстовые данные достаточно хорошо сжимаются при передаче.
Интересная мысль. Надо подумать над этим.
VD>>Если вопрос производительности не критичен, то второй вопрос. Какими методами лучше всего формировать DOM? Пока что я склоняюсь к использованию JQuery.
A>Разработчики могут склоняться к иным библиотекам. Возможно, лучшим решением будет написание абстракции, позволяющей подключить желаемую библиотеку.
Основная задача вообще снять с разработчика необходимость писать ЖабаСкрипты. Здесь можно увидеть примеры альфа-версии (прототипа) библиотеки.
Вот один из примеров:
По модели представления (BetterListViewModel в данном случае) генерируется объект ЖабаСкрипта который автоматически оповещает всех подписчиков.
Представление генерируется на сервере, но использует клиентский биндинг. Для элементов вроде button, input и select на клиенте ничего генерировать не надо.
Шаблоны же нужны для более сложных случаев. Они так же будут описываться на статически типизированном языке. Их можно будет отрендерить на сервере (и получить ХТМЛ), или на клинте (с использованием скрипта сформированного по описанию представления в статически типизированном языке). При этом к этим шаблонам должен быть доступен биндинг. Шаблоны должны перереднедиться при изменении модели представления.
Таким образом программист не будет непосредственно работать с ЖабаСикрипотом. Он будет описывать код в статически-типизированном виде (с интеллигентом и проверками строго компилятора) и получать все скрипты в готовом виде. Так что что за сктипт генерируется и какие базовые ЖабаСкрипт-библиотеки используются зависит только от нас (меня в данном случае).
Собственно можно даже обойтись без библиотек. Но боюсь придется убить много времени на обход несовместимостей разных броузеров. По сему и думаю как упростить свою задачу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
A>>Если вы завяжетесь на innerHTML, то на вашем фреймворке никогда не удастся создать XML-документ (XHTML и прочее). VD>Это по чему это? И что "прочее"?
Про XHTML я ошибся, там теперь innerHTML работает, по крайней мере в Gecko. Хотя раньше не работал, потому что вставлять текст в валидный XML-документ не считалось хорошей идеей. А прочее это, к примеру, XUL. Мало ли какой язык разметки решит использовать разработчик, DOM даёт тут единый подход.
А где можно посмотреть на исходники компилятора nemerle в js?
VD>Собственно можно даже обойтись без библиотек. Но боюсь придется убить много времени на обход несовместимостей разных броузеров. По сему и думаю как упростить свою задачу.
Имхо, в голом javascript смысла нет, идеалогически было бы конечно правильно сделать обертку, но вроде никто так не делает, тот же asp.net mvc завязан на jquery, думаю jQuery.noConflict() оптимальный вариант.