51

我正在考虑在浏览器中进行一些反应式编程,并将 angular.js ( http://angularjs.org/ ) 与 Elm ( http://elm-lang.org/ ) 进行比较。

每种方法的相对好处/问题是什么?

4

3 回答 3

75

我认为它们是不同的野兽,IMO,尽管它们确实共享尽可能声明性的目标,以及“嘿,让我们按照他们应该做的方式做事”的态度。

现在,使用AngularJS ,您仍然处于“熟悉”的领域。意思是,你在这里写一些标记,在那里写一些 JS,然后你提供它。与往常一样的工作流程。据我所知,AngularJS 的“创新”在于它用额外的元素类型扩展了 HTML,这样你就可以在标记中声明应用程序的许多方面和行为,然后它的 JS 库包含必要的为您提供模板、路由、数据绑定、表单验证、本地化等的机器(...编写这让我想知道 AngularJS 是否会有点臃肿。),这构成了一个非常完整的 Web 应用程序开发框架。它促使你以声明式的方式编写代码。

使用Elm,你真的进入了新的领域(如果你有一个“典型的”HTML/JS 前端开发背景)。这是一种不同的方式来进行(和思考)GUI 开发。您将使用一种全新的语言进行编写——专门用于以函数式反应式编程方式创建 GUI——理想情况下,您永远不会(至少不直接)处理任何传统的 DOM API。Elm 带有一种“标准库”,可为您提供随时间创建和操作图形/文本/等的工具。

您的 Elm 语言代码将以完全声明性的方式描述您希望 GUI 随着时间的推移和事件(用户输入等)发生时的外观和行为。然后,它将全部编译为 HTML/JS/CSS,以便在浏览器上运行。

榆树也很年轻。这取决于你和你的需要来决定这是否是一个劣势。

我猜对我来说,选择 AngularJS 就像我们在 JS 世界中习惯的那样“嘿,让我们试试这个 JS lib/framework 的东西”。您获取 lib 文件,将它们添加到您的项目中,然后开始使用它的 API。而使用Elm,您必须开始以不同的方式处理您的工作流程和问题的解决方案。

AngularJS 为你提供了很多结构,它与 Backbone.js 不同,但归根结底,如果你想做一些高级的 GUI 和图形行为,使用 AngularJS 你又要写很多东西了如果您使用 Elm,则无需编写管道样板文件。

另一方面,如果你现在必须开发和发布一个大型网络应用程序使用我们迄今为止在网络上使用的常用 GUI 小部件,我倾向于选择 AngularJS,因为它更稳定。

话虽如此,我认为 Elm 是目前前端开发世界中发生的最有趣和最有前途的事情。而且,如果我今天必须开发和发布一些图形密集型的东西,我选择 Elm,因为用它只需几行代码就可以完成非常复杂的 GUI 内容。但是我必须首先进入它的思维模式,并处理它非常年轻的事实,并且将它与现有的 JS 前端代码库集成可能并不容易,甚至不可能实现。

编辑:

截至 2015 年 3 月,Elm 更加健壮,并且有很好的工具(我想到了时间旅行调试器)。

Angular 还是一样的。我应该注意到 Angular 的方法,它的每次模型更改时都会发生一吨的事情(“双向数据绑定”)使其完全不适合诸如基于浏览器的游戏之类的东西,而Elm 擅长需要表现良好的游戏和高级 GUI 东西。此外,Elm 现在有一个快速(使用虚拟 dom diff'ing 方法)HTML 库,当您需要用 HTML 说话时。

我对 Elm 的看法是它的类型系统不像 Haskell 那样具有表现力。有些人可能认为这是在要求奢侈,但恰恰相反,这是在失去表达基本功能的能力。尤其是我们这些经验丰富的 JS 程序员,受苦于不够表达的静态类型系统,因为这意味着我们习惯于在 JS 中轻松表达的多态代码由于缺少例如 rank-2 而在 Elm 中成为类型错误类型。

幸运的是,Elm 中缺少的所有“愿望清单”功能都不存在,因为正在讨论它们及其替代方案。所以可以肯定的是,他们(或最好的替代品)最终会成为该语言。

于 2013-03-20T17:54:24.357 回答
16

Elm 中复杂的静态图形布局和交互性都比 HTML/CSS/任何 JavaScript 框架简单得多。使用 Elm,意外的复杂性在于类型,但值得学习它们- 它们有助于更好地理解、调试和修改软件,如果你有函数式编程背景,你应该已经熟悉它们。请注意,您也可以将 Elm 嵌入 HTML/JS中,因此理论上您可以逐步迁移。

于 2013-07-24T15:00:05.220 回答
5

Elm 比 Angular 更加固执己见,尤其是在状态管理方面。如果您发现状态成为传统 Angular 应用程序中的一个问题,那么您可能会倾向于使用 Redux 风格的方法来寻找集中式(单体状态),并且很快就会想到 ngrx。

Elm 体现了中心不可变状态的概念,并且是Redux 的灵感来源。Elm 使用纯更新(reducer)函数强制执行单个不可变状态。在我看来,这使得在高度反应性的 Web 应用程序中处理状态比在 Angular 中使用类似 OO 的模式可能产生的混乱要简单得多。

Elm 非常适合大多数应用程序,但是当您想要使用外部 JS 库(例如 google maps)时,它可能会变得更加复杂,因为它的外部函数接口(端口)非常严格。Material Design 中所需的那种动画也被证明对 Elm 架构具有挑战性——这并不是说没有动画,而是它们需要比你想做的更多的布线。

于 2017-01-28T17:14:51.447 回答