Sails.js和Meteor - 两者的优劣势是什么?

81

我一直在阅读有关Nodejs及其框架的文章,最近完成了我的第一个完整的JavaScript前端(使用Angularjs)。

我已经决定我的下一个宠物项目将是使用以下两个框架之一的Nodejs探险:

我对这两个框架都有所了解,但仍无法准确把握它们之间的区别以及为什么我应该选择其中一个来使用。因此,请展示您最好的推销技巧,选择一个框架,并向我推荐。

我的宠物项目需要的一些功能包括:

  • 实时比分
  • Reddit样式的实时线程
  • 类似维基百科的页面编辑
  • 用户/角色

1
请查看此链接:http://vschart.com/compare/meteor-web-framework/vs/sails-js。它可能会对您有所帮助! - Christian Martinez
4个回答

138
我不能代表Meteor发言,但我可以帮助解释一下Sails的背景,因为我是它的创造者。
简而言之,Sails并非解决网络问题的万能药,但我相信Node.js可以。Sails的目标是提供一个实用的框架,用于开发基于Node.js的完整、可扩展、适合初创企业和企业的应用程序。我创建Balderdash的初衷就是想问一句“我们可以用Node.js做任何事情吗?”。而Sails就是这个答案。

来自我们的新文档

Sails当然是一个Web框架。但是让我们退一步,这意味着什么?有时候,当我们提到“Web”时,我们指的是“前端Web”。我们想到的概念如Web标准、HTML 5或CSS 3;以及像Backbone、Angular或jQuery之类的框架。Sails不是“那种”Web框架。Sails与Angular和Backbone很好地配合使用,但您永远不会使用Sails代替这些库。

另一方面,有时候当我们谈论“Web框架”时,我们指的是“后端Web”。这唤起了诸如REST、HTTP或WebSockets之类的概念;并建立在像Java、Ruby或Node.js之类的技术上。一个“后端Web”框架可以帮助您构建API、与数据库交互、提供HTML文件并处理数十万个同时用户。Sails是“那种”Web框架。

几年前,我做出了一个承诺,要将Node.js用于所有事情- 这是一见钟情。我在ExpressSocket.io的基础上构建了Sails,因为它们是(现在仍然是)各自用例中最成熟的Node模块。Sails中的请求处理代码与Express兼容,并具有对Socket.io的隐式支持的额外优势。

Sails旨在与您在Angular、Backbone、iOS / ObjC、Android / Java甚至只是提供原始API供其他Web服务或您的开发社区使用的任何构建前端的策略兼容。如果您最终改变了方法(例如,从Backbone切换到Angular)或完全构建了新的前端(例如,构建Windows Phone本机应用程序),您的Sails应用程序仍将正常工作。如您所知,有些人称此方法为面向服务的架构或SOA(Joe McCann对此有一个很棒的演示文稿)。
同样,Sails保持了构建Web服务器的其他熟悉约定-标准MVC结构、创建干净的API的能力以及核心模块是开放的、可配置的、可扩展的,甚至可交换的。这意味着Sails可以根据其用户的需求进行定制,尽可能低级。
在2013年,这个框架在流行度上经历了巨大的增长,我们的咨询业务也随之增长。核心维护人员和我将重点放在使后端开发变得尽可能快速和简单上。Sails的相关方面,如钩子(插件)、测试和文档等,在过去一年中都取得了很大进展,这要归功于我们的核心团队和(不断扩大的)Sails社区的努力。虽然我们仍在处理许多路线图项目,但我相信Sails是当今Node上稳定、可维护的MVC开发的最佳选择。我和团队的其他成员致力于其持续维护和功能开发,并且由于我们用它来处理所有客户项目,所以它不会消失。
我非常致力于使Sails成为最好的Web框架,但从不以牺牲Node.js为代价。我和核心团队一直不懈地致力于增强Node生态系统,这意味着采用NPM,利用现有的Node技术和最佳实践等。这不仅因为它更有意义,而且因为我们是Node.js开发人员。我们所有努力的动机都是为了使Node更易于访问,而不是取代它。所以,如果在某个奇怪的平行宇宙中,我被赋予了一个选择,要么将Sails转换为其他语言,要么完全放弃Sails但仍能使用Node,我会选择后者。

