RESTful后端的Ember.js或Backbone.js [关闭]


98

我已经知道ember.js是一种与ribs.js相比更为繁重的方法。我读了很多有关这两者的文章。

我问自己,哪个框架更容易作为Rails后端的前端。对于bone.js,我看到了不同的方法来调用rest后端。对于余烬来说,我似乎必须包括更多的库,例如“数据”或“资源”。为什么要为此设置两个库?

那么,更好的选择是什么呢?也有很多示例将前端与后端连接起来。后端REST调用的一个很好的工作示例是:

URI:../restapi/topics GET身份验证凭据:admin / secret格式:json


3
必须爱一个“没有建设性”的问题,但有用的,经过深思熟虑的答案仍然获得了240多个投票。
安德鲁

Answers:


257

与流行观点相反,Ember.js不是Backbone.js的“更重方法”。它们是针对完全不同的最终产品的不同工具。Ember的优势在于应用程序,用户将在很长一段时间内(可能整天)保持应用程序打开,并且与应用程序视图或基础数据的交互会触发视图层次结构的深刻变化。灰烬比骨干大,但由于ExpiresCache-Control这仅在第一次加载时才重要。每天使用两天后,如果您的内容涉及图像,则数据传输将使额外的30k消失。

骨干网非常适合具有少数状态的应用程序,在这些应用程序中,视图层次结构保持相对平坦,并且用户倾向于不频繁或在较短的时间内访问应用程序。骨干网的代码变得简短而甜美,因为它假设支持DOM的数据将被丢弃,并且两项都会被内存收集:https : //github.com/documentcloud/backbone/issues/231#issuecomment-4452400骨干的较小尺寸也使其更适合于简短的交互。

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

骨干网应用程序更多地关注短暂或偶然的交互,这些交互通常只是较大的静态页面的一小部分:airbnbKhan AcademyFoursquare的地图和列表

可以使用Backbone来制作Ember所针对的各种应用程序(例如Rdio),方法是:a)增加您负责的应用程序代码量,以避免诸如内存泄漏或僵尸事件之类的问题(我个人不推荐这种方法)或者b)通过添加第三方库像backbone.marionette尾骨 -有许多这些库的所有尝试提供类似的功能重叠,你可能会最终组装自己的自定义框架,更大,不仅仅需要胶水代码如果您刚刚使用过Ember。

最终,“使用哪个”问题有两个答案。

首先,“一般来说,我应该在职业中使用哪个”:两者都一样,就像您最终将学习将来要使用的特定于工作的工具一样。您永远不会问“骨干网还是D3?”;“骨干还是灰烬”是一个同样愚蠢的问题。

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


4
特雷克,反应不错。只是想在这里发表评论,Expires并且所获得的Cache-Control帮助远比人们想像的要少,尤其是在经常忽略它们的移动设备方面。我记得一个版本的iOS完全忽略了它们(但仍然听HTML5缓存清单)。此外,这些标头值在用户首次访问期间将无济于事-这通常对于确定用户是否会留下并使用您的应用程序最为关键。说所有30kb的文件差异对我来说似乎并不重要。那是原始的还是缩小并压缩的30k差异?
莫维斯·莱福德(Mauvis Ledford)2012年

11
如果您查看Ember旨在帮助创建的实际应用程序,您会发现没有逃避那些讨厌的kbs。它们来自Ember而您的应用程序代码较小,或者来自主干插件,或者来自您自己编写的代码。 Wunderlist,您会以大约300kb的传输速度来“简单”地进行计时。我以为它的大小和Ember差不多,也许更小-从来没有写过一个我不能100%肯定地说出来的Wunderlist副本。
Trek Glowacki 2012年

1
我同意,我最受欢迎的主干应用以178kb +模板压缩和最小化。只是指出我们不应该依赖浏览器缓存。
莫维斯·莱德福德

2
跋涉,您将深入了解如何在具有扩展使用模式和复杂状态管理的应用程序中使用Backbone。我经历了将旧版应用程序转换为Backbone的经历,并且必须完全按照您列出的来做。我们需要集成木偶,并为路由之前/之后的过滤,减少内存泄漏以及更好的事件管理等内容编写大量粘合代码。
Mike Clymer

