首页 未命名正文

linux编程_Node.js框架对比:Express/Koa/Hapi

云返利网 未命名 2020-05-26 09:06:12 20 0

1、先容

  直至今日,Express.js仍然是最为盛行的Node.js Web应用程序框架。它似乎已经逐渐成为大多数Node.js Web应用程序的基础依赖框架,包罗许多盛行的框架,好比Sail.js就是以Express.js为基础搭建的。然而现在我们有了更多“类sinatra”(注:sinatra是一款Ruby框架,代码异常简练,号称开发一个博客项目只需要100行代码)似的框架可以选择。也就是接下来我们将划分先容的Koa和Hapi两个框架。

  本文的目的并不是计划去说服人人去使用其中的任何一款框架,而是希望能够辅助人人去对比剖析这三个框架的优劣势。

2、框架靠山

  今天我们对比的这三款框架实在都有许多的共通点。好比他们都可以几行代码就能建立一个服务,而且举行REST API的开发也是小菜一碟。下面我们就划分来看这三款框架吧。

2.1、Express

  2009年6月26日,TJ Holowaychuk 第一次提交了Express的代码。在2010年1月2日,Express正式公布了0.0.1版本,停止那时,作者已经提交了跨越660次代码。那时Express的两位主要开发维护者划分是TJ 以及 Ciaron Jessup。第一版公布的时刻,Express在Github的readme.md先容文件中式这么形貌这块框架的:

一款基于node.js以及Chrome V8引擎,快速、极简的JS服务端开发框架。 

  5年多后今天,Express现在已经公布到4.10.1版本,提交跨越4925次代码,现在主要是接纳StrongLoop举行开发维护,由于TJ同砚已经转入GO语言开发社区了。

2.2、Koa

  Koa是在一年以前也就是在2013年8月17日由TJ同砚(是的,照样他...)首次提交的代码。他那时是这么形貌Koa的:“更具有表现力,更结实的Node.js中间件。基于co组件的generators处置异步回调,无论是Web应用照样REST API开发,你的代码都将变得加倍优雅”。(注:Koa2公布后,已经放弃了引入co组件,而是最先接纳ES7的async/await语法处置异步回调)。轻量化的Koa号称不跨越400行代码。(注:SLOC是源代码行数,又分为物理代码行数LOC,以及逻辑代码行数LLOC)。停止现在,Koa已经公布了0.13.0版本,跨越585次的代码提交。

