1 介绍我们准备在这篇文章中比较三款流行于Web的“模型-视图-*”框架:AngularJS、Backbone和Ember。为你的项目选择正确的框 架能够对你及时交付项目的能力和在以后维护你自己代码的能力产生巨大影响。你也许想基于一款可靠的、稳定的和成熟的框架来构建项目,但又不想为此受到约 束。Web发展迅速——新技术产生,旧的那套方法很快跟不上潮流。如此形势之下,我们准备仔细深入的比较这三个框架。 2 框架概览今天我们提到的所有框架有许多共同点:都是开源的,遵从 MIT 协议,并且都尝试通过 MV* 模式来解决开发单页面应用的问题。它们都有类似的概念:视图,事件,数据模型和路由。我们先简单回顾一下有关的历史和背景知识,然后再展开深入比较这三款框架。 AngularJS 诞生于 2009 年,当时作为一个大型商业产品的一部分叫做 GetAngular。不久之后,Misko Hevery,GetAngular 项目创建者之一,花了仅仅三周时间,用 GetAngular 重写了一个曾经耗时 6 个月才完成的,有 17K 行代码的页面应用,并将代码削减到 1,000 行左右,于是成功的说服了谷歌开始赞助该项目,并将其开源,也就是我们今天看到 AngularJS 。Angular 的特点是拥有双向数据绑定,依赖注入,易于测试的编码风格,以及通过使用自定义指令可以简单的扩展 HTML。 Backbone.js 是一个轻量级的 MVC 框架。诞生于 2010 年,它作为那种笨重全功能的 MVC 框架,比如说 ExtJS, 的一个代替品,迅速流行开来。 很多服务都使用了它,比如 Pinterest, Flixster, AirBNB 等等。 Ember 则要回溯到 2007 年,最开始是以 SproutCore MVC 框架展现在世人面前,由 SproutIt 开发,后来是 Apple,再后来到 2011 的时候,jQuery 和 Ruby on Rails 的核心贡献者 Yehuda Katz 参与了进来。有名的 Ember 用户包括了 Yahoo!, Groupon, 和 ZenDesk。 3 社区社区是在选择一个框架的时候,要考虑的最重要因素之一。大社区意味着更多的答案,更多的第三方模块,更多的 YouTube 教程…你,明白了么。我做了个统计,截止 2014年8月16日,Angular 是绝对的王者,作为 GitHub 上第六大星级项目,在 StackOverflow 上的提问比 Ember 和 Backbone 加起来还多,你自己看:
所有这些指标,显示的仅仅是每个框架的当前状态。看看哪个框架增长最快也是很有趣的,你有福了,通过谷人希的趋势跟踪,你可以得到以下答案: http://www.google.com/trends/explore?hl=en-US#q=ember.js,+angularjs,+backbone.js&cmpt=q
4 框架大小页面的加载时间是你网站成功的关键。当涉及浏览速度的时候,用户没太多耐性 — 所以很多情况下你要尽可能让你的应用跑得越快越好。使用框架,有两个因素会对应用的加载时间产生影响: 框架的大小和它启动的时间。 Javascript 资源通常都会被经过精简和压缩,所以我们来比较一下压缩版。但是只看框架的大小肯定不够的。Backbone.js,尽管是最小的 (只有 6.5kb),但是必须 Underscore.js (5kb) 和 jQuery (32kb) 或者 Zepto (9.1kb),而且你还有可能还有一些第三方插件要加进来。
5 模板Angular 和 Ember 都有模板引擎。而另一方面 Backbone,把这个选择权留给了你。感受模板引擎的异同最好的办法就是上点代码,好的,我们开始。我们将演示把一个列表转换成 HTML 列表的例子。 5.1 AngularJSAngular 的模板引擎仅仅是在 HTML 上使用绑定表达式。而绑定表达式又仅仅是两层大括号而已:
5.2 Backbone.jsBackbone 可以和许多第三方模板引擎集成,默认的选择是 Underscore 模板。 因为 Underscore 是 Backbone 的依赖项,你已经把它加载到页面中了,你无须添加任何额外的依赖关系就可以使用它的模板引擎。不爽的是,Underscore 的模板引擎非常初级,你通常不得不把 javascript 混进去,比如说:
5.3 Ember.jsEmber 目前用的是 Handlebars 模板引擎,热门的 Mustache 模板引擎的扩展。一个新的 Handlebars 变种,叫做 HTMLBars ,目前已经可以使用了。Handlebars 不关心 DOM – 它所做的仅仅是做一个简单的字符串变换。而 HTMLBars 则可以处理 DOM,所有的变量转换都有上下文感知。由于 HTMLBars 还没有流行,我们还是来看看用 Handlebars 方式打印列表方式:
|