❝
原文地址:Koa vs Express[1],2020.12.10, from stackchief.com
❞
Koa 是 Express 的轻量级版本。它是一个中间件框架,没有像 Express 那样的额外模块(比如,没有内置路由和模板引擎支持)。
Koa 由与 Express 相同的团队开发。事实上,许多人认为 Koa 是“Express 5.0”,因为它的开发很大程度上是最初 Express 的所有权问题导致(请参见 Reddit[2])。
Koa 利用 async
/await
编写更清晰的代码。虽然最初 Koa 有助于避免“回调地狱”,但自 Node 7 发布以来,Koa 和 Express 语法之间的差异更小了…
使用 Express 进行基本路由
const express = require('express')
const app = express()
const asyncActivity = async () => {
return { success: true }
}
const asyncWrapper = fn => (...args) => fn(...args).catch(args[2])
app.get('/', asyncWrapper(async (req, res, next) => {
const result = await asyncActivity()
res.json(result)
}))
app.use(function errorMiddleware(error, req, res, next) {
res.status(500)
res.send(error)
})
使用 Koa 进行基本路由
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
const asyncActivity = async () => {
return { success: true }
}
app.use(async function handleError(context, next) {
// 调用下一个中间件
try {
await next()
} catch (error) {
// 捕捉可能发生的任何错误
context.status = 500
context.body = error
}
})
app.use(router.routes())
app.use(router.allowedMethods())
router
.get('/', async (context, next) => {
const result = await asyncActivity()
context.body = result
})
app.listen(3000)
从这些例子中,您会注意到使用 Koa 可以节省一些样板代码。具体来说,你不用编写一个 asyncWrapper()
函数。
与 Express 不同,Koa 默认情况下不包括路由模块,你需要单独引入 koa-router
包用来定义路由。
Koa 与 Express:主要区别
中间件链接方式
Express 中间件链是基于回调的,而 Koa 的则是基于 Promise
的。这就是为什么我们在 Express 中最后定义 errorMiddleware
,在 Koa 中首先定义 handleError
。
增强 Node vs 替换 Node
Express 是 NodeJS 的一个 Web 框架。它通过为 Node 的 req
和 res
对象添加有用的方法和属性来增强其功能。
例如,Express 会向 http req
对象添加像 req.method
和 req.headers()
这样的内容,并向 http res
对象添加 res.sendFile()
。
Koa 是 NodeJS 的一个中间件框架。Koa 使用自己的上下文(ctx
)替换或提取 Node 的 req
和 res
对象属性。
例如,context.body = result
可以为请求设置响应体。
更加轻量
Koa 比 Express 更轻量级。Koa 不像 Express 那样包含路由器或视图引擎模块。这些模块是单独存在的,可以很容易地被包含进来。在我们的示例中,你会注意到我们必须为 Koa 实例单独包含 koa-router
,而Express 中已经内置这个功能。
与 Express 不同的是,Koa 默认情况下不支持路由、模板引擎、发送文件、JSONP 等功能。
没那么流行(正在增长)
Express 比 Koa 受欢迎多了。虽然 Koa 的流行度在增长,但是 Express 仍然是事实上的 Web 应用程序框架,每周下载量超过 1100 万次。
这意味着你会在 Express 上找到比 Koa 更多的文档。NodeJS 开发人员更有可能在项目中使用经验丰富的Express 而不是 Koa。
更简洁的语法
Koa 利用生成器函数和 async
/await
实现更清晰的代码。虽然这有助于避免在 Express 中常见的“回调地狱”问题,但在 Node v7+ 中 async
/await
与 Express 一起配合使用时,问题并没那么明显。
什么时候用 Express
-
如果你的应用程序是基于浏览器的,并且需要支持路由和模板,请使用 Express。 -
如果你的开发团队是新手,并需要社区提供更多支持/文档,请使用 Express。
什么时候用 Koa
-
当你的应用程序不是基于浏览器且不需要路由和模板支持时,请使用 Koa。 -
如果你强调性能(更轻量级),请使用 Koa。虽然性能提升可能微不足道,但在某些测试条件下,Koa已被证明比 Express 略快。
总结
请记住,开发 Express 和 Koa 的是同一拨开发人员。Koa 只是 Express 的一个更轻量级的版本,没有内置提供路由和模板引擎等功能。
相比于 Koa,Express 更加成熟。它的社区更为稳定,并且你可以在 Express 上找到比 Koa 更多的文档和示例。
虽然使用 Koa 可以使编写中间件更加简洁,但是使用 Express 结合 async
/await
也可以避免“回调地狱”并实现类似的语法。
总之,就是 Express 和 Koa 能够实现完全一样的功能。
参考资料
Koa vs Express: https://www.stackchief.com/blog/Koa%20vs%20Express%20#
[2]
Reddit: https://www.reddit.com/r/node/comments/8iz642/should_i_be_using_koa_over_express/
原文始发于微信公众号(写代码的宝哥):Koa 与 Express 的比较:多数场景下选择 Express 就对了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244037.html