面試官:Next.js 的 API 路由與傳統(tǒng)的 Express.js 路由有什么區(qū)別?
Next.js 14/15 版本的 API 路由 與傳統(tǒng)的 Express.js 路由 在架構(gòu)、運(yùn)行環(huán)境和使用方式上有所不同。以下是核心區(qū)別:
1. 運(yùn)行環(huán)境
對(duì)比項(xiàng) | Next.js API 路由 | Express.js 傳統(tǒng)路由 |
運(yùn)行方式 | Serverless / Edge Functions(默認(rèn)) | 傳統(tǒng) Node.js 服務(wù)器 |
是否需要服務(wù)器 | 無需手動(dòng)管理服務(wù)器 | 需要手動(dòng)創(chuàng)建 express() 實(shí)例 |
可運(yùn)行環(huán)境 | Vercel Edge, Serverless, Bun, AWS Lambda | 僅限 Node.js 服務(wù)器 |
適合場(chǎng)景 | 低延遲 API、Serverless 環(huán)境 | 完整控制,適用于大型后端應(yīng)用 |
總結(jié):Next.js API 路由更適合 Serverless 和 Edge 環(huán)境,而 Express.js 適用于傳統(tǒng)服務(wù)器。
2. API 路由定義
Next.js API 路由(基于文件系統(tǒng)路由)
- 在 app/api/route.ts 或 pages/api/*.ts 下定義 API
- 無需 express(),自動(dòng)處理路由
Next.js 14/15(App Router)
// app/api/hello/route.ts
import { NextResponse } from "next/server";
export async function GET() {
return NextResponse.json({ message: "Hello, Next.js API!" });
}
訪問 URL
GET /api/hello # 自動(dòng)映射到 app/api/hello/route.ts
Express.js 傳統(tǒng) API 路由
- 需要手動(dòng) app.get(), app.post()。
- 必須運(yùn)行在 Node.js 服務(wù)器上。
Express 方式
import express from "express";
const app = express();
app.get("/api/hello", (req, res) => {
res.json({ message: "Hello, Express API!" });
});
app.listen(3000, () => console.log("Server running on port 3000"));
訪問 URL
GET /api/hello
區(qū)別
- Next.js 直接使用文件系統(tǒng)路由,無需 app.get() 等手動(dòng)定義。
- Express 需要手動(dòng)管理服務(wù)器、請(qǐng)求、響應(yīng)。
3. 處理請(qǐng)求 & 響應(yīng)
Next.js API(app/api/route.ts,基于 NextResponse)
export async function POST(req: Request) {
const data = await req.json();
return NextResponse.json({ received: data });
}
Express.js API(基于 req, res)
app.post("/api/data", (req, res) => {
res.json({ received: req.body });
});
區(qū)別
- Next.js API 直接處理 Request 對(duì)象(與 Web 標(biāo)準(zhǔn) fetch API 一致)。
- Express API 需要 req, res 處理。
- Next.js NextResponse 提供更強(qiáng)的 headers, cookies API。
4. 服務(wù)器管理
Next.js API(Serverless & Edge)
export const config = {
runtime: "edge", // 運(yùn)行在 Edge Functions
};
Express.js API(Node.js Server)
app.listen(3000, () => console.log("Server running"));
區(qū)別
- Next.js API 默認(rèn) Serverless,不需要 listen()。
- Express.js 需要手動(dòng) listen()。
5. 性能 & 緩存
Next.js API
- 默認(rèn)支持 Serverless,每次請(qǐng)求執(zhí)行。
- 支持 Edge Functions(更快的 API 響應(yīng))。
- 支持 緩存優(yōu)化(revalidatePath())。
Express.js API
- 運(yùn)行在 長(zhǎng)期運(yùn)行的 Node.js 服務(wù)器。
- 需要手動(dòng)管理緩存(Redis, CDN)。
區(qū)別
- Next.js API 適用于高并發(fā)、Serverless 場(chǎng)景。
- Express 適用于長(zhǎng)時(shí)間運(yùn)行的后端服務(wù)。
總結(jié)
對(duì)比項(xiàng) | Next.js API 路由 | Express.js 傳統(tǒng)路由 |
運(yùn)行環(huán)境 | Serverless / Edge Functions | 傳統(tǒng) Node.js 服務(wù)器 |
是否需要手動(dòng)管理服務(wù)器 | 不需要 | 需要 |
路由方式 | 基于文件系統(tǒng) (app/api/route.ts) | 需要手動(dòng) app.get() |
處理 HTTP 請(qǐng)求 | NextRequest , NextResponse | req , res |
是否支持 Edge | 支持(更快響應(yīng)) | 僅支持 Node.js |
適用場(chǎng)景 | 高并發(fā)、無服務(wù)器、Vercel、Serverless | 復(fù)雜后端,傳統(tǒng) API 服務(wù)器 |
一句話總結(jié) Next.js API 路由適用于 Serverless & Edge 環(huán)境,而 Express.js 適用于完整控制的后端服務(wù)器!