Ember.js或者Backbone.js用于Restful后端?

98

我已经知道Ember.js相对于Backbone.js来说是一种更为复杂的方法。我阅读了很多有关这两者的文章。

我在思考,哪个框架更容易作为Rails REST后端的前端。对于Backbone.js,我看到不同的方法来调用REST后端。而对于Ember.js,似乎我需要包括一些更多的库,比如"data"或"resources"。为什么会有这两个库呢?

那么哪个是更好的选择呢?也没有太多连接前端和后端的示例。有一个好的工作示例可以用于后端rest调用:

URI: ../restapi/topics GET auth credentials: admin/secrect format: json


3
真是喜欢这种“不具建设性”的问题,尽管那个有帮助、深思熟虑的回答仍然得到了240多个赞。 - Andrew
3个回答

256
与普遍观点不同,Ember.js并不是一种比Backbone.js更重的方法。它们是针对完全不同最终产品的不同类型工具。Ember适用于用户需要长时间打开应用程序、或者与应用程序的视图或底层数据的交互会触发视图层次结构深度变化的应用程序。Ember比Backbone大,但由于使用Expires, Cache-Control这些技术,在第一次加载后这只有很小的影响。在经过两天的日常使用后,那额外的30k将被数据传输所掩盖,如果你的内容涉及图片,则更快。

Backbone适用于状态数量较少且视图层次结构相对较平的应用程序,用户倾向于访问应用程序不频繁或持续时间较短。Backbone的代码保持简短且简洁,因为它假定支持DOM的数据将被丢弃并进行内存回收:https://github.com/documentcloud/backbone/issues/231#issuecomment-4452400 Backbone更小的体积也使其更适合短暂的交互。

人们在这两个框架中编写的应用程序反映了这些用途:Ember.js应用程序包括Square的Web仪表板Zendesk(至少是代理/支票接口)和Groupon的调度程序:这些都是用户可能要整天使用的应用程序。

Backbone应用程序更专注于简短或偶尔的交互,通常只是较大静态页面的小部分:airbnbKhan AcademyFoursquare的地图和列表

你可以使用Backbone来制作Ember目标的应用程序(例如Rdio),方式是:a) ...

将你所负责的应用程序代码量增加以避免出现诸如内存泄漏或僵尸事件之类的问题(我个人不建议采用这种方法),或者通过添加第三方库,例如backbone.marionetteCoccyx等库——有许多这样的库都试图提供类似的重叠功能,您可能最终会组装自己的自定义框架,该框架比使用Ember需要更多的粘合代码并且更为庞大。

总的来说,“使用哪个”这个问题有两个答案。

首先,“在我的职业生涯中,通常应该使用哪一个”:都要学习,就像您将来想要做的任何工具一样。您永远不会问“Backbone还是D3?”;“Backbone或Ember”同样是一个愚蠢的问题。

其次,“在我的下一个项目中,我应该使用哪一个”:这取决于项目。两者都可以轻松与Rails服务器进行通信。如果您的下一个项目涉及由服务器生成的页面与JavaScript提供的所谓的“丰富区域”混合使用,请使用Backbone。如果您的下一个项目将所有交互推入浏览器环境中,请使用Ember。


4
Trek,回答得很好。我只想在这里评论一下,“Expires”和“Cache-Control”并没有像人们想象的那样有太大用处,特别是对于经常忽略它们的移动设备而言。我记得iOS的一个版本完全忽略了它们(但仍然遵循HTML5缓存清单)。此外,这些头部值在用户第一次访问时并不会有帮助,而这通常是决定用户是否留下并使用您的应用程序的最关键因素。说了这么多,对我来说30kb的文件差异似乎不是那么重要。这是原始的还是压缩和Gzip后的30k差异? - Mauvis Ledford
11
如果你去查看Ember旨在帮助创建的实际应用程序,你会发现那些恼人的千字节是无法逃避的。它们可能来自Ember,使得你的应用程序代码更小,或者来自backbone插件,或者来自你自己编写的代码。Wunderlist,本来应该是“简单”的,但传输大小约为300kb。我想它使用Ember可能会类似大小,也许会更小-由于从未编写过与Wunderlist完全相同的应用程序,我不能百分之百地确定。 - Trek Glowacki
1
我同意,我最受欢迎的backbone应用程序压缩和缩小后达到178kb+模板。只是指出我们不应该依赖浏览器缓存。 - Mauvis Ledford
2
Trek,你的分析非常准确,对于需要处理复杂状态管理以及长期使用模式的应用程序使用Backbone是一个很好的选择。我曾经将一个遗留的应用程序转换为Backbone,就像你所列举的一样。我们需要集成Marionette,并编写大量的粘合代码来处理预/后路由过滤、内存泄漏缓解和更好的事件管理等问题。 - Mike Clymer
9
“你永远不会问 Backbone 或 D3” - 当然,但我可以很容易地想象一个项目,在这个项目中我会将 D3 与 Backbone 结合使用。相比之下,很难想象一个项目在同一页上同时使用 Backbone 和 Ember。因此,我认为“Backbone 或 Ember”的问题非常公平。这是另一篇我发现相当有信息量的帖子,因为它更深入地比较了这两个框架:http://net.tutsplus.com/tutorials/javascript-ajax/game-on-backbone-and-ember/ - Shiprack
Backbone + Marionette 是与 Ember 同样好的方法。请查看 http://www.backbonerails.com/。 - user1082754

