从Web应用程序设计和开发的角度来看,Express和Hapi如何相互比较?对于基本示例,它们看起来很相似,但是我有兴趣了解有关整个应用程序结构中关键差异的更多信息。

例如,据我了解,Hapi使用different路由机制,该机制不考虑注册顺序,可以进行更快的查找,但与Express相比受到限制。还有其他重要区别吗?

关于选择Hapi(通过Express)来开发新的npmjs.com网站,还有一个article。本文指出:“Hapi的插件系统意味着我们可以通过允许微服务中使用微服务的方式隔离应用程序的不同方面和服务。另一方面,Express需要更多的配置才能获得相同的功能”,这到底是什么意思?

最佳答案

这是一个很大的问题,需要较长的答案才能完成,因此,我仅解决最重要差异的一部分。抱歉,这仍然是一个冗长的答案。

它们有何相似之处?

您说的是绝对正确的:



两种框架都在解决相同的基本问题:提供一种方便的API,用于在节点中构建HTTP服务器。也就是说,比单独使用较低级别的本地 http 模块更加方便。 http模块可以完成我们想要的一切,但是编写应用程序很繁琐。

为了实现这一目标,它们都使用了高级Web框架中已存在很长时间的概念:路由,处理程序,插件,身份验证模块。他们可能并不总是具有相同的名称,但大致相同。

大多数基本示例如下所示:

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

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

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

    区别不完全是突破性的吧?那么为什么要选择一个呢?

    它们有何不同?

    简单的答案是,hapi不仅功能丰富,而且开箱即用。当您仅从上方看一个简单的示例时,可能不清楚。实际上,这是故意的。简单的情况保持简单。因此,让我们研究一些较大的差异:

    哲学

    Express的目标是极简的。通过为您提供一个小的API,并在http上加上少量的灰尘,就添加其他功能而言,您仍然可以独自一人。如果要读取传入请求的正文(非常常见的任务),则需要安装separate module。如果您希望将各种内容类型发送到该路由,则还需要检查Content-type header 以检查其内容并相应地进行解析(例如,表单数据,JSON和多部分),通常使用单独的模块。

    hapi具有丰富的功能集,通常通过配置选项公开,而不需要编写代码。例如,如果我们要确保在运行处理程序之前将请求正文(有效负载)完全读入内存并进行适当地解析(自动基于内容类型),则它只是一个简单的option:
    server.route({
        config: {
            payload: {
                output: 'data',
                parse: true
            }
        },
        method: 'GET',
        path: '/',
        handler: function (request, reply) {
    
            reply(request.payload);
        }
    });
    

    特征

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

    hapi包括Express内置的以下某些内置功能(据我所知):
  • Input and response validation(通过Joi)
  • Server-side caching具有多个存储选项(mongo,S3,redis,riak),可以通过几行配置
  • 启用
  • Cookie-parsing
  • session
  • 文件上传/分段解析
  • CORS支持
  • Logging

  • 可扩展性和模块化

    hapi和Express以完全不同的方式实现可扩展性。使用Express,您可以使用middleware函数。中间件功能有点像过滤器,您可以堆叠它们,所有请求在到达处理程序之前都会通过它们运行。

    hapi具有request lifecycle并提供extension points,与中间件功能相当,但在请求生命周期中存在几个已定义的点。

    沃尔玛制造hapi并停止使用Express的原因之一是,将Express应用程序拆分成单独的部分并让不同的团队成员安全地工作非常困难。因此,他们在hapi中创建了plugin system

    插件就像一个子应用程序,您可以在hapi应用程序中执行所有操作,添加路由,扩展点等。在插件中,您可以确保不破坏应用程序的另一部分,因为顺序路线注册无关紧要,并且您不能创建冲突的路线。然后,您可以将此插件组合到服务器中并进行部署。

    生态系统

    由于Express开箱即用的功能很少,因此当您需要向项目中添加任何内容时,您需要向外看。很多时候使用hapi时,您需要的功能要么是内置的,要么是核心团队创建的模块。

    最小的声音很棒。但是,如果您要构建一个认真的生产应用程序,则最终可能会需要所有这些东西。

    安全

    hapi由沃尔玛团队设计,用于运行黑色星期五交通,因此安全性和稳定性一直是头等大事。因此,该框架做了很多其他事情,例如限制传入的有效负载大小以防止耗尽进程内存。它还具有一些选项,例如最大事件循环延迟,使用的最大RSS内存和最大的v8堆大小,超过这些值,服务器将以503超时响应而不仅仅是崩溃。

    概括

    自己评估它们。考虑一下您的需求,以及这两个解决您最大的顾虑。在这两个社区(IRC,Gitter和Github)中畅游一番,看看您喜欢哪个。不要只听我的话。祝您黑客愉快!

    免责声明:作为book on hapi的作者,我有偏见,以上内容是我个人的看法。

    关于node.js - Express和hapi彼此之间如何比较?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30469767/

    10-11 07:05