Koa 简介与快速开始
🎯 引言
学完这篇文章,你能说清楚 Koa 是什么、它和 Express 有什么不同,还能亲手搭起一个 Koa 项目,让浏览器访问到你的第一个 hello world 页面。学完 Node.js 和 Express 之后,这是我们进阶后端框架的新一站。
🧱 什么是 Koa
Koa 是一个轻量的 Node.js Web 框架,它和 Express 出自同一支团队。团队在做 Express 时发现框架本身越来越重,于是重新设计了一个更精简的框架,这就是 Koa。
可以把 Express 和 Koa 想象成两种装修方案:Express 是“拎包入住的精装房”,路由、各种功能都内置好了;Koa 则是“硬装完毕的空房”,只提供了核心的请求处理能力,路由、请求体解析这些功能都需要你自己挑选中间件来装。房子虽小,但每一寸空间都由你掌控。
⚖️ Koa 与 Express 的区别
同样是写后端接口,两者有几个明显的差异:
| 对比项 | Express | Koa |
|---|---|---|
| 框架体积 | 内置路由等功能 | 核心精简,只处理请求响应 |
| 异步写法 | 基于回调 | 原生 async/await |
| 路由 | 内置 | 需安装 @koa/router |
| 请求处理 | req、res 两个对象 | 封装成单个 ctx 上下文对象 |
| 中间件模型 | 线性执行 | 洋葱模型(后面会专门讲) |
对初学者来说,记住一句话就够了:Express 开箱即用,Koa 更精简、写法更现代。上一门课程学的路由、中间件思想在 Koa 里完全通用,只是写法不同,所以学习成本很低。
🚀 初始化项目
新建一个文件夹 koa-demo,在终端进入该目录,初始化项目并安装 Koa:
mkdir koa-demo
cd koa-demo
npm init -y
npm install koa
本文及本课程的示例均基于 Node.js v22 LTS + Koa 3.2.1 编写和验证。Koa 3 全面拥抱 async/await,写法和旧版 Koa 2 基本一致,直接用新版即可。
为了使用 import 语法,在 package.json 中加一行 "type": "module":
{
"name": "koa-demo",
"version": "1.0.0",
"type": "module",
"dependencies": {
"koa": "^3.2.1"
}
}
🛠 Hello World
新建 app.js,写入下面的代码:
import Koa from 'koa';
const app = new Koa();
// 处理所有请求的中间件
app.use(async (ctx) => {
ctx.body = 'Hello Koa';
});
app.listen(3000, () => {
console.log('服务器已启动:http://localhost:3000');
});
逐行理解:
new Koa()创建一个 Koa 应用实例,相当于 Express 里的express()。app.use()注册中间件,每个请求进来都会经过它。回调里的ctx是上下文对象,封装了这次请求和响应的所有信息。ctx.body就是要返回给客户端的内容,直接赋值即可,不需要像原生 http 那样调用end()。app.listen(3000)监听 3000 端口,启动服务。
在终端运行:
node app.js
浏览器打开 http://localhost:3000,就能看到 Hello Koa 了。开发时也可以用 node --watch app.js,保存文件后自动重启服务器。
💡 ctx.body 能返回什么
ctx.body 非常智能,你赋什么类型的值,它就自动设置对应的响应格式:
app.use(async (ctx) => {
// 返回字符串
ctx.body = '你好,Koa';
});
app.use(async (ctx) => {
// 返回对象,自动转成 JSON,Content-Type 自动设为 application/json
ctx.body = { name: '小明', age: 18 };
});
对比一下之前用原生 http 写 JSON 接口的繁琐步骤:手动 JSON.stringify、手动设置 Content-Type。这些 Koa 都帮我们做了,而且返回中文也不会乱码,编码问题框架自动处理好了。
ctx.body = {...} 这一个赋值,就是我们用得最多的响应写法。🧾 小节总结
- Koa 是 Express 同一团队打造的轻量 Web 框架,核心精简,功能靠中间件扩展。
- 相比 Express,Koa 原生支持 async/await,用
ctx一个对象封装请求和响应。 - 初始化项目:
npm init -y加npm install koa,在package.json设置"type": "module"使用 ESM。 app.use()注册中间件,ctx.body赋值即返回内容,赋对象会自动转成 JSON。- 用
node --watch app.js启动开发,保存自动重启。
❓ 知识问答
Q1:学过 Express 还有必要学 Koa 吗?
有必要。两者思想相通,但 Koa 的 async/await 写法和洋葱模型更现代,很多新项目和框架(如一些 Node 服务端框架)都受它影响。学 Koa 能让你理解中间件更本质的运作方式。
Q2:Koa 没有内置路由,会不会很麻烦?
不麻烦。装一个官方路由库 @koa/router 就能用,写法和 Express 的路由几乎一样,后面会专门用一篇文章讲。
Q3:Koa 3 和 Koa 2 差别大吗?
日常写法基本一样,都是 async/await 风格。Koa 3 主要是内部升级、提高了 Node.js 版本要求,学习时直接用 Koa 3 即可。
Q4:ctx.body 赋了对象,响应头需要手动设置吗?
不需要。Koa 会根据值的类型自动设置 Content-Type,对象和数组会自动序列化为 JSON,这就是它比原生 http 方便的地方。
🧪 小练习
- 在你自己的 Koa 项目里,把返回内容改成一个 JSON 对象,包含你的名字和今天的日期。
import Koa from 'koa';
const app = new Koa();
app.use(async (ctx) => {
// 请在这里编写代码
});
app.listen(3000);
- 用浏览器访问
http://localhost:3000,确认能看到 JSON 格式的返回结果。
🎉 恭喜你已经跑通了第一个 Koa 应用!下一篇我们深入 Koa 最核心的对象:Context 上下文,看看 ctx 里到底装了哪些好用的东西。
