Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Не использовать DOM для хранения данныхт.к. упомянутые там Ember и Backbone вроде как не используют DOM для хранения данных.
Там по большей части сравнение с jQuery
т.к. упомянутые там Ember и Backbone вроде как не используют DOM для хранения данных.
Хочется тесты в сравнении с другими фреймворками, особенно с Angular.js, которые можно «пощупать», наподобие
GET http://fiddle.jshell.net/GdE3r/1/show/light/basis/ui.js 404 (Not Found)


Выходит в вашем варианте не правильно измерялось и тестировалосьНет, просто там дополнительно учитывается время рендеринга. Посмотрите в вашем варианте на Knockout.js 595ms и Angular.js 1075ms, у KO время лучше хотя визуально видно что он отрисовывается в 2 раза медленнее — т.е. цифры врут.
Используя angular вы смогли сделать все решения гораздо медленнее, чем они есть на самом деле.Так оно, но это плата за «удобства», а в реальных приложениях «узкие» места можно переписать на vanilla js, например для теста выше можно было сделать директиву ng-fast-list которая не уступала бы по скорости.
Нет, просто там дополнительно учитывается время рендеринга. Посмотрите в вашем варианте на Knockout.js 595ms и Angular.js 1075ms, у KO время лучше хотя визуально видно что он отрисовывается в 2 раза медленнее — т.е. цифры врут.
Так оно, но это плата за «удобства», а в реальных приложениях «узкие» места можно переписать на vanilla js, например для теста выше можно было сделать директиву ng-fast-list которая не уступала бы по скорости.
Я думаю, что в обоих случаях выпадает часть работы. Так как в вашем варианте он близок к basis.js, но визуально работает в несколько раз медленнее.В Angular Light ничего не «выпадает», все действия отрабатывают последовательно (в одной «итерации»).
Код на angular запутан и его не назовешь «изящным» (но, возможно, это дело вкуса, конечно). И это на простой задаче, а если мы начнем добавляться функционал, то вы быстро обрастете кодом, и решение станет еще более запутанным.Разрабатывал большие веб-приложения на Angular, не возникло проблем с запутаностью кода.
Можно сделать дерективу? Сделайте, было бы интересно увидеть результаты.Вот, конечно это крайний вариант, без шаблонизатора, но показывает до куда можно опуститься, по сути директива просто дает точку позиционирования = элемент + данные, далее вы делаете что угодно.
В Angular Light ничего не «выпадает», все действия отрабатывают последовательно (в одной «итерации»).
Разрабатывал большие веб-приложения на Angular, не возникло проблем с запутаностью кода.
Вот, конечно это крайний вариант, без шаблонизатора, но показывает до куда можно опуститься, по сути директива просто дает точку позиционирования = элемент + данные, далее вы делаете что угодно.
Тогда как вы объясните одинаковые результаты и что визуально оно отрабатывает медленнее?У меня оно соотносится с цифрами — визуально чуть быстрее чем Angular.js
Возможно, у нас разные представления о больших приложениях.Возможно, но Angular так же и официально, «покрывает» нишу больших приложений.
Правда в этом случае у нас не будет ссылок на элементыНо их можно тут же получить после создания DOM, хотя особой выгоды наверно в этом нет.
Но, по-моему, не плохой результат. Что скажете?Да, результат очень хороший.
Основная проблема с plain js (и соотвественно директивой), что если нам нужно поменять разметкуКакая разница, я просто показал что это достаточно гибко, если нужен уровень чуть выше чем js, то можно вставить тот же Basis.template или любой другой шаблонизатор.
Так что можно сказать, что это «неспортивное поведение» ;)Я просто показал как можно победить узкие места, да и вообще по большому счету большинство синтетических тестов показывают «сферического коня».
У меня оно соотносится с цифрами — визуально чуть быстрее чем Angular.js
Возможно, но Angular так же и официально, «покрывает» нишу больших приложений.
Я просто показал как можно победить узкие места, да и вообще по большому счету большинство синтетических тестов показывают «сферического коня».