26
简而言之,对于RESTful后端,目前应该使用Backbone。
更复杂的答案是:这实际上取决于你做什么。正如其他人所说,Ember是为不同的事情而设计的,并且将吸引不同的人群。我的简短答案基于您包含RESTful要求。
目前,Ember-Data(似乎是Ember中默认的持久性机制)远未准备就绪。这意味着它有相当多的错误,并且关键的是,不支持嵌套的URI(例如/posts/2/comments/4556)。如果REST是您的要求,那么您需要在暂时选择Ember时解决此问题(即您将不得不将其hack进去、等待、从头开始实现类似Ember-Data的东西,或者使用不太符合RESTful的URI)。Ember-Data并非Ember的严格部分,因此这完全可以做到。
两者之间的主要区别除了大小之外,基本上是:
Ember尽可能多地为您完成工作,以便您不必编写过多的代码。它非常分层,如果您的应用程序也非常分层,则可能是一个很好的选择。由于它为您做了很多事情,因此很难弄清楚错误来自何处以及为什么会发生意外的行为(有很多“魔法”)。但是,如果您的应用程序自然适合于Ember所期望的应用程序类型,则可能不会成为问题。
Backbone尽可能少地为您完成工作,以便您可以理解正在发生的事情并构建适合您的应用程序的架构(而不是构建适合您使用的框架的架构的应用程序)。它更容易入手,但是,除非您小心,否则可能很快就会陷入混乱。它不执行计算属性、自动解绑定事件等诸如此类的操作,并将其留给您,因此您需要自己实现许多内容(或至少选择为您执行该操作的库),尽管这正是它的全部意义。

更新: 最近看起来Ember现在支持嵌套URI,所以问题就是你喜欢多少魔法以及Ember在架构上是否适合你的应用程序。


5
关键是,不支持嵌套URI (/posts/2/comments/4556 例如)。这是几周前的提交记录: https://github.com/emberjs/data/commit/d870297de41e6f6eee2f26880e1657c622ff5bc1。虽然跟上一个快速移动的预发布框架可能很难,但我们在发表权威意见和提供建议时应始终力求准确! - Trek Glowacki
好的,谢谢。我更新了我的回答。我猜那是在上周或者之前的大型关系合并中引入的。我确实看了一下列出的更改,但是没有找到关于URL的提及,而且我跟踪的问题在我检查时仍然是开放的。感谢您指出提交 - 如果不知道它的存在,很难找到它。 - bengillies
这确实是最近关系改进分支的合并。我们本周一直在慢慢跟进旧问题并解决它们。 - Trek Glowacki

3
我认为你的问题很快就会被屏蔽 :) 这两个框架之间存在一些争议。
基本上,Backbone 不做很多事情,这就是我喜欢它的原因:你将不得不编写很多代码,但你会在正确的位置编码。Ember 做了很多事情,所以你最好观察它在做什么。
服务器讨论是 Backbone 所做的少数事情之一,并且它在这方面做得非常出色。因此,如果你并不完全满意,我建议你先从 Backbone 开始,然后再尝试 Ember。
你也可以收听 this podcast,在那里 Backbone 的创建者 Jeremy Ashkenas 和 Ember 的成员 Yehuda Katz 进行了愉快的 讨论

2
谢谢。您能谈谈Ember的rets扩展吗?使用数据还是资源更好?您能给出一个简单的rest api调用示例吗? - Robin Wieruch
1
简短回答是库会经常变化,我无法根据之前的经验给出答案(我自己进行了评估)。我认为这篇文章会比我更详细地告诉你:https://dev59.com/X8gmz4gBFxS5KdRjbWJQ - Nicolas Zozol
1
我已经看过这篇帖子了,所以才问的 :) - Robin Wieruch
2
@NicolasZozol 哪个播客?链接? - deepak
3
这是在二月份的一期Javascript Jabber节目,讨论Backbone.js。当时还不太清楚这些框架在哪些方面存在重叠。你可以听到Yehuda和Jeremy彼此在说话,但实际上并没有进行任何比较。 - Trek Glowacki
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接