2.3、Hapi

  Hapi是由来自于沃尔玛实验室的Eran Hammer同砚在2011年8月5日首次提交的。原本他只是Postmile(这是一款在node.js上开发的协作列表工具,服务端由Hapi完成的一个焦点部件,同样也是基于Express开发。厥后Hapi才被自力出来作为一款框架举行开发维护,Eran同砚在他的博客里这样说道:

  “Hapi的焦点头脑是设置优于代码,以是营业代码必须从传输层中剥离出来”

  至今为止,Hapi已经提交跨越3816次代码,版本是7.2.0,当前仍然是由Eran Hammer举行主要开发维护。

  OK,最后让我们来通过社区的统计数据来看看这三个框架的活跃水平:

  

参考项

Express.js

Koa.js

Hapi.js

Github点赞数

16158

5846

3283

代码孝敬者

163

49

95

依赖包数目

3828

99

102

StackOverFlow提问数

11419

72

82

3、建立服务 

  基本上每个刚最先接触Node.js的开发者第一步操作就是建立一个服务。由于下面我们将依次使用每个框架来划分建立一个服务,来看看他们之间的相似处与差别的地方。

3.1、Express 

var express = require('express');
var app = express();

var server = app.listen(3000, function() {
    console.log('Express is listening to http://localhost:3000');
}); 

  上面的操作对于大多数Node开发者来说应该都是很熟练了。我们先引入express,然后建立一个实例工具并将其赋值给变量app。接下来是实例化一个服务,而且最先监听3000端口。app.listen() 实在就是对nodejs原生的http.createServer()举行了一层封装。

3.2、Koa 

 
var koa = require('koa');
var app = koa();

var server = app.listen(3000, function() {
    console.log('Koa is listening to http://localhost:3000');
}); 
 

  显而易见,Koa的语法和Express异常相似。实在来说你只需要将引入express修改为引入koa即可。同样的,app.listen() 也是对http.createServer()举行了一层封装。

3.3、Hapi 

 
var Hapi = require('hapi');
var server = new Hapi.Server(3000);

server.start(function() {
    console.log('Hapi is listening to http://localhost:3000');
});
 

  Hapi的语法对照稀奇一些。不外,第一步照样引入hapi,然则这里是实例化存入一个hapi app变量中,然后就可以建立一个指定端口的服务了。在Express和Koa中这一步我们获得的是一个回调函数,然则Hapi返回的是一个server工具。一旦我们通过server.start()来挪用这个在3000端口的服务以后,他将会返回一个回调函数。然后跟Koa和Express不一样的地方在于,这个回调并不是对http.CreateServer()举行的一层封装,而是Hapi自己实现的逻辑。

4、路由

  接下来我们继续深入领会作为一个服务的一个重���功效,那就是路由。第一步我们将使用每个框架来划分建立一个“Hello World”应用,然后再继续关注一些更适用的功效,REST API。

4.1 Hello World

4.1.1  Express

var express = require('express');
var app = express();

app.get('/', function(req, res) {
    res.send('Hello world');
});

var server = app.listen(3000, function() {
    console.log('Express is listening to http://localhost:3000');
});

  我们使用get()方式来捕捉“GET /”请求,然后挪用一个回调函数来处置请求,该回调函数拥有两个参数:req与res。在这个例子中我们仅仅使用了res的res.send()方式来向页面返回一个字符串。Express包罗了许多内置的方式来处置路由功效。下面是几个Express中常用的方式(只是部门,并不是所有方式):get, post, put, head, delete…

4.1.2 Koa 

var koa = require('koa');
var app = koa();

app.use(function *() {
    this.body = 'Hello world';
});

var server = app.listen(3000, function() {
    console.log('Koa is listening to http://localhost:3000');
});
 

  Koa和Express有些许的差别之处,由于他使用了ES6 的generators语法。(注:generators是ES6提出的一种异步回调的解决方式,在ES7中将直接升级为async/await)在方式前面加上一个 * 示意该方式返回一个generator工具。generators函数的作用就是使得异步函数发生一些同步的值,然则这些值仍然是在当前的请求局限之类。(注:generator对通过yield 界说差别的状态值,return也算是一个状态值。generator函数对响应体举行赋值。在Koa中this工具,实在就是对node的request与response工具举行的封装。this.body在Koa中是一个响应体工具的方式。它基本上能被赋值为任何值,字符串、buffer、数据流、工具或者是null。Koa焦点库提供了许多中间件,这里我们只是使用了其中的一个,这个中间件可以捕捉所有的路由,然后响应一个字符串。

4.1.3 Hapi

 
var Hapi = require('hapi');
var server = new Hapi.Server(3000);

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

server.start(function() {
    console.log('Hapi is listening to http://localhost:3000');
});

  这里我们使用了由server工具提供的一个内置方式:server.route(),这个方式需要这些参数:path(必填)、method(必填)、vhost以及handler(必填)。这个HTTP方式可以处置我们常见的GET/PUT/POST/DELETE请求,也可以使用*来处置所有路由请求。回调函数会被Hapi默认传入request工具以及reply方式,reply是必须被执行的方式,而且需要传入一项数据,这个数据可以是字符串、序列化的工具或者流。

4.2 REST API

  Hello World程序从来都没有太多的期望,由于它只能展示建立及运行一个应用最基本最简朴的操作。REST API几乎是所有大型应用程序所必须的一个功效,同时对于我们更好的明白这些框架有很大的辅助。因此接下来我们将看看这几个框架是若何来处置REST API。

4.2.1 Express 

var express = require('express');
var app = express();
var router = express.Router();    

// REST API
router.route('/items')
.get(function(req, res, next) {
  res.send('Get');
})
.post(function(req, res, next) {
  res.send('Post');
});

router.route('/items/:id')
.get(function(req, res, next) {
  res.send('Get id: ' + req.params.id);
})
.put(function(req, res, next) {
  res.send('Put id: ' + req.params.id);
})
.delete(function(req, res, next) {
  res.send('Delete id: ' + req.params.id);
});

app.use('/api', router);

// index
app.get('/', function(req, res) {
  res.send('Hello world');
});

var server = app.listen(3000, function() {
  console.log('Express is listening to http://localhost:3000');
});

  我们在现有的Hello World程序上增加了REST API。Express提供了一些缩写的方式来处置路由。这是Express 4.x 版本的语法,实在跟Express 3.x 版本差不多,同样希望你不再使用express.Router()方式,而是换成新的API:app.use('/api', router)。新的API可以让我们使用app.route()来替换之前的router.route(),固然了需要添加一个形貌性的动词/api.这是一个不错的修改,由于降低开发者泛起错误的机遇,同时对原有的HTTP方式举行了最小的一个修改。

4.2.2 Koa    

var koa = require('koa');
var route = require('koa-route');
var app = koa();

// REST API
app.use(route.get('/api/items', function*() {
    this.body = 'Get';
}));
app.use(route.get('/api/items/:id', function*(id) {
    this.body = 'Get id: ' + id;
}));
app.use(route.post('/api/items', function*() {
    this.body = 'Post';
}));
app.use(route.put('/api/items/:id', function*(id) {
    this.body = 'Put id: ' + id;
}));
app.use(route.delete('/api/items/:id', function*(id) {
    this.body = 'Delete id: ' + id;
}));

// all other routes
app.use(function *() {
  this.body = 'Hello world';
});

var server = app.listen(3000, function() {
  console.log('Koa is listening to http://localhost:3000');
}); 

  很明显,Koa并不能像Express那样去降低route动词的重复性。它同时还需要引入一个自力的中间件来处置路由。我选择使用koa-route,是由于他主要是由Koa小组来开发维护,固然也另有许多其他开发者孝敬的路由中间件可以选择。从方式名的关键字上来看,koa的路由和express也是异常相似的,例如.get(), .put(), .post(), 以及 .delete()。

  Koa在处置路由有一个优势,它使用了ES6 的generator函数,从而降低了回调函数的庞大度。

4.2.3  Hapi 

var Hapi = require('hapi');
var server = new Hapi.Server(3000);

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);
    }
  },
  {
    method: 'GET',
    path: '/',
    handler: function(request, reply) {
      reply('Hello world');
    }
  }
]);

