摘要:透过对Github,StackOverflow,YouTube等社区进行数据收集后可知,AngularJS在各大主流社区中都是最受欢迎的,Backbone.js与Ember.js则不相伯仲。本文将对当前三款流行的Web开发框架作个简单比较。

是否选择了合适的框架进行Web开发对项目是有重大影响的。我们都希望找到一个稳健的易维护的框架结构。接下来,我们一起来对当前三款流行Web开发框架作个简单比较认识。

初步认识

AngularJS诞生于2009年,是商业产品GetAngular的一部分。后来,GetAngular创造者之一的MisKoHevry对其进行精简,并随后获得了Google的大力支持,进而发展成今天的样子。Angular最独特最有创造性的特性莫过于是双向(two-way)数据绑定以及HTML扩展能力。

问世于2010年的Backone.js是一个轻量级的MVC框架,崇尚精简的团队对其青睐有加。Pinterest,Flixster,AirBNB等都是使用该框架进行开发的。

Ember的首个足迹印于2007年。刚开始时是作为SproutCore的MVC框架,之后被Sproutlt和Apple接手。Ember的重量级用户包括Yahoo,Groupon以及ZenDesk。

此外,是否具备一个完善的社区支援网络也是重要的考量因素。透过对Github,StackOverflow,YouTube等社区进行数据收集后可知,AngularJS在各大主流社区中都是最受欢迎的,Backbone.js与Ember.js则不相伯仲。

框架大小

页面的加载速度是网站受欢迎与否的重要因素。用户现在变得越来越缺乏耐心了,特别是在同类型网站之间进行选择时,哪个加载得更快或许就会先入为主了。因此,我们必须充分考虑这个需求,尽可能地为我们的页面进行瘦身提速。这里有两个考量因素:框架的大小和引导加载过程的快慢。

下表列出了这三个框架各自的净大小以及结合依赖物之后的大小(已压缩):

模板

Angular和Ember已包含各自的模板引擎,Backbone则需要用户自行选择。以下将结合HTML代码实例进行对比分析。

1.AngularJS

Angular的模板引擎是使用表达式绑定的HTML格式,绑定格式是使用两对大括号:

2.Backbone.js

Backbone可与很多其它第三方模板引擎进行整合,默认的选择是Underscore。如果你已经采用了Underscore,属于Backbone依赖之一的Undersocre无须额外的操作,我们便可使用它的模板引擎。美中不足的是该引擎功能较简单,我们通常需要加入其它的javascript代码来实现其它功能,例如下面的例子:

3.Ember.js

Ember目前采用的模板引擎是属于Mustache模板引擎扩展的Handlebars。目前出现的一个新Handlebars变种名为HTMLBars。相对于Handlebars,HTMLBars增添了对DOM的支援,不过HTMLBars暂还没有正式推出。以下例子是基于Handlebars的:

AngularJS的强项

双向数据绑定节省了大量公式化的代码,先看看下面的jQuery代码:

而如果使用Angular,我们可以省却这些代码,而只需在HTML模板进行绑定声明:

Angular不仅拥有最大的在线社区支持,而且Google一直在推广它。很多创新的工具不断涌现,极大地提高了工作效率,例如:Protractor,Batarang,Zone.js等。此外,Angular还与社区进行广泛合作,不断进行改进。有关Angular 2.0的设计文档,可以点击这里进行了解,任何人都可以直接在上面发表意见。

Angular能够帮助我们有条不紊地把程序生成区块进行分类:控制器,指令,装配器,筛选器,服务和视图(模板)等。这些都是以模块化方式进行组织的,互相形成依赖。不同区块有不同的角色,视图负责UI,控制器负责UI身后的逻辑管理,指令负责组件复用以及HTML扩展等。

自动化的脏数据检查(Dirty Checking)机制能够使我们进行任意的对象属性修改,angular会自动识别出这些变更,然后通知所有与该属性有关的观察者。

Angular还提供了很多即用的功能强大的基本内建服务,例如$http和$timeout。

AngularJS的弱项

嵌入包含和原型继承的概念会让不少开发者感到迷惑,我们需要花一定时间才能领悟其中的含义。在视图层便可广泛使用的Angular表达式,不可谓不强大,甚至是过于强大了。开发者可以在视图模板中使用复杂的逻辑甚至是进行操作委派和计算,这不啻增加了测试的难度。例如下面的代码:

  1. <button ng-click="(oldPassword && checkComplexity(newPassword) && oldPassword != newPassword) ? (changePassword(oldPassword, newPassword) && (oldPassword=(newPassword=''))) : (errorMessage='Please input a new password matching the following requirements: ' + passwordRequirements)">Click me</button>

Backbone.js的强项

Backbone是一款轻量级的产品,容易上手,新概念不多,并且有丰富的文档资源与代码示例资源。基于Backbone的第三方框架有Aura,BackboneUI,Chaplin,Geppetto,Marionette等。

Backbone.js的弱项

Backbone暂时还没提供程序架构方面的支援,取而代之的是提供了一些基本的工具来让我们自己进行架构建设,例如内存管理等都是需要亲力亲为的。视图生命周期管理方面的欠缺,更使得程序容易在路径/状态发生变更时出现内存泄漏问题,除非我们能把所有应该清除干净的对象处理好。

