Ангулар так плох?

Решил написать ответ на статью “Почему вам НЕ стоит использовать AngularJs“.

Пройдемся по всем пунктам.

Двусторонний дата-биндинг

Да, механизм вотчеров далеко не очевиден. Но при этом, если мы не уходим в дебри, то нам не нужно задумываться о вотчерах при использовании двухстороннего связывания. С помощью этого механизма даже дизанер-верстальщик может делать интерактивные прототипы, причем довольно быстро.

Сравнение фронтенда с бэкендом во многих случаях не уместно. Да, есть какие-то общие паттерны, но не более того.

То, что в большинстве случаев двухсторонний биндинг не нужен, – согласен. Но это не важно, если вы разрабатываете прототип. Если вы разрабатываете громадное приложение или сфокусированы на мобильные платформах, то лучше конечно пользоваться одноразовым биндингом.

Да, у количества вотчеров есть рекомендуемый лимит в 2000. Иначе будут тормоза. Это плохо. Но чтобы достичь этого числа не умышлено, нужно хорошо постараться. Покажите мне примеры приложений, которые превысили 1500, или хотя бы 1000.

Сам по себе цикл дайджеста (вместе с вотчерами) не медленный. Но если постараться, вы можете сделать его таким.

Dependency Injection

Ну тут странно на что-то жаловаться. Прекрасный концепт. Разве нет? Он позволяет вам не только четко определять зависимости во всех сущностях, но и удобно тестировать эти сущности подставляя мок-сервисы вместо реальных.

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

[javascript]
function MyController($scope, $window){
//…
}
[/javascript]

В общем я бы не сказал, что это проблема, скорее – специфика, к которой привыкаешь и потом спокойно используешь.

Что может стать действительно проблемой – это минификация кода при использовании сокращенной формы записи. Но тут тоже такая ситуация: дизайнер/верстальщик/новичек не будет использовать минификацию кода, а опытный программист, даже если не сталкивался до этого с подобного рода проблемами, быстро найдет причину и будет использовать ngAnnotate для минификации.

Есть и синтаксис без магии:

[javascript]
MyController.$inject = [‘$scope’, ‘$window’];
[/javascript]

используйте то, что больше нравится. Мне, например, нормально с ngAnnotate и сокращенным синтаксисом при разработке.

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

Наследование скопов

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

Директивы

Итак, какие тут нарекания? Если мы выведем список всех возможны параметров при объявлении директивы, действительно, может стать страшно. Но мы познаем все эти параметры по степени необходимости, в этом вся прелесть: нам не нужно для каждой директивы определять метод пред и пост компиляции. Мы используем параметры, которые нам нужны. Чем больше мы знакомимся с фреймворком, тем большим количеством параметров мы оперируем.

То, что слабо освещено в статье-критике, хотя является существенным недостатком – это все те же скоупы и передача данных в директиву в целом. Мы входим в небольшой ступор, когда видим символы “@ & =” . Некоторые из-за этого, продолжая находиться в ступоре, используют родительский скоуп, что в большей части случаев не правильно. Хотя для мелких приложений и прототипов должно хватить с головой.

Что касается оборачивания jQuery плагинов в директивы(или элементы структуры фреймворка) – это нормальный подход для любого фреймворка, не вижу тут ничего плохого.

Проблемы с людьми

Якобы у Ангуляра высокий входной порог. Вот тут я полностью не согласен с автором статьи. С чем вы сравниваете? С jQuery?

При хорошем знании JavaScript уже через 2 дня работы с фремворком понятны базовые принципы, а через недели две – уже можно создавать свои приложения на нем. Да, конечно, чтобы вникнуть во все тонкости, можно потратить Очень много времени.

То, что серверные разработчики не сразу понимают, что происходит в коде приложения на Ангуляре – ну это вообще не аргумент. Да, если мы будем писать все только на jQuery, то для серверных ребят будет все намного понятнее… хотя нет, в случае с большими приложениями – будет еще хуже.

Для объективности предлагаю сравнивать сложность AngularJS с Ember.js (который, кстати, тоже считаю хорошим фреймворком)

Невозможность серверной шаблонизации

В связи с тем, что мы декларативно задаем многие вещи в HTML (опять же что прекрасно повышает читабельность и серьезно уменьшает количество JS кода), мы не можем компилировать шаблоны на стороне сервера.

Для поисковых движков мы можем использовать подготовленные страницы с помощью сервиса prerender.io(не считаю его костылем).

Дебаггинг

Под этим пунктом подписываюсь. Дебаггинг сложный и неудобный, особенно в представлении.

Batarang и ng-inspector только частично решают вопрос.

Важные вещи россыпью

  • Мало кто когда хвалил документацию. Примеры хорошей документации?
  • На данный момент директив drag&drop уже полно
  • Гугл НЕ создавал AngularJS, просто с некоторого времени он его активно поддерживает и раскручивает.

Заключение

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

Другими словами: только потому, что у каждого фреймворка есть свои минусы, давайте не использовать фреймворк вообще! WAT?!

Теперь от себя: по моему мнению AngularJS изначально не создан для огромных приложений, и не стоит его судить по этому критерию. Что нам дает AngularJS? Быстрый старт, быстрое прототипирование, гибкость в разработке сравнительно небольших приложений, удобное тестирование, модульность.

 

UPS: как подсказали на хабре: само определение “разработан для огромных приложений” не совсем корректно. Так как сложно найти фреймворк, который разрабатывался только для “огромных приложений”.