server.start(function() {
  console.log('Hapi is listening to http://localhost:3000');
});

   跟其他框架相比,Hapi的路由设置给人的第一印象就是代码清新,可读性高。甚至连必填的设置参数method,path,hanlder以及reply都异常容易鉴别。跟Koa一样,Hapi路由的代码重复性也对照高,以是失足的几率也对照大。之所有这么做,是由于Hapi更希望使用设置来完成路由,这样我们的代码会更清新,在小组内也会更容易的维护。Hapi同样试图去提高代码错误处置能力,由于有的时刻他甚至不需要开发者编写任何代码(注:意思是完全都过设置实现,回调函数也是用默认的。这样失足的 概率就了许多,也更容易上手)。若是你试图去接见一个没有在REST API中界说的路由,那么Hapi将会返回一个包罗状态值与错误信息的JSON工具。

5、优劣势 

5.1 Express

5.1.1 优势

  Express拥有最大社区,比仅仅是跟这三个框架相比,而是对于所有的Nodejs框架来说也是最大的。现在来说,他是最为三者中最为成熟的框架,靠近5年的开发投入,同时还接纳了StrongLoop(注:StrongLoop是一个历程治理工具,提供CLI与UI界面。)对线上堆栈的代码举行治理。他提供了一种简朴的方式来建立和运行一个服务,同时路由的内置也使得代码获得了重复使用。

5.1.2 劣势

  在使用Express过程中,我们往往要处置许多单调乏味的义务。好比他没有内置的错误处置机制,另外对于同样一个问题可以有许多中间件来供选择,这也使得开发者容易迷失在中间件的选择中,总而言之就是,一个问题你会有N多解决方案。Express声称自己是可设置选择的,这实在不没有好或欠好,然则对于一个刚刚接触Express的开发者来说,这就是他的劣势了。另外,Express跟其他的框架相比也另有很大的差距。

5.2 Koa

5.2.1 优势

  Koa的一个小提高就是他的代码对照富有表现力,开发中间件也比其他框架更容易得多。Koa是一个很基础的准系统框架,开发者可以选择(或开发)他们所需要的中间件,而不是去选择Express或Hapi的中间件。他同时也是三者中唯一一个努力拥抱ES6的框架,好比接纳了ES6 generators函数。

5.2.2 劣势 

  现在Koa还处于不稳定版本,还处在开发阶段。使用ES6举行开发的确是处于领先水平,好比Koa需要基于Nodejs 0.11.9以上的版本运行,而现在nodejs的文本版本是0.10.33。这是一件可以算作好也可以算作欠好的事情,就像Express开发者有许多中间件要选择甚至自己开发中间件一样。好比我们在上面看到的一样,对于路由来说就有许多中间件供我们选择。

5.3 Hapi

5.3.1 优势

   Hapi一直很自豪的说他们的框架是设置优于代码,固然也有许多开发者可能会质疑把这一点算作是优势。但这一点对于大型项目组来说,的确是可以保持代码的统一性以及代码复用性。另外这款框架是由沃尔玛实验室支持的,也有许多大公司在线上环境使用Hapi,解释他已经通过了严重的测试,由于这些公司会思量得更多才会使用Hapi来运行他们的项目。因此所有的这些迹象都解释Hapi正在朝一个伟大的框架生长。

5.3.2 劣势

   Hapi的定位更倾向于大型或庞大的应用程序。对于一个简朴的应用来说,Hapi在代码上反而有些显得冗余了,另外现在Hapi所提供的样例程序也对照少,使用Hapi举行开发的开源应用同样很少。因此,若是选择Hapi的话,你可能要投入更多精神举行开发,而不是简朴的挪用一个第三方中间件。

6、总结

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)