Я изучаю некоторые реактивные программы в браузере и сравниваю angular.js(http://angularjs.org/) с Elm (http://elm-lang.org/).
Каковы относительные преимущества/проблемы с каждым?
Я изучаю некоторые реактивные программы в браузере и сравниваю angular.js(http://angularjs.org/) с Elm (http://elm-lang.org/).
Каковы относительные преимущества/проблемы с каждым?
Я думаю, что они разные звери, ИМО, хотя они разделяют цель быть как можно более декларативной, а также отношение "эй, пусть делают вещи, которые они должны делать".
Теперь, при AngularJS, вы все еще находитесь на "знакомой" территории. Значит, вы пишете какую-то разметку здесь, напишите там JS, а затем вы ее подадите. Такой же рабочий процесс, как обычно. "Инновация" AngularJS, насколько я могу судить, заключается в том, что она расширяет HTML с дополнительными типами элементов, так что вы можете объявлять множество аспектов и поведение вашего приложения прямо в разметке, а затем его JS lib содержит необходимые чтобы дать вам шаблоны, маршрутизацию, привязку данных, проверку формы, локализацию и т.д. (... писать это заставляет меня задаться вопросом, может быть, AngularJS страдает от раздувания.), что создает очень полную структуру веб-приложений dev. И это заставляет вас писать свой код в декларативном стиле.
С Elm вы действительно попадаете в новый (если у вас есть "типичный" фон HTML/JS frontend dev). Это другой способ сделать (и придумать) разработку графического интерфейса. Вы напишете совершенно новый язык - специально для создания графических интерфейсов в функциональном режиме реактивного программирования - и в идеале вы никогда не будете иметь дело (по крайней мере, не напрямую) с любым из традиционных API DOM. Elm поставляется со своей "стандартной библиотекой", которая дает вам инструменты для создания и управления графикой/текстом/и т.д. Во времени.
Ваш код языка Elm будет полностью описать то, что вы хотите, чтобы ваш графический интерфейс выглядел и вел себя так, как это происходит, и происходят события (ввод пользователя и т.д.). Затем он скомпилирует все это в HTML/JS/CSS, чтобы он работал в браузере.
Вяз очень молод. Это зависит от вас и ваших потребностей, чтобы решить, является ли это недостатком или нет.
Я полагаю, что выбор AngularJS - это то же самое, что и "попробуй попробовать эту JS-библиотеку/фреймворк" - процесс, к которому мы привыкли в мире JS. Вы захватываете файлы lib, добавляете их в свой проект и начинаете использовать его API. Если Elm, вам нужно начинать приближаться к своему рабочему процессу и решать проблемы по-разному.
AngularJS дает вам много структуры, и это отличается от, скажем, Backbone.js, но в конце дня, если вы хотите сделать некоторые продвинутые графические интерфейсы и графическое поведение, с помощью AngularJS вы вернетесь к написанию тонна плитки, которая вам не придется писать, если вы используете Elm.
С другой стороны, если вам нужно разработать и опубликовать большое веб-приложение прямо сейчас, с обычными виджетами GUI, которые мы использовали в Интернете до сих пор, я был бы склонен сказать, пойти на AngularJS, потому что он более стабилен.
Сказав это, я думаю, что Elm - это самое интересное и многообещающее событие в мире frontend dev. И, если бы мне пришлось разрабатывать и выпускать некоторые графические материалы сегодня, я бы пошел на Elm, так как с ним можно было сделать очень сложный материал GUI в очень немногих строках кода. Но сначала мне нужно вникать в его мышление и иметь дело с тем, что он очень молод и интегрирован с существующей кодовой базой JS-интерфейса, может быть, не просто или даже возможно.
Edit:
По состоянию на март 2015 года, Elm намного более надежный, и там есть отличные инструменты для него (на ум приходит время от времени отладчик).
Angular остается, но, тем более. Следует отметить, что подход Angular с его подходом "a-ton-of-things-things-every-a-model-changes" ( "привязка двухсторонних данных" ) делает его совершенно непригодным для таких вещей, как браузерные игры, в то время как Elm выделяется в играх и расширенном графическом интерфейсе, который должен хорошо работать. Кроме того, Elm теперь имеет быструю (используя виртуальную платформу) библиотеку HTML, когда вам нужно говорить в HTML.
Моя кость, чтобы выбрать с Elm, заключается в том, что ее система типов не такая выразительная, как, например, Хаскеля. Некоторые могут подумать, что это требует роскоши, но, наоборот, она утрачивает способность выражать основные функции. Особенно нас, опытных программистов JS, страдают от недостаточно выразительных систем статического типа, потому что это означает, что полиморфный код, который мы привыкли легко выражать в JS, становится ошибкой типа в Elm из-за отсутствия, например, ранга-2.
К счастью, все функции "списка желаний", которые отсутствуют в Elm, не существуют из-за продолжающегося обсуждения их и их альтернатив. Таким образом, безопасная ставка на то, что они (или лучшие альтернативы) в конечном итоге перейдут на язык.
Оба сложных статических графических макета и интерактивность в Elm гораздо проще, чем в HTML/CSS/любой среде JavaScript. С Elm случайная сложность заключается в типах, но стоит узнать о них - они помогают понять, отлаживать и изменять программное обеспечение лучше, и они должны быть уже знакомы вам, если вы исходите из фона функционального программирования. Обратите внимание, что вы также можете вставлять Elm в HTML/JS, поэтому теоретически вы можете постепенно мигрировать.
Elm намного более самоуверенный, чем Angular, и особенно в отношении управления состоянием. Если вы обнаружите, что состояние становится проблемой в обычном приложении Angular, тогда у вас может возникнуть соблазн посмотреть на централизованное (монолитное состояние), используя подход стиля Redux, при этом ngrx быстро приходит в голову.
Elm олицетворяет понятие центрального неизменяемого состояния и является источником вдохновения для Redux . Elm обеспечивает единственное неизменяемое состояние с функцией чистого обновления (редуктора). На мой взгляд, это делает обработку состояния в высокореактивном веб-приложении намного проще, чем путаница, которая может возникнуть с использованием OO-подобного шаблона в Angular.
Elm отлично подходит для большинства приложений, но его можно немного усложнить, если вы хотите работать с внешними JS-библиотеками (например, google maps), так как его внешний интерфейс (порты) довольно жесткий. Подобная анимация, необходимая в Material Design, также оказалась сложной для архитектуры Elm - это не означает, что анимации нет, но они требуют больше проводки, чем вы могли бы захотеть.