сборка нужна только для публикации приложения, но не для разработки
Например, у coffeescript есть компилятор написанный на js, это значит что мы можем транслировать его в js хоть на сервере, хоть на клиенте.
Можно использовать какой нибудь вотчер, который будет транслировать файлы в css при их изменении, а дальше все будет работать как раньше.
не существовало спроса на эту функциональность
Основной смысл, что мы не просто обрабатываем какие то файлы, но строим их взаимосвязи и понимаем как они друг друга используют
То есть суть в том, что обрабатывается не просто какой то определенный файл, или тип файлов. А обрабатываются все файлы сразу, с учетом их связей, перестраиваются структуры
@import, а в js — amd/commonJS модулей. Как это помогает разработке?Например, что такой то класс никогда не используется в разметке, а вот для этого класса в шаблоне нет никаких стилей.
ни Backbone, ни Angular не являются фрейморками, если что…
Что насчет тестирования? Я придерживаюсь разработки через тестирование, и т.к. я тестирую не отдельные функции, а пользовательские сценарии, я бы хотел иметь собранный проект, т.к. чаще всего пользовательские действия затрагивают сразу несколько модулей, как быть тогда?
Только что вам даст трансляция coffee->js без возможности сохранить результат? Или вы будете eval'ить код, который будет выходить из такого транслятора? И будете делать это для всех coffee файлов? Я могу сказать, что вы здесь ничего не выигрываете.
Действительно, можно, однако инкрементальные сборки придумали как раз, чтобы уйти от того, что у вас в одной вкладки консоли открыт sass watch, в другой coffee watch, а в третей бог весть что. И более того, это по-прежнему не покрывает кейсов тестирования после изменения coffee файлов.
Вы считаете, что таск-раннеры а-ля Grunt, или системы сборки типо Gulp, Broccoli, Brunch не пользуются спросом?
Не могу представить себе иного сценария, как файл index.html как корень графа, из которого идут две ветви: css и js, в которых в css отражаются зависимости директивы import, а в js — amd/commonJS модулей. Как это помогает разработке?
Chrome Dev Tools -> вкладка audit -> start
Отсутсвие сборки никак не мешает тестированию. Или я чего-то не понимаю?
А зачем его сохранять? Да, код будет eval'ится (через new Function). Так же eval'ится и код всех модулей, на этом построена работа commonjs. Node.js делает точно так же. И, поверьте, в этом нет проблемы.
Html подключает javascript, css, изображения и другие файлы. Javascript подключает другие javascript модули и другой контент, такой как шаблоны, словари, json etc, для некоторых вещей свои синтаксические конструкции. Шаблоны — css, изображения, словари, другие шаблоны. И далее…
У вас всегда вся возможная разметка на странице?
Unit-тестированию не мешает, а функциональному тестированию мешает. Вы не можете провести функциональное тестирование до момента создания консистентного состояния системы, которое достигается успешной сборкой проекта.
А что насчет минификации выходных файлов? Суть в том, чтобы после трансляции coffee->js склеить и минифицировать все JS файлы. Как вы это будете делать, если собираетесь компилировать Coffee на клиенте? Это проигрыш в скорости, как с точки зрения eval'a, так и с точки зрения трафика.
Ну, во-первых это очень похоже на web-компоненты(см. polymer, mozilla x-tags), особенно идея с подключением стилей для конкретных объектов. По-факту, ваша система позволяет производить инкапсуляцию css, js и html в рамках компонента, верно? В таком случае это 1 в 1 повторяет идеологию web-компонентов.
Нет, но у меня всегда подключается gzip-пакет, в котором лежат все JS и CSS. А т.к. мои «фреймворки» позволяют мне выбрать шаблонизатор, с которым я буду работать, то компилируется этот код в JS, и позднее склеивается и минифицируется вместе с остальными JS файлами, тем самым получая максимально маленький размер трафика, который мне надо отдать пользователю. Это уже не говоря о том, что я могу провести вашу проверку на использование стилей в несколько раз быстрее, пробежав всего по 2 файлам: 1 css(результирующий) и 1 js(шаблоны), в то время как при вашем подходе мне придется открывать по 1 все стили и все шаблоны.
$(this.el).addClass('foo-' + bar + '-' + baz) — вы можете сказать какой класс тут будет в результате? Вам так же не поможет поиск, если вы видите класс в селекторе, вы не сможете его найти в шаблоне, если он динамический, и так просто ответить на вопрос используется ли он.Да, верно подмечено, это похоже на web-components. Но там есть ряд отличий и шаблоны basis.js дают гораздо больше, чем просто инкапсуляция.
Например, $(this.el).addClass('foo-' + bar + '-' + baz) — вы можете сказать какой класс тут будет в результате?
Уникальность фреймворка, он очень высоко производительный
Есть киллер фича лайв редактирование.
Фреймворк, очень хорошо подходит для больших проектов
Уникален своими инструментами, написанными на привычном для фронтеенд разработчика стеке
Модульная система позволит вам переиспользовать ваш код без боли, даже в другом проекте.
Есть и недостатки, но я не буду о них упоминать.)
Вообще молодцы ребята, что продолжают развивать проект, а не зарыли его внутри компании, и пытаются поделиться большим опытом разработки действительно сложных фронтенд систем.
Хотелось бы в дополнение к слайдам увидеть бэнчмарки, отражающие заявленные цифры
livereload.com/ — а такое решение не устраивает? Или я что-то не так понял?
Как и любой другой фреймворк, собственно.
Можно поинтересоваться, какие инструменты в этом фреймворке уникальны?
Это не достоинство фреймворка, это достоинство модульной системы.
livereload.com/ — а такое решение не устраивает? Или я что-то не так понял?
Фреймворк, очень хорошо подходит для больших проектовКак и любой другой фреймворк, собственно.
Что касается описываемых вами недостатков — это даже не недостатки, а, скорее, небольшие трудности, которые переживает только что зародившийся проект.
var MyClass = basis.ui.Node.subclass({
method: function(a, b){
basis.ui.Node.prototype.method.call(this, a, b);
...
}
});
var MyClass = basis.ui.Node.subclass({
method: function(a, b){
super(a, b);
...
}
});
// помимо этого
var Node = require('basis.ui.Node');
// работало и это
import Node from 'basis.ui';
Очень попахивает экстом и его ужасными фичами вида «перегрузка свойств в конструкторе» и «автосоздание вьюшек по конфигам».
Смутило, что вы удаляете элелементы, а потом добавляете в нужном порядке. Это конечно очень просто, но ресурсоёмко и теряет фокус. Я у себя пробегаюсь по спискам и трогаю элементы только если их действительно надо переместить.
Также я не разделяю эту любовь к requireJS. Какая разница будет у вас глобальная переменная или же зарегистрированный модуль, который доступен по глобальному имени? Те же глобальные переменные, но зачем-то спрятанные в недра глобальной функиции require.
bower_component/basis/src/basis.js, значит для basis базовый путь будет bower_component/basis/src/. Дальше использовался модуль basis.ui, его имя преобразуется в basis/ui.js. То есть точки заменяются на / и в конце подставляется расширение. К имени добавляется базовый путь и получаем путь к файлу bower_component/basis/src/basis/ui.js. То естьbasis.require('basis.ui');
// эквивалентно
basis.require('./bower_component/basis/src/basis/ui.js');
Относительные пути — это тоже зло, потому что при переносе модуля нужно фигурно исправлять относительные ссылки в него и из него.
Почитай про мою реализацию
Руководство по basis.js. Часть 1: Начало работы, представления, модули, инструменты