Node.js的Express,Koa和Hapi Web框架的比较

您想使用Node.js构建Web应用程序并需要选择一个服务器框架吗?您可能只是因为Express的流行而默认使用Express,但是其他选项可能更适合您应用程序的需求,例如Koa和Hapi。

本文为您介绍了每个框架的服务器设置和路由,然后比较了它们的优缺点。最后,您选择的选择很大程度上取决于应用程序的特定需求。

Express

每周下载量:9百万+| GitHub Star:47k+

EXPRES是不容争辩的Node.js的最流行的框架 Express的第一位贡献者TJ Holowaychuk于2010年1月3日发布了0.0.1版,使其成为最古老,最成熟的框架。许多初学者更喜欢使用Express,因为它不受操作者的支配或从Node提取的次数较少,这意味着它更类似于开发本机节点应用程序。

Hello World!

要设置服务器,首先必须要求Express软件包,然后通过将其分配给变量(在本例中为app)来实例化它。然后,实例化服务器以侦听特定端口。连接后,您将在控制台日志中看到成功消息。

const express = require(‘express’);
const app = express();
app.get(‘/’, function (req, res) {
  res.send(‘Hello World!’)
})
app.listen(3000, () => console.log(`App is listening on port 3000!`))

而已。您现在已经可以使用服务器了!简单,不是吗?

上面的示例演示了对根或主页的GET请求,该请求在'/'处建立了端点。响应对象具有将HTML文本发送到页面的send方法。如果您访问localhost:3000/(或您指定的任何端口),则应看到“ Hello World!”。在页面上。这是应用程序的最简单示例。挺整洁的!

您还可以使用应用程序对象的其他方法,这些方法与HTTP方法相对应:PUT,POST和DELETE。您也不仅限于发送纯文本。有多种响应方法,包括res.render(),可以与诸如EJS的模板引擎一起使用以呈现不同的视图。

基本路由

使用Express,路由也相对简单。使用app.route,您可以将路径的路由处理程序链接在一起,同时保持代码DRY。

app.route(‘/book’)
 .get(function (req, res) {
   res.send(‘Get a random book’)
 })
 .post(function (req, res) {
   res.send(‘Add a book’)
 })
 .put(function (req, res) {
   res.send(‘Update the book’)
 })

优点

因此,现在您可以看到使用Express设置服务器只需要很少的样板代码。由于Express的成熟和流行,它得到大量文档的支持,并具有出色的社区支持,因此,如果遇到困难,可以使用大量资源来进行调试。它也非常稳定并由Node.js Foundation Incubator维护,因此也难怪许多其他框架都基于Express构建。

缺点

尽管Express有其广泛的优点,但并非没有缺点。从根本上讲,这是非常劳动密集型的。它要求开发人员手动创建所有端点,这意味着代码库越大,重构就越困难。随后,您需要有条理地维护代码,因为很容易在所有中间件中迷失方向。它还没有像Koa和Hapi这样的内置错误处理。

Koa

每周下载量:300k+ | Github Star:28k+

在框架中,Koa是更酷,更热门和更先进的产品。由与Express相同的团队开发的TJ Holowaychuk(听起来很熟悉吗?)于2013年8月17日进行了首次提交。Koa和Express之间的主要区别在于它们处理中间件的方式。Express在应用程序框架中包括路由和模板。另一方面,Koa需要具有这些功能的模块,因此使其更具模块化或可定制性。您还会在下面的代码示例中注意到Koa使用ES2015异步函数,因此它需要Node v7.6.0及更高版本才能运行。

设置

这是相同的Hello World!Koa的应用程序:

