谈谈AngularJS给我的感受

用AngularJS这个框架也有个把月了, 我作为一个自称万金油的程序员, 来谈谈自己对于AngularJS的看法. 请注意, 我不是JSer中的大牛, 没有用过很多同类框架, 所以内容写得比较粗略, 不足以作为严格的参考.

接触AngularJS主要是因为子游, 我和他合作的阅读器项目中用到了AngularJS, 该框架也是他介绍给我的. 在一般的需要写Web App的场合, 我肯定会选择用Backbone, 但鉴于AngularJS是Google进行支持的, 于是我就尝试了一下. 后来感觉还可以, 就一直用下去了.

AngularJS在设计上有一股很浓的Java味道, 选择这个框架, 就必须得服从于AngularJS的约束, 不然代码不能正常运作. 像是最基本的事件循环, AngularJS都自己进行了一个实现, 不得不让人认为这个框架存在着性能问题. 并且在这种强力的约束下, 大多数的逻辑都必须要先在HTML中声明才能使用, HTML代码几乎不可避免的变得乱糟糟. 我开始有一种感觉, 就是这个框架其实是给不会JavaScript和HTML的后端程序员使用的.

AngularJS的声明式设计还不算是棘手的问题, AngularJS用户面临的最棘手的问题在于, 它的官方API文档很不全面, 文档中给出的例子不是相当晦涩就是满篇废话(甚至一些连文档都没有), 这让很多初学AngularJS的前端感到头疼(也包括我). 虽然听闻国内已经有一些企业使用AngularJS, 但实际上你能找到的中文资料是很少的, 并且其中大多数都是API文档或者教程的中文翻译. 在入门之后唯一需要做的事, 就是把AngularJS的源代码读完, 不然你无法理解这个框架的大多数功能, 而读源码又需要一定程度的JavaScript基础, 这使得该框架的用户定位很不明确.

不过声明式设计也是有好处的, 开发者不用在乎大多数浏览器细节就能编写代码, 使得开发者能更加专注于真正要用脑力去做的事情, 写出来的Script结构比较清晰, 但是由于声明式, 一些可以利用JavaScript特性来优雅实现的功能, 在AngularJS里会有一种别扭的感觉. 而且你很快就会发现, AngularJS没有自带你想要的一些功能, 然后你不得不去学习编写定义冗长无比的directive, 以及被严重限制作用域的service和factory. 到最后你的代码就像是一个个机械零件组装而成的大型废铁, 虽然实现了松耦合, 但牵一发却会导致大规模重写.

最近我把自带的ngResource这个蛋疼无比的REST module换成了第三方的Restangular, 可我发现噩梦并没有结束, 因为ngResource的事先声明式设计, 我必须把用于声明ngResource的代码全部修改成Restangular的不需要事先声明的形式. 既然已经扯到第三方的module, 就不得不说AngularJS的第三方module少得可怜, 除了angular-ui和bootstrap, 见不到什么可以称为健壮的module.

说了这么多坏处, 也是时候说说它的优点了. AngularJS有个很不错的地方, 就是它提供一整套开发测试的工具, 官方建议使用yeoman, 这也确实是一个不错的工具, 它包含grunt和bower, 可以方便的进行生产和测试, 当然问题也是有的, 这玩意对于新手而言会有些吃不消, 并且这个环境下使用Sass和CoffeeScript生产代码, 对于大多数只会JavaScript和CSS的国内普通前端程序员来说, 未免有些不好适应. 并且个人认为AngularJS确实比较适合使用JavaScript编写, 本身写出来的代码回调可以很少, 减少了嵌套层数, 这会使得CoffeeScript这个编译器丧失代码清晰的优势.

AngularJS还给我带来了一种特别的乐趣, 每当我遇上问题时, 查Google至少有50%的几率得不出解决方案, 于是我被逼着去读github上的源代码. 还有个特别坑爹的事情, AngularJS的Stable版本比Unstable版本落后太多, 而Stable的功能又少得可怜, 于是开发者们就不得不去使用Unstable版本, 还要随时提防着潜在的bug和性能问题.

AngularJS自带的数据双向绑定特性是最大的亮点, 我相信大多数开发人员都是因为这个特性才会学习AngularJS的, 而且在数据不大的时候并不会产生明显的性能问题, 强大的内置功能和近乎为零的外部库依赖也使得它在同类MVVC框架中脱颖而出, 这也许是我至今没有抛弃AngularJS更换其他框架的理由吧.

AngularJS——痛并快乐着.