您想使用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?