const Koa = require(‘koa’);
const app = new Koa();
app.use(async ctx => {
  ctx.body = ‘Hello World’;
});
app.listen(3000, () => console.log(‘Koa is listening to http://localhost:3000'));

看起来很相似,对吧?注意,Node的req和res对象丢失了,因为它们已被Koa的Context对象替换。该对象包括ctx.request和ctx.response属性。

路由

如前所述,Koa不提供任何内置的路由中间件,因此您必须安装类似koa-router的模块。

上面的示例但包含一个路由器:

const Koa = require(‘koa’);
const Router = require(‘koa-router’);
const app = new Koa();
const router = new Router();
router
  .get(‘/’, (ctx, next) => {
    ctx.body = ‘Hello World!’;
  })
  .post(‘/users’, (ctx, next) => {
    // …
  .put(‘/users’, (ctx, next) => {
    // …
  .del(‘/users’, (ctx, next) => {
    // …
  });
app
  .use(router.routes())
  .use(router.allowedMethods());

有了Koa,这是一个简单的路由器。如果请求/响应周期中存在错误,则内置错误处理功能,这意味着它将所有错误输出到stderr。

优点

使用Koa,由于该框架具有灵活性,因此更容易编写中间件。它被设计为既使写作又使阅读愉快。它还使用ES6异步/等待功能来消除对回调的使用。另一个重要的考虑因素是Koa的下载量很小。它非常轻巧,大约有500行代码。

缺点

虽然Koa可能是新的,但它也比其较旧的兄弟版Express不稳定。相比之下,开源社区也要小得多,这意味着可用的支持较少。尽管async / await消除了对回调的需求,但一次多个异步调用仍可能导致async / await hell。Koa特定的中间件也与其他框架不兼容。

哈皮 Hapi

每周下载:170k+ | GitHub Star:12k +

Hapi是(Http)API的缩写,由WalmartLabs开发。Eran Hammer于2011年8月5日进行了首次提交。代码库经过了良好的测试和维护,因为它是为沃尔玛黑色星期五的销售而扩张。在Express使用中间件扩展Node的请求/响应对象的地方,Hapi使用了功能强大的插件的广泛集合。

服务器时间

让我们看一下与Hapi相同的服务器示例服务器。

‘use strict’;
const Hapi = require(‘@hapi/hapi’);
const init = async () => {
const server = Hapi.server({
    port: 3000,
    host: ‘localhost’
  });
await server.start();
  console.log(‘Server running on %s’, server.info.uri);
};
server.route({
  method: ‘GET’,
  path: ‘/’,
  handler: function (request, h) {
    return ‘Hello World!’;
  }
});
process.on(‘unhandledRejection’, (err) => {
  console.log(err);
  process.exit(1);
});
init();

马上,您会发现设置Hapi服务器涉及很多样板。公平地说,与Express或Koa相比,这些路线本身可读性强。Hapi还使用异步/等待和类似Koa的错误处理。

路由

server.route([
  {
    method: ‘GET’,
    path: ‘/api/items’,
    handler: function(request, reply) {
      reply(‘Get item id’);
    }
  },
  {
    method: ‘GET’,
    path: ‘/api/items/{id}’,
    handler: function(request, reply) {
      reply(‘Get item id: ‘ + request.params.id);
    }
  },
  {
    method: ‘POST’,
    path: ‘/api/items’,
    handler: function(request, reply) {
      reply(‘Post item’);
    }
  },
  {
    method: ‘PUT’,
    path: ‘/api/items/{id}’,
    handler: function(request, reply) {
      reply(‘Put item id: ‘ + request.params.id);
    }
  },
  {
    method: ‘DELETE’,
    path: ‘/api/items/{id}’,
    handler: function(request, reply) {
      reply(‘Delete item id: ‘ + request.params.id);
    }
  }
)];

路由涉及很多代码,但是Hapi在设计时考虑了代码的配置。由于这种一致性,在大型团队中更容易使用。另外,Hapi还内部执行Express需要中间件执行的某些操作,例如处理表单数据或设置cookie(分别为body-parser和cookie-parser)。

优点

Hapi是一个健壮的框架,具有许多“开箱即用”的功能,使其非常适合大型项目。它还利用了功能强大的插件。另外,您可以将其与任何前端框架(React,Angular,Vue等)一起使用。

缺点

虽然Hapi是大型项目的绝佳选择,但它不适用于较小的应用程序。与Express一样,它也需要大量的人工和维护,但是与Express不同的是,没有庞大的社区可以依靠。Hapi已被CondéNast,PayPal和Mozilla等主要公司使用,但不适用于不需要相同规模组件的轻量级应用程序。

概括

这三个框架都具有不同的优缺点,这使它们成为您的Web应用程序的正确选择。但是,选择框架都取决于项目的特定要求和开发它们的团队。

如果您正在寻求稳定的支持,那么Express绝对是一个不错的选择。但是,如果您想为单页应用程序提供更轻巧的功能和更新的功能,那么Koa可能是您的最佳选择。而且,如果您要构建一些需要扩展并需要大型团队理解的内容,那么Hapi就是赢家。性能也是要考虑的因素,但它不在本文讨论范围之内。无论您选择哪种,均可使用Express / Koa / Hapi编码!

参考

Is Express the Best Option?

你可能感兴趣的:(Node.js的Express,Koa和Hapi Web框架的比较)