我正在考虑在浏览器中进行一些反应式编程,并将 angular.js ( http://angularjs.org/ ) 与 Elm ( http://elm-lang.org/ ) 进行比较。
每种方法的相对好处/问题是什么?
我正在考虑在浏览器中进行一些反应式编程,并将 angular.js ( http://angularjs.org/ ) 与 Elm ( http://elm-lang.org/ ) 进行比较。
每种方法的相对好处/问题是什么?
我认为它们是不同的野兽,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 中缺少的所有“愿望清单”功能都不存在,因为正在讨论它们及其替代方案。所以可以肯定的是,他们(或最好的替代品)最终会成为该语言。
Elm 中复杂的静态图形布局和交互性都比 HTML/CSS/任何 JavaScript 框架简单得多。使用 Elm,意外的复杂性在于类型,但值得学习它们- 它们有助于更好地理解、调试和修改软件,如果你有函数式编程背景,你应该已经熟悉它们。请注意,您也可以将 Elm 嵌入 HTML/JS中,因此理论上您可以逐步迁移。
Elm 比 Angular 更加固执己见,尤其是在状态管理方面。如果您发现状态成为传统 Angular 应用程序中的一个问题,那么您可能会倾向于使用 Redux 风格的方法来寻找集中式(单体状态),并且很快就会想到 ngrx。
Elm 体现了中心不可变状态的概念,并且是Redux 的灵感来源。Elm 使用纯更新(reducer)函数强制执行单个不可变状态。在我看来,这使得在高度反应性的 Web 应用程序中处理状态比在 Angular 中使用类似 OO 的模式可能产生的混乱要简单得多。
Elm 非常适合大多数应用程序,但是当您想要使用外部 JS 库(例如 google maps)时,它可能会变得更加复杂,因为它的外部函数接口(端口)非常严格。Material Design 中所需的那种动画也被证明对 Elm 架构具有挑战性——这并不是说没有动画,而是它们需要比你想做的更多的布线。