很多没能从Backbone中获得的功能都是由第三插件来提供的。这样一来,我们有可能需要花时间进行一番测试摸索才能确定哪个插件才是适合自己的,从而增加了额外的开发用时。

Backbone没有提供双向数据绑定,我们必须自己手写代码来进行相关处理。Backbone中的视图是直接操作DOM的,这增加了单元测试的难度,对程序稳健性和复用性也有一定影响。

Ember.js的强项

Ember拥有不俗的配置管理能力,可以省却不少的人工代码。例如Ember.js会通过路由器的名字,判断出相应的路由和控制器的名字。Ember中有一个卓越的路由层、数据层,名字是ember data。它封装了一个完备的数据模块,与Ruby-On-Rails或其它RESTful JSON API很好地整合在一起。

性能指标是Ember.js的设计重点,例如事件处理循环和程序预编译等方面,Ember都做了不少努力。

Ember.js的弱项

Ember API 经历了一段时间才最终形成现在比较稳定的版本。因此,初初接触Ember的开发者可能会对一些老旧的文档和例子感动迷惑,具体可以看看它的更新日志,请点击这里

Handlebars的使用,使得DOM中充满了<script>标记,有时很难分辨出哪些代码是自己的,对CSS样式和其它框架的整合也造成了一定影响。

写在最后

Angular在HTML扩展方面有很多独到的做法,有强大的支援资源。Backbone是小巧的,入门门槛相对较低的。基于MVC结构的Ember,对有面向对象编程基础的开发者来说非常亲切,自身也有强大的配置管理能力。三者各有特色各有长短,我们不妨好好对比学习,找到适合自己的那杯茶。

英文出自:Airpair.com

http://www.csdn.net/article/2014-08-27/2821409-javascript-framework-comparison

【JavaScript】前端开发框架三剑客—AngularJS VS. Backone.js VS.Ember.js的更多相关文章

  1. MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录

    注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...

  2. Angular.js vs Ember.js

    Angular.js 拥抱 HTML/CSS Misko Hevery(Angular.js的开发者之一)回答了这一问题,他的主要观点如下: 在HTML中加入太多逻辑不是好做法.Angular.js只 ...

  3. 【转】Angular.js VS. Ember.js:谁将成为Web开发的新宠?

    本文源自于Quora网站的一个问题,作者称最近一直在为一个新的Rails项目寻找一个JavaScript框架,通过筛选,最终纠结于 Angular.js和 Ember.js. 这个问题获得了大量的关注 ...

  4. Angular.js VS. Ember.js:谁将成为Web开发的新宠?

    这篇博文陈述的非常好,比较全面的剖析了Angular.js与Ember.js,下面的链接,供学习与参考: http://www.csdn.net/article/2013-09-09/2816880- ...

  5. AngularJS 、Backbone.js 和 Ember.js 的比较

    1 介绍 我们准备在这篇文章中比较三款流行于Web的“模型-视图-*”框架:AngularJS.Backbone和Ember.为你的项目选择正确的框架能够对你及时交付项目的能力和在以后维护你自己代码的 ...

  6. 比較Backbone.js, Angular.js, Ember.js, Knockout.js 心得

    還記得第一次寫網站的時候,我無意間寫成了 SPA(single page application),當時還沒有SPA這個詞,後來因為廣告主需要不同 url location 頁面的廣告展示,只好把部分 ...

  7. 点燃圣火! Ember.js 的初学者指南

    现在,到处都可以看到复杂的 JavaScript 应用程序. 由于这些应用程序变得越来越复杂,一长串的 jQuery 回调语句,或者通过应用程序在各个点执行不同的函数调用,这些都变得无法再让人接受. ...

  8. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

  9. 腾讯Web前端开发框架JX(Javascript eXtension tools)

    转自:Web前端开发-Web前端工程师 » 腾讯Web前端开发框架JX(Javascript eXtension tools) JX – Javascript eXtension tools 一个类似 ...

随机推荐

  1. python的元组和列表使用之一

    Python的列表和元组 1.       概述 列表是用方括号[]包围的数据集合,不同的成员之间用逗号进行分隔,列表可以通过序号来进行访问其中的成员,可以对列表进行排序.添加.删除操作,改变列表中某 ...

  2. Chapter7:类

    关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象.当我们调用一个成员函数时,用请求该函数的对象初始化this. total.isbn(); //等价于编译器重写为 Sa ...

  3. jQuery文档加载完毕的几种写法

    js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...

  4. 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

    0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对 ...

  5. 1、Hadoop架构

    1.Hadoop 是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多小的工作单元放到任何集群节点上执行. 作业(job):一个 ...

  6. openstack neutron网络主机节点网口配置 liberty版本之前的

  7. C#修改下拉框选项的高度

    重写ListBox.DrawItem事件处理,别忘记将ListBox.DrawMode 设置为OwnerDrawVariable,ListBox.ItemHeight值改大一点,字体也适当放大一号. ...

  8. 60分钟内从零起步驾驭Hive实战学习笔记

    本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...

  9. 30大最有影响力的Web设计与开发英文博客

    1stwebdesigner的创始人Dainis Graveris挑选出30个高质量和具有影响力的Web设计与前端技术博客,其中很多我们都耳熟能详.但这么完整的列表,还是值得收藏的.另外,你大概不会了 ...

  10. 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...