额外资源:

常见问题解答 | Sails 101 | 原始视频教程 | 贡献指南 | Stackoverflow

Google Group | 路线图 | IRC: #sailsjs on Freenode | 构建状态


2
在这个问题上,我又发现了一个很好的观点(第一个答案):https://www.linkedin.com/groups/Just-tested-out-Sailsjs-really-2906459.S.5798118180668850178 - mikermcneil
2
https://github.com/balderdashy/sails-docs/blob/master/What-Is-Sails.md 现在已经无法访问。 - Aaron Shafovaloff
@AaronShafovaloff 感谢您的提醒 - 这是更新后的链接:http://sailsjs.org/get-started - mikermcneil

30

我已经使用Meteor构建了几个项目,但还没有使用Sails。因此,我的观点肯定会有偏见,但希望对您有所帮助。

构建前端

Meteor提供了自己的前端框架Blaze-包含在即将发布的0.8版本中。Meteor负责将集合中的数据绑定到视图上。由于这一点,您不必担心告诉您的视图更新,它们只是这样做。

另一方面,Sails仅提供后端框架,您需要自己带上前端框架。

与大多数Node.js框架不同,Meteor是同步的

Meteor在循环中运行,如果您想使用Node.js包,您需要做一些额外的工作,以确保它们在Meteor中正常运行。

Sails似乎是一个简单的MVC Node.js框架,因此当您研究它时不应该有太多令人惊讶的事情。

您应该在Meteor中使用MongoDB

是的,你可以在Meteor中使用其他数据库,但它们的支持远不如MongoDB。而在Sails中,看起来他们有针对一些数据库的ORM。

性能

对于大型应用程序,Meteor 可能表现不佳。目前正在进行大量工作来解决此问题,到2014年底,我们可以期望有针对Meteor的扩展解决方案。

稳定性

Meteor仍然非常新,并且尚未达到1.0版本。您应该期望在接下来的几个版本中进行一些更改,这些更改会破坏向后兼容性。如果您希望尽快开始使用它,则可能希望考虑使用0.8-rc0分支。话虽如此,管道中的一些功能确实非常棒,将使1.0版本非常诱人。

最后的想法?

我喜欢 Meteor,因为它有其独特之处。你需要学习 Meteor 的做法,但一旦开始使用,你会感觉自己已经入门了。由于数据绑定到视图的方式,服务器和客户端之间的界限不是很明显。Meteor 代表了应用程序架构的范式转变,如果你还没有尝试过,我建议你试试。
PS 查看路线图,以了解即将推出的内容。

5
建议修改“meteor是同步的”这个说法,因为对于不熟悉nodejs fibers的人可能会产生误解。Meteor在Node.js上运行,因此仍然可以享受到其事件驱动和非阻塞的优势。Meteor透明地集成了Node Fibers,因此服务器端代码可以采用线性执行模型编写,而无需将其拆分为传统的回调函数。以下链接可能是关于在Meteor中使用npm包的最佳参考:http://meteorhacks.com/complete-npm-integration-for-meteor.html - alanning
谢谢Alanning,我会将您的反馈合并到这个回复中! - MSaforrian
8
也许一个重要的区别是,sails.js 仅针对后端,而 Meteor 则提供了一个完整的前端 JavaScript 框架,方便与后端进行交互。 - Michael
感谢提出这个问题,@Michael。Sails.js和Meteor并不是真正的竞争对手-- Sails.js是一个后端框架,可以替代Django、Rails、Express等框架,而Meteor则是一种全新的思考方式,用于从上到下构建反应式应用程序 - 我认为这非常酷 :) - mikermcneil
你是否愿意更新你的评论,因为已经过去4年了?我肯定希望听到关于新的游戏变革Meteor 1.7的看法。 - Shyam

