Gaperton (gaperton) wrote,
Gaperton
gaperton

Category:

О JS фреймворках вообще

Вообще, особенности работы браузеров, указанные в предыдущем посте, грядущий HTML5/CSS3, и прочее "состояние+тренды", если подбить все в кучу - ведет к тому, что надо переосмыслить взгляд на JS фреймворки.


Начать можно с того, что если вы собираетесь сделать в браузере нечто сложное, то jQuery-евский тезис, что он мол "меняет ваш способ программирования на JavaScript", работать перестает. При попытке сделать оффлайновое приложение вы уже не можете игнорировать особенности браузера.

А эти особенности таковы, что внутри браузера, точно так же как и в обычных веб-приложениях, рулит конструирование страниц (и их фрагментов) посредством простых манипуляций со старым добрым текстом, а вовсе не модификация DOM-дерева, подсахаренная этими "новыми способами". Использовать внутрибраузерные шаблонные движки - в десятки раз быстрее.

Хороший современный фреймворк не может это игнорировать. Работа с шаблонами, знакомая каждому веб-программисту - должна быть основным, а не добавочным способом рендеринга контента в клиентском веб-фреймворке.

Второй момент. CSS3, который очень скоро будет полностью поддержан всеми современными браузерами, знаете-ли, может очень много. Настолько много, что, например, для анимации поддержка фреймворка уже не является необходимой - много что можно сделать вообще не прикасаясь к JavaScript. И это замечательно.

Третий момент. Делегация событий - замечательная штука. Вернее, не так. Способ привязки событий, к которому подталкивает вас jQuery и иже с ними (выборка элементв селекторами и привязка к ним) - непрактичен, приводит к тормозам, и его следует избегать. Это, опять же, принципиальная особенность работы браузеров, которую невозможно игнорировать, если вы соберетесь писать нечто серьезное.

Как "хороший фреймворк" должен обходится с событиями? Диспетчеризовать их в ручную - не лучший вариант.

Хороший современный фреймворк должен привязывать события декларативно. Что-нибудь вроде такого:


И в контроллере пишем просто:
$root.click({
    a : function(){

    },
    b: function(){

    }
});


И останавливать bubbling событий по умолчанию.

И все. Все, блин. Никаких селекторов, и неудобоваримой "делегации".

Все указанное выше, будучи положено в основу фреймворка, уже его радикально изменит. Большая часть того, что есть в jQuery, и на чем он построен - вам просто не понадобится.

Зато потребуется другое - то, чем в базовом jQuery и не пахнет.
1) Нормальная и простая в использовании модульная система, с подгрузкой модулей по локальным зависимостям. Чтобы не возникал вопрос, "how can I include JS in JS".
2) Поддержка модулей разного типа - в том числе CSS и HTML-шаблонов.
3) Не выносящий мозг способ группировать фрагменты HTML шаблонов+JS+CSS способом, пригодным к повторному использованию. То есть - определять свои виджеты, которые лежат в модулях. Чтоб это было почти так же легко, как выделить код в функцию.
4) Поддержка сетевого уровня и локального хранения данных.
5) Фьючерсы-промисы - должны быть реализованы по человечески, и лежать в основе всей системы, в том числе и сетевого уровня, пряча прямолинейные коллбэчные интерфейсы.

Описываемый подход обладает сущностью PHP. Он не прячет от программиста HTML на задворки сцены, притворяясь десктопным API, как это делает Cappuccino. И он не выглядит набором свистулек, "изменяющих ваш способ программирования", как jQuery. И не похож на навороты вроде ExtJS, при взгляде на который у многих волосы встают дыбом.

Этот подход не удивляет. Ибо он выглядит - как старое, доброе, обычное веб-приложение. Но - работающее в браузере. А с хера-ли веб-приложению выглядеть как-то по другому? :)

На самом деле, все описанное, кроме декларативной привязки событий, лично у меня уже есть, и кода во всем этом - тьфу. Почти ничего. Я вот начинаю задумываться, нахрена при всем описанном необходим такой хороший jQuery. Я вот посчитал, что из него в аппликухе используется. По факту - почти ничего. Только компоненты, отвечающие за анимацию (которую скоро можно будет делать и без него). При декларативном байндинге - его селекторы тоже не нужны. Вставка - не нужна, все равно innerHTML применяется.

Такие дела. JS фреймворки, в том виде, в котором они есть - по большому счету, просто не нужны. Времена меняются. Скоро будут нужны не они.

Вот пример фреймворка такого типа, о котором говорю я.
http://archetypejs.org/

PS: Я вообще скажу так - добавление динамики в контроллере посредством селекторов а-ля CSS, как в jQuery - зло. Почему? Да потому, что когда вы смотрите в шаблон, вы не понимаете, за что конкретно, за какие элементы зацепятся обработчики событий, ибо в контроллере может быть наворочено селекторами все, что угодно. Это очень плохо. Потому, что контракт между view и controller получается неявным.

Иметь четкие соглашения, определяющие точки зацепления виджетов и обработчиков событий в шаблоне декларативно - это, напротив, хорошо. Потому, что код становится понятным.

В жопу селекторы.

PPS: Право слово, жаль, что у меня в ближайший год будет много менеджерской работы. Глядя на этот бардак в JS фреймворках, я сожалею, что переквалифицировался в менеджеры. Я, вероятно, не смогу исправить ситуацию лично. Но, уметь программить вообще хорошо - это дает непревзойденное ощущение понимания деталей, и эффективно заменяет прохождение теста на IQ. :)

Так что JS программирование я бросать не собираюсь. Тем более, что, думаю, придется писать свой "правильный" трекер-тайм-менеджер. А то ведь с ними беда похуже, чем с JS фреймворками.
Tags: html, html5, javascript, jquery, web
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 45 comments