Angular.js与Elm有什么优缺点?
我正在浏览器中做一些反应式编程,并比较angular.js( http://angularjs.org/ )和Elm( http://elm-lang.org/ )。
每个人有哪些相对的好处/问题?
我认为他们是不同的野兽,国际海事组织,虽然他们有共同的目标,尽可能声明,并且“嘿,让我们做他们的方式我们应该做他们 ”的态度。
现在,与AngularJS,你仍然在“熟悉的”领域。 也就是说,你在这里写一些标记,在那边写一些JS,然后你就可以服务了。 和往常一样的工作stream程 据我所知,AngularJS的“创新”是它扩展了 HTML和其他元素types,这样就可以在标记中声明很多方面和行为,然后它的JS库包含必要的机器给你模板,路由,数据绑定,表单validation,本地化等(写这使我想知道,也许AngularJS有点膨胀),这使得一个非常完整的Web应用程序开发框架。 它推动你用声明式的风格写你的代码。
随着榆木,你真的进入新的(如果你有一个“典型”的HTML / JS前端开发背景)领土。 这是一个不同的方式来做(并想到)GUI的发展。 您将使用全新的语言编写 – 专门用于以function反应式编程方式创buildGUI,理想情况下,您绝不会直接处理(至less不是直接)任何传统的DOM API。 榆树带有一种“标准库”,为您提供工具来创build和操纵graphics/文本等。
您的Elm语言代码将以完全声明的方式描述您希望GUI随着时间的推移和事件(用户input等)发生的外观和行为。 然后,将它们全部编译为HTML / JS / CSS,以便在浏览器上运行。
榆树也很年轻。 这取决于你和你的需要来决定这是否是一个劣势。
我想对我来说,selectAngularJS只是老样子“嘿,让我们试试这个JS库/框架的东西” – 我们习惯于在JS世界的过程。 您抓取lib文件,将它们添加到您的项目,并开始使用其API。 而榆树 ,你必须开始接近你的工作stream程和问题的解决scheme不同。
AngularJS为您提供了很多结构,与Backbone.js不同,但是在一天结束的时候,如果您想要进行一些高级的GUI和graphics行为,那么使用AngularJS,您可以重新编写大量的pipe道样板材料,你不会写,如果你使用榆木。
另一方面,如果你现在必须开发和发布一个大型的networking应用程序,使用我们迄今在网上使用的通常的GUI小部件,我倾向于说AngularJS更稳定。
话虽如此,我认为Elm是目前前端开发世界中最有趣也最有希望的事情。 而且,如果今天我必须开发和发布一些graphics重量级的东西,我会去Elm,因为可以用很less的几行代码来完成非常复杂的GUI工作。 但是我必须首先进入它的思维模式,并且处理这个非常年轻的事实,并且将它与现有的JS前端代码库集成可能不是一件容易的事,甚至是可能的。
编辑:
截至2015年3月,Elm的性能更强劲,而且它有很好的工具(时间旅行debugging器在脑海中浮现)。
angular度仍然是,更好的是相同的。 我应该注意到,Angular的方法,即使是每当一个模型发生改变的方法(“双向数据绑定”),也会使得它完全不适合诸如基于浏览器的游戏之类的东西,而榆树擅长游戏和高级graphics用户界面的东西,需要performance良好。 此外,Elm现在有一个快速的(使用虚拟DOM差异的方法)HTML库,因为当你需要用HTML说话的时候。
我的骨头与Elm一起挑选的是它的types系统不像Haskell那样具有performance力。 有人可能会认为这是要求奢侈的,反而是失去expression基本function的能力。 尤其是我们,经验丰富的JS程序员,由于缺乏足够的静态types系统,因为这意味着我们在JS中容易expression的多态代码在Elm中变成了一个types错误,由于缺乏例如rank-2types。
幸运的是,榆树所缺less的所有“愿望清单”function都不存在,因为正在进行关于它们及其替代品的讨论 。 所以,他们(或者最好的select)最终会把它变成语言是一个安全的select。
在Elm中,复杂的静态graphics布局和交互性要比在HTML / CSS /任何JavaScript框架中简单得多。 对于Elm来说,意外的复杂性在于types ,但是值得学习它们 – 它们有助于更好地理解,debugging和修改软件,如果来自函数式编程背景,它们应该已经对您很熟悉了。 请注意,您也可以在HTML / JS中embeddedElm ,因此理论上可以逐渐迁移。
Elm比Angular更有见地,特别是在国家pipe理方面 。 如果你发现状态在传统的Angular应用程序中成为一个问题,那么你可能会试图使用Redux风格的方法来看待集中式(单一状态),并且很快就会想到ngrx。
榆树体现了中心不变国家的概念,是Redux的灵感来源 。 Elm使用纯更新(reducer)函数强制执行单个不可变状态。 在我看来,这使得在一个高度反应的Web应用程序中处理状态要比在Angular中使用类OO模式时可能出现的混淆要简单得多。
Elm对于大多数应用程序来说都非常棒,但是当你想要使用外部的JS库(例如google maps)时,它会变得更加复杂一些,因为它的外部函数接口(端口)非常僵化。 材料devise中需要的那种animation对Elm Architecture来说也是一个挑战 – 这并不是说没有animation,但是他们需要更多的接线。