9
“您永远不会问Backbone或D3”-可以,但是我可以轻松地想象一个将D3与Backbone结合使用的项目。很难想象一个将Backbone和Ember一起使用在一个页面上的项目。因此,我发现“骨干还是灰烬”这个问题很公平。这是我发现的另一篇文章,因为它更深入地比较了两个框架:net.tutsplus.com/tutorials/javascript-ajax/…–
Shiprack

26

要给出一个简短的简化答案:目前,对于RESTful后端,您应该使用Backbone。

要给出更复杂的答案:这实际上取决于您在做什么。正如其他人所说,Ember是为不同的事物设计的,将吸引不同的人群。我的简短答案是基于您包含的RESTful要求。

目前,Ember-Data(这似乎是Ember中的默认持久性机制)距离生产还很遥远。这意味着它有很多错误,并且至关重要的是,它不支持嵌套的URI(例如,/ posts / 2 / comments / 4556)。如果需要REST,那么如果您选择Ember,则暂时必须解决此问题(即您要么破解,等待,自己重新实现Ember-Data之类的东西,要么不使用-非常RESTful URI)。Ember-Data严格来说不是Ember的一部分,因此这完全有可能。

除了大小,两者之间的主要区别基本上是:

Ember尝试为您做更多的事情,这样您就不必编写太多的代码。它是非常分层的,如果您的应用程序也非常分层,则很适合。因为它为您提供了很多帮助,所以可能很难弄清错误来自何处,并难以解释为什么发生意外行为(有很多“魔术”)。如果您的应用程序自然适合Ember希望您构建的应用程序类型,那么这可能不会成为问题。

Backbone尝试为您做尽可能少的事情,以便您可以推理正在发生的事情并构建适合您的应用程序的体系结构(而不​​是构建适合您正在使用的框架的体系结构的应用程序)。上手起来要容易得多,但除非小心,否则很快就会陷入混乱。它不会执行诸如计算属性,自动解除绑定事件之类的工作,而是将它们留给您,因此您将需要自己实现很多工作(或至少选择为您执行此操作的库),尽管那是而不是整个重点。

更新:看来,从最近开始,Ember现在支持嵌套URI,所以我想问题归结为您喜欢多少魔术,以及Ember在结构上是否适合您的应用程序。


5
“至关重要的是,它不支持嵌套的URI(例如,/ posts / 2 / comments / 4556)”这是几周前的相关提交:github.com/emberjs/data/commit/…。它知道很难跟上一个快速变化的,发布前的框架,但是当与权威人士交谈并提供建议时,我们应始终追求准确性!
Trek Glowacki 2012年

太好了,谢谢。更新了我的答案。我想这是上周左右在大关系合并中引入的。我确实看过并阅读了列出的更改,但是没有提到url,并且当我检查它们时,我跟踪的问题仍然存在。感谢您指出提交-在不知道其存在的情况下可能很难找到它。
bengillies 2012年

确实是关系改进分支最近合并而成。我们一直在慢慢跟踪旧问题,并于本周将其关闭。
Trek Glowacki 2012年

3

我认为您的问题很快就会被阻止:)两个框架之间存在一些争论。

基本上,Backbone不会做很多事情,这就是我喜欢它的原因:您将不得不编写很多代码,但是您将在正确的位置进行编码。Ember做很多事情,所以您最好注意一下它在做什么。

服务器讨论是Backbone要做的少数事情之一,并且做得很好。因此,如果您不完全满意,那么我将从Backbone开始,然后尝试Ember。

您还可以收听此播客,其中Backbone的创建者Jeremy Ashkenas和Ember的Yehuda Katz进行了精彩的讨论。


2
谢谢。关于余烬的rets扩展,您能说什么。更好地使用数据或资源?您能举一个简单的REST API调用示例吗?
罗宾·维鲁克

1
简短的回答是,库一直在变化,根据我以前的经验,我无法给您答复(我自己做了评估)。我认为这篇文章会告诉您更多信息:stackoverflow.com/questions/8623091/ember-js-rest-api
Nicolas Zozol 2012年

1
我已经看过这篇文章。那就是为什么我问:)
Robin Wieruch

2
@NicolasZozol哪个播客?链接?
迪帕克2012年

3
javascriptjabber.com/004-jsj-backbone-js-with-jeremy-ashkenas从二月份开始。在变得更清晰之前,这些框架并不是真正存在于重叠的领域中。您会听到Yehuda和Jeremy只是互相交谈,没有真正进行比较。
Trek Glowacki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.