全名 《AngularJS in Action》—— 与作者Lukas Ruebbelke的一次访谈
由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