Koa 与 Express 的比较:多数场景下选择 Express 就对了

6,878 阅读4分钟

原文地址:Koa vs Express,2020.12.10, from stackchief.com

Koa 是 Express 的轻量级版本。它是一个中间件框架,没有像 Express 那样的额外模块(比如,没有内置路由和模板引擎)。

Koa 由与 Express 相同的团队开发。事实上,许多人认为 Koa 是“Express 5.0”,因为它的开发很大程度上是最初 Express 的所有权问题导致(请参见 Reddit)。

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.methodreq.headers() 这样的内容,并向 http res 对象添加 res.sendFile()

Koa 是 NodeJS 的一个中间件框架。Koa 使用自己的上下文(ctx)替换或提取 Node 的 reqres 对象属性。

例如,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 能够实现完全一样的功能。