19

我只能就sails发表意见。我是一名经验非常丰富的Javascript开发者,自上世纪90年代以来一直在使用基于Javascript构建的嵌入式机顶盒应用程序。

优点: - 很容易上手,发布的材料支持很好。 - 学习曲线很短,后面有一个蓬勃发展的社区。 - 初步学习之后,可以很快做出创意。

需要改进的地方: - 复杂数据结构的实现比较棘手。 - Passport.js的集成很痛苦,因为没有干净的参考材料。

推荐: - Ponzi Coder有一个很棒的教程,帮助我快速上手 https://www.youtube.com/user/ponzicoder - 当你尝试更复杂的数据挑战时,了解Express和Waterline会更有帮助。

总的来说,我会推荐sails。


1
嗨,Simon,能否请您分享一下您如何将 Passport 与 Sails 集成?我遇到了同样的问题。您是否在某个地方写过博客或者有任何参考资料? - Mitermayer Reis
2
嗨,Mitermayer,很抱歉我的博客早已因疏于维护而死亡。让passport对我起作用的事情是意识到如果我做了两件事情,它似乎可以正常工作。
  1. 在任何地方都使用默认字段名称(电子邮件和密码)
  2. 将req对象传递给回调函数
passport.use('local-login', new LocalStrategy({ usernameField : 'email', passwordField : 'password', passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not) },
- simondelliott
1
哇,谢谢。我已经为本地策略烦恼了好几天了。这值得在 Stack Overflow 上发一个帖子。 - light24bulbs
1
Passport.js的集成确实需要更多的文档资料,这一点无法强调得足够。特别是针对REST API使用情况,其中没有进行服务器渲染(例如针对Angular JS客户端),结合Facebook/Google登录和本地身份验证。 - Alon Amir
1
点赞 Passport.js 集成困难且文档不完善。 - pim
各位,如果你们正在寻找一种替代 Passport w/ Sails 的方式,可以看一下 https://github.com/sails101/basic-login。我在同一时间写了一个类似的 Passport 示例(https://github.com/sails101/using-passport),发现对我来说,使用原始方法(不使用 Passport)更加直观且需要的代码更少,即使我想要添加其他提供者的 OAuth 支持。但这也取决于个人口味以及对 Passport 内部API的熟悉程度。希望能对你有所帮助! - mikermcneil

9
我目前使用Meteor,没有使用过Sails.js。
Meteor非常愉快地进行开发,我认为它是实时Web应用的绝佳选择。关于用户/角色,您可以查看集成的Accounts包,并在Atmosphere中搜索社区贡献的角色/权限包。
最终,我建议尝试使用这两种技术进行小型项目,并看看哪个更适合您。

你知道Sail.js是否有任何类似于Meteor模型级别的客户端延迟补偿的变体吗? - imslavko
不知道Sail.js,但你可以使用http://sharejs.org/库自己包含它。至少这似乎是该库的目标。 - alanning
1
@alanning - 不,Sharejs不做延迟补偿。Sharejs进行操作转换。延迟补偿是指Meteor更新其本地minimongo并假设远程更新将成功,从而允许用户继续的情况。 - gomad
1
@gomad,你说得对,sharejs本身并没有提供延迟补偿功能。我也没有这么说过。相反,我说,“你可以使用sharejs.org自己加入延迟补偿功能”。LC是建立在OT之上的。 - alanning
只是附带一点说明。我认为Meteor非常愉快易用。除了有一点学习曲线外,这个框架与Rails对Ruby的描述非常相似。我目前唯一的抱怨是,如果你想要自主托管,它仍然依赖于Node 0.10.40。因为Meteor有一个相当大的用户群体,我认为在Node方面追赶的游戏对Meteor来说有点不公平。 - mirageglobe

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