Express和hapi如何相互比较?

从Web应用程序devise和开发的angular度来看,Express和Hapi如何相互比较? 对于基本的例子,他们看起来很相似,但我有兴趣了解更多关于整体应用程序结构的关键差异。

例如,据我所知,Hapi使用不同的路由机制,不考虑注册顺序,可以做更快的查找,但比Express有限。 还有其他重要的区别吗?

还有一篇关于selectHapi(通过Express)开发新的npmjs.com网站的文章,这篇文章指出:“Hapi的插件系统意味着我们可以隔离应用程序的不同方面和服务,以允许微服务未来,另一方面,Express需要更多的configuration才能获得相同的function“,这究竟意味着什么?

这是一个很大的问题,需要一个长的答案才能完成,所以我只讨论最重要区别的一个子集。 道歉,这仍然是一个漫长的答案。

他们怎么样?

当你说:你完全正确

基本的例子他们看起来很相似

这两个框架都解决了相同的基本问题:提供一个方便的API来构build节点中的HTTP服务器。 也就是说,比单独使用低级本地http模块更方便。 http模块可以完成我们想要的任何事情,但是编写应用程序却很麻烦。

为了实现这个目标,他们都使用了长期以来在高级web框架中使用的概念:路由,处理程序,插件,authentication模块。 他们可能并不总是有相同的名字,但他们大致相同。

大部分的基本例子都是这样的:

  • 创build一个路线
  • 在请求路由时运行一个函数,准备响应
  • 回应请求

performance:

 app.get('/', function (req, res) { getSomeValue(function (obj) { res.json({an: 'object'}); }); }); 

高致病性禽stream感:

 server.route({ method: 'GET', path: '/', handler: function (request, reply) { getSomeValue(function (obj) { reply(obj); }); } }); 

这个区别在这里并不完全是开创性的吗? 那么为什么select一个呢?

他们有什么不同?

简单的答案是hapi是更多的东西,它可以做更多的开箱即用。 当你看一下上面的简单例子时,可能就不太清楚了。 其实这是故意的。 简单的情况下保持简单。 那么让我们来看看一些重要的差异:

哲学

Express的意图是非常小的。 通过给你一个小的API,只需要在http顶部打一个小小的灰尘,就可以在添加额外的function方面依靠自己的function。 如果你想读取传入请求的正文(相当常见的任务),你需要安装一个单独的模块 。 如果您期望将各种内容types发送到该路由,则还需要检查Content-type标头以检查它是哪一个,并相应地进行parsing(例如,表单数据vs JSON或多部分),通常使用单独的模块。

hapi具有丰富的function集,通常通过configuration选项公开,而不需要编写代码。 例如,如果我们要确保在处理程序运行之前,请求主体(有效内容)已完全读入内存并进行适当的分析(自动基于内容types),那么这只是一个简单的select :

 server.route({ config: { payload: { output: 'data', parse: true } }, method: 'GET', path: '/', handler: function (request, reply) { reply(request.payload); } }); 

特征

您只需比较两个项目的API文档即可看到hapi提供了更大的function集。

hapi包含Express内置的下列一些function(据我所知):

  • input和响应validation (通过Joi )
  • 具有多个存储选项(mongo,S3,redis,riak)的服务器端caching ,可以通过几行configuration启用
  • Cookie的分析
  • 会议
  • file upload/多部分parsing
  • CORS支持
  • logging

可扩展性和模块化

hapi和Express以相当不同的方式进行扩展。 使用Express,你有中间件function。 中间件function有点像filter,你可以在你的处理器之前堆积起来,所有的请求都通过它们。

hapi具有请求生命周期,并提供了与中间件function相媲美的扩展点 ,但在请求生命周期中存在几个定义的点。

沃尔玛build立hapi并停止使用Express的原因之一是将Express应用拆分成单独的部分有多困难,并让不同的团队成员在其大块中安全地工作。 为此,他们在hapi中创build了插件系统 。

一个插件就像一个子应用程序,你可以在hapi应用程序中做所有的事情,添加路线,扩展点等。在一个插件中,你可以肯定你不会破坏应用程序的另一部分,因为路由注册并不重要,您不能创build冲突的路由。 然后,您可以将这些插件组合到一个服务器并进行部署。

生态系统

因为“Express”很less提供给你,所以当你需要向你的项目添加任何东西时,你需要向外看。 很多时候使用hapi的时候,你需要的function是内置的,或者是由核心团队创build的一个模块。

最小的声音很好。 但是,如果你正在构build一个严肃的生产应用程序,那么你最终可能会需要所有这些东西。

安全

哈皮是由沃尔玛团队devise的,运行黑色星期五的交通,所以安全和稳定一直是最受关注的问题。 出于这个原因,框架做了很多额外的事情,例如限制传入的有效负载大小,以防止耗尽你的进程内存。 它还具有诸如最大事件循环延迟,所使用的最大RSS内存以及v8堆的最大大小等选项,超出此范围,服务器将以503超时响应,而不仅仅是崩溃。

概要

自己评估一下。 想想你的需求,以及哪两个地址是你最关心的问题。 在两个社区(IRC,Gitter,Github)畅所欲言,看看你更喜欢哪一个。 不要只听我的话 和快乐的黑客!


免责声明:作为一本关于hapi的书的作者,我有偏见,上面这个主要是我个人的看法。

我的组织正在与哈比。 这就是我们喜欢它的原因。

哈比是:

  • 支持主要军团。 这意味着社区的支持将会非常强大,在未来的版本中将为您提供帮助。 很容易find充满激情的Hapi人,并且有很好的教程(虽然不像ExpressJs教程那样繁多和庞大)。 截至此date,npm和Walmart使用Hapi。
  • 它可以促进在后端服务的各个部分工作的分布式团队的工作,而不需要对API表面的其余部分有全面的了解(Hapi的插件架构就是这种质量的缩影)。
  • 让框架做一个框架应该:configuration的东西。 之后,框架应该是不可见的,并允许开发人员将其真正的创造力集中在构build业务逻辑上。 使用哈比一年后,我肯定觉得哈比完成了这一点。 我感到开心!

如果你想直接听到Eran Hammer(Hapi的领导)

在过去的四年里,hapi成为许多项目(不论大小)的首选框架。 hapi的独特之处在于能够扩展到大型部署和大型团队。 随着项目的发展,复杂性也越来越高 – 工程复杂性和stream程复杂性也越来越高。 hapi的架构和理念处理增加的复杂性,而不需要不断重构代码[阅读更多]

开始使用Hapi并不像ExpressJs那么容易,因为Hapi不具备相同的“明星力量”……但一旦感觉舒适,您将获得大量的里程数。 花了我大约2个月的时间,作为一个不负责任地使用ExpressJs几年的新黑客。 如果您是经验丰富的后端开发人员,您将会知道如何阅读这些文档,而您甚至可能不会注意到这一点。

Hapi文档可以改进的领域:

  1. 如何authentication用户和创build会话
  2. 处理跨源请求(CORS)
  3. 上传文件(多部分,分块)

我认为身份validation将是最具挑战性的部分,因为您必须决定使用哪种身份validation策略(基本身份validation,Cookie,JWT令牌,OAuth)。 虽然从技术上讲,Hapi的会议/authentication环境如此分散,但是我希望他们为此提供了一些手段。 这将大大增加开发者的快乐。

其余的两个实际上并不难,文件可能会写得稍微好一些。