由 Lukas Ruebbelke 所编著的《AngularJS in Action》一书是一本关于Angular 版本1 的实践性书籍。全书通过一个ToDo 列表应用Angello 展现了AngularJS 的架构与组件。在 AngularJS v2 的 Beta 版本刚刚发布的这一时刻,InfoQ 与本书的作者进行了一次访谈,谈及了从本书中可获得的知识,以及 AngularJS 现在与未来的发展方向。
InfoQ:你能否为我们比较一下 Angular 与其他一些竞争框架的优劣,例如 React?
Lukas Ruebbelke:我认为“竞争”这个词用在这里有些不太恰当。React 是一个优秀的渲染框架,它对于我们如何在应用中组织数据流起到了很大的影响。React 所表现出的独到见解让许多框架停下了手头上的工作,并开始反思他们的方式是否正确。可以说,Angular 团队与 React 团队之间的关系非常友好,我们乐于看到他们能够打破固有的思维,为我们带来新的思想。
对于前端框架来说,如今正处于健康的发展道路上。因为我感到我们已经远离了那些有害的空话,不再使用“这个框架比那个框架好”的表达方式,而是意识到这一领域中还存在着大量的成长空间。我们与 Ember CLI 团队之间的互动就是一个良好的例子。
让我用一些具体的术语详细地分析一下你的问题吧。React 主要专注于视图的渲染,并且表现得非常出色。Angular 则提供了更多的特性,内置了 model、controller、directive 以及 animation 等功能的实现。实际上,你完全可以用 Angular 打造应用的架构,而通过某个 directive,让 React 承担起渲染的任务,这种做法并不罕见。
InfoQ:在你看来,我们是否应当在 Angular 1.x 版本的学习和开发上继续投入精力,还是应当等待 v2 的降临?我们知道 v2 对于 v1 的向后兼容性十分混乱,那么在过去几年间开发的项目今后将何去何从?
Lukas:这一点完全取决于你适应变化的能力。我在所有新开发的 Angular 应用中都使用了 EcmaScript 2015 语法,并且将一切功能都分解为 directive,它在 Angular 2 应用中的使用几乎是相同的。此外,我曾经倾向于使用 factory 以及纯粹的 controller,但现在我完全转为使用 service 和 controller as 语法了,这种方式强制我使用 EcmaScript 2015 语法或 TypeScript 类。由于采取了这种正确的方式,对于这一问题的回答首次显得不那么迫切了。它在架构上表现了重叠性,让迁移过程变得平滑许多。从我个人来看,我已经开始喜欢新的风格了。
Angular 1 与 2 之间的问题主要是由发布的消息所引起的。当 Angular 2 初次宣布时,它听上去似乎颠覆了我们所知的一切。人们感到迷失了方向,因为感觉上好像完全无法从一个版本迁移至另一版本。在那之后,Angular 团队已经很好地理清了现在的状况,而且实际上,这种迁移路径是完全合理的。举例来说,在 Angular 1.5 中引入了组件语法,以定义隶属于一个 module 中的组件,这就让我们能够更简便地以 Angular 2 的风格编写 Angular 1.x 的应用了。
InfoQ:当 Angular v2 发布之后,你是否计划开始为本书提供一个修订版本呢?
Lukas:我已经开始着手于编写新版本了,新版本将进一步详细阐述本书的某些部分,同时引入一些新的章节,以描述一些新内容,例如测试。新版本还将涵盖一些架构模式,掌握了这些模式将能够帮助我们迁移至 Angular 2。
我同时也在为本书中所描述的示例应用 Angello 开发一个对应 Angular 2 的版本。等到恰当的时机,我们将找到一种最佳的方式以分享我们从这一过程中所学到的知识。我认为,为一个具有一定复杂度的应用同时创建两个版本是一种优秀的学习体验。
InfoQ:你能否进一步阐述一下 Angular 在性能上的开销,以及通过哪些方式能够在响应时间这方面带来性能上的提升?(注:例如单向或是双向绑定?)
Lukas:当我对 Angular 应用进行性能审查时,我发现主要的性能问题来自于用户体验或是一般性的编程问题。有些时候,人们倾向于无视一些完善的架构性原则,因为 JavaScript 本身是非常松散与易于操作的。当人们问我如何成为更好的 Angular 开发者时,我总是让他们首先去阅读 Robert C. Martin 所编著的《代码整洁之道》。
举例来说,你应当避免那些复杂的逻辑结构,他们或许内含业务逻辑,并以过程化的方式进行解析。如果你在 Angular 的 digest 周期中执行这些逻辑,那问题将变得更混乱。你还应当避免在一个页面中显示 1 万行数据,因为用户根本无法有效地处理这么庞大的信息。将所有这些信息堆积在一起是根本不可行的,而如果你为每一行数据又加入了数据绑定,那么事情肯定要乱套了。
无论在任何应用程序中,当处理性能问题时,第一步都是对用户体验进行优化。接下来就要应用各种经过尝试的、真正的架构级原则,例如通过细粒度的、单一职责的代码单元组合你的应用程序。
如果你需要,那么还可以尝试通过某些诀窍进一步提升应用程序的性能。如果你需要对某个复杂对象的集合进行绑定,我有时会选择将这些对象转换为轻量级的对象,其中仅包含需要显示的部分属性。如果你的视图不需要进行重绘,那么单向的数据绑定也是一种良好的优化方式。而为一系列元素项手动添加分页功能也能够起到优化作用。只要你能够减少在页面上所绑定的元素的数目和复杂度,就能够起到优化作用。
我建议你观看 Scott Moss 在 ngConf 2015 大会上关于性能所做的演讲,他的这次演讲非常成功。
InfoQ:对于用 Angular 开发的复杂应用来说,掌握 promise 有多重要?
Lukas:对于使用 JavaScript 开发的任何复杂应用来说,要充分掌握异步编程,对于 promise 的理解是非常重要的。Promise 目前是一项非常重要的工具,但我相信 Observable 才是将来的发展方向,可以将其视为 promose++。
InfoQ:你是否推荐使用 Angular 实现动画效果?
Lukas:当然了!这也正是我最爱 Angular 的一点。其原因在于,Angular 并没有采取直接处理动画的方式,而是暴露了一系列事件的钩子,从而可以任意选择你希望的动画应用方式。
对于一些简单的效果,我可以通过使用 CSS 在 3 分钟之内搞定,它将改变整个应用的外面。如果我需要处理一些非常复杂的效果,那么我就可以选择利用这些事件的钩子,在其中编写大量的 JavaScript 代码。我是 Greensock 的忠实粉丝,通过这个库,你可以做的事几乎是无限的。在这方面,Angular 能够配合任何库而表现得非常出色。
InfoQ:在现代的 web 应用中使用 Angular 有哪些优点与缺点?
Lukas:最近三年以来,Angular 是我的唯一选择。关于它的优点,我会选择它所带来的生产力。你可以选择利用 Angular 中预定义的功能,围绕着它实现你的特性,而又不会受到这些功能的限制。Angular 能够充分发挥设计者 - 开发者的工作流,它对 HTML 进行了扩展,甚至为你提供了一系列工具,可以将你的 HTML 转变为一种自定义的领域特定语言(DSL)。由于依赖注入的存在,Angular 鼓励你进行测试。而整个生态系统与社区的活跃也是有目共暏的。
至于缺点,我只能想到一些边缘情况,你可能需要一些非常独特的功能,例如开发一个游戏或是 3D 渲染这种有些疯狂的举动。在这种情况下,Angular 或许不是一种很好的选择,它无法解决所有问题。
InfoQ:在过去几年中,移动优先策略以及移动开发正在不断成长。能否方便地从 Angular 迁移至基于它开发的移动框架(例如 Ionic、Mobile Angular UI 等等)?你对于移动开发与 Angular 的应用有什么建议吗?
Lukas:通过 Ionic 进行移动开发不需要你投入多少精力。我个人与 Ionic 团队有很好的伙伴关系,有一次我曾经问 Adam Bradley,怎样能成为一人 Ionic 的专家。他告诉我,要成为一个 Ionic 专家,我只需要成为一个 Angular 专家就够了。这一点已经由我的经验无数次证实了。
Angular Material 是另一个在移动开发上表现优秀的项目,它为你带来了 Angular 的各种能力以及 Material Design 的美学观。无论是在何种设备或屏幕分辨率上,每个组件都能够完美地呈现。
从这个角度来说,我有一种被宠坏的感觉。桌面开发与移动开发之间的界限已经越来越模糊了,因而 Ionic 与 Angular 之间能够良好地结合在一起。
InfoQ:你今后打算怎样参与 Angular 的项目,还有什么写作计划吗?
Lukas:我十分喜爱 Angular,或许我已经是这个框架最忠实的啦啦队长了。这个团队汇聚了众多我所认识的优秀人才,而他们又是如此亲切与宽容,我很荣幸与能这一项目联系在一起。
我的脑海中已经浮现了大量有关 Angular 的内容与项目,一定会在某一天以某种形式发表这些内容的。
关于本书作者
Lukas Ruebbelke是一位全职 web 开发者,也是 AngularJS 社区中一位非常活跃的贡献者。
查看英文原文: AngularJS in Action - An Interview With Lukas Ruebbelke
评论