美文网首页
Node.js的Express,Koa和Hapi Web框架的比

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

作者: 魂斗驴 | 来源:发表于2021-03-31 08:55 被阅读0次

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

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

    Express

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

    EXPRES是不容争辩的Node.js的最流行的框架 Express的第一位贡献者TJ Holowaychuk20101月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(听起来很熟悉吗?)于20138月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框架的比

          本文链接:https://www.haomeiwen.com/subject/dfdbcltx.html