Koa 本身极简、不捆绑任何中间件,这既是优点也是挑战。本专题把它放进 Node Web 生态里横向对比,帮助你基于团队与技术栈做出合理选型。
| 维度 | Express | Koa | Fastify | Egg | NestJS |
|---|---|---|---|---|---|
| 定位 | 快速、生态大 | 极简、洋葱模型 | 高性能 | 企业级约定 | 企业级、TS 一统 |
| 中间件模型 | 线性 | 洋葱(双向) | 生命周期钩子 | 洋葱(基于 Koa) | 依赖注入 + 模块 |
| 异步 | 5.x 原生 | async/await | async/await | async/await | async/await + RxJS |
| 路由 | 内置 | 中间件 @koa/router | 内置(Radix Tree) | 约定式 | 装饰器式 |
| 校验/序列化 | 无内置 | 无内置 | 内建 JSON Schema | 可通过插件 | class-validator + 管道 |
| TypeScript | 需自配 | 需自配 | 优秀 | 一般 | 一等公民 |
| 学习成本 | 低 | 低-中 | 中(封装概念) | 中(约定多) | 中高 |
| 生态 | 最大 | 大 | 中且快 | 中 | 中且快 |
@koa/router;Express 内置路由。✅ 追求极简与可控、愿意自行组合中间件 ✅ 团队偏好 async/await 之间的洋葱写法 ✅ 中小型 API、内部服务、脚手架 ⚠️ 需要大而全的「开箱即用」时,Koa 会让你做更多集成工作
| 场景 | 推荐 |
|---|---|
| 快速开发、生态兜底 | Express |
| 轻量 API、可控中间件 | Koa |
| 高并发、性能敏感 | Fastify |
| 企业规范、约定统一、需多进程开箱 | Egg |
| 大型复杂、TS/依赖注入、长期演进 | NestJS |
案例:Koa 常被高层框架(如部分 Serverless 方案、Egg 底层、某些 SSR 服务)作为 HTTP 内核复用,本身位置在「底层基建」与「可直接开发」之间。
Koa 极简意味着上手前需补齐常见能力,推荐组合:
const Koa = require("koa");
const Router = require("@koa/router");
const bodyParser = require("koa-bodyparser");
const cors = require("@koa/cors");
const logger = require("koa-logger");
const helmet = require("koa-helmet");
const serve = require("koa-static");
const app = new Koa();
const router = new Router();
app.use(helmet());
app.use(logger());
app.use(bodyParser());
app.use(cors());
app.use(serve("public"));
router.get("/", async (ctx) => (ctx.body = { status: "ok" }));
app.use(router.routes()).use(router.allowedMethods());这套「最小可用集」即可支撑一个结构化服务,后续按需加入 JWT、Redis、数据库等中间件。
选型本质是「团队约束 + 场景约束」的权衡:Koa 是一把趁手的精简手术刀,适合愿意亲手装配、追求控制力的中小规模服务。若需要更规范的团队开发,应上探 Egg/NestJS;若瓶颈是性能,Fastify 是更优锋。