最近在出一个前端的体系课程,里面的内容非常详细,如果你感兴趣,可以加我 v 进行联系 yunmz777
:

浪费你几秒钟时间,内容正式开始
对于 Web 开发者来说,Node.js 提供了一个极具吸引力的后端平台,凭借其事件驱动、非阻塞的特性,广泛应用于各种场景:从构建简单 API 到支撑高并发的微服务系统。
然而,随着业务的发展,你会逐渐发现一个问题:
不同规模的项目,对框架与架构的要求截然不同。
- 小项目用原生 HTTP 模块或 Express 足够快速灵活
- 中型项目开始面临路由混乱、业务逻辑耦合、难以测试的问题
- 企业级项目则需要模块化架构、依赖注入、自动化测试支持,甚至微服务解耦能力
NestJS 作为一款基于 TypeScript 构建的企业级 Node.js 框架,正是为了解决这些问题而生。
本文将通过一个渐进式过程,从原生 HTTP、Express,再到 NestJS,帮助你逐步建立后端开发的系统理解与实战能力。
一、使用 Node.js 原生 HTTP 模块搭建服务器
Node.js 自带的 http
模块可以快速启动一个服务器,非常适合初学者理解底层原理:
js
const http = require("http");
const server = http.createServer((req, res) => {
if (req.url === "/hello") {
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("Hello, Moment!");
} else {
res.writeHead(404);
res.end("Not Found");
}
});
server.listen(3000, () => {
console.log("Server running at http://localhost:3000/");
});
原生 HTTP 模块的优点在于快速上手且无需额外依赖,特别适合用于学习 HTTP 请求与响应机制。不过,它也存在一些明显的缺点,比如需要手动处理路由和状态码,不支持中间件机制,导致代码容易膨胀。随着功能的扩展,原始结构很难组织复杂的业务逻辑,进而让项目变得难以维护。因此,虽然原生模块功能强大,但在实际开发中并不适合作为长期方案。
二、Express
Express 它抽象了底层 HTTP 的繁琐细节,带来了中间件机制和清晰的路由定义,大幅提升了开发效率。Express 让"用 JavaScript 写后端"变得轻松可行,也由此开启了 Node.js 作为服务端技术栈的黄金时代。
js
const express = require("express");
const app = express();
app.get("/hello", (req, res) => {
res.send("Hello from Express!");
});
app.listen(3000, () => {
console.log("Express server running on http://localhost:3000/");
});
Express 拥有简洁的 API(如 app.get
、app.post
)和中间件机制,使得逻辑拆分变得简单,同时它还拥有丰富的生态和大量配套插件,非常适合用于快速开发 MVP。然而,它缺乏统一的架构规范,在大型项目中容易导致代码混乱。由于没有原生的依赖注入机制,服务之间的耦合度较高,而控制器、服务与路由的组织结构也多靠人为约定,难以标准化协作。当你想构建一个严谨、可维护的后端系统时,Express 往往显得力不从心。
三、Koa
Koa.js(2013 年发布)由 Express 的原班人马打造,被誉为 "Express 的精神继承者"。它的诞生是为了解决 Express 在中间件链处理上的混乱问题,同时原生支持 async/await
,让异步流程更加清晰、优雅。相比 Express,Koa 在现代 JavaScript 特性的应用上更为纯粹,也为构建更加简洁和可维护的服务提供了可能。
js
// Express 中间件(无法控制顺序灵活性)
app.use((req, res, next) => {
// do something
next();
});
// Koa 洋葱模型(可以前后包裹控制)
app.use(async (ctx, next) => {
console.log(">> start");
await next();
console.log("<< end");
});
Koa 的最大优势在于采用了洋葱模型的中间件机制,使中间件流程更加清晰可控,极大提升了代码的可维护性。它仅保留最基础的功能,其他如路由、body 解析等都以插件形式提供,提升了灵活性和可组合性。同时,Koa 原生支持 async/await
,让异步逻辑更优雅,整体设计也更贴近 Node.js 原生 HTTP 接口。
但缺点是它上手相对较难,对新手不太友好;由于功能插件化,开发者需要手动组装常用能力,初期搭建成本略高。此外,社区生态和文档相比 Express 稍显薄弱,对于追求开箱即用的项目来说可能不够理想。
四、fastify
Fastify(2017 年发布)由 Node.js 核心贡献者 Matteo Collina 发起,目标是构建一个"超快、插件化、类型安全"的下一代 Node.js Web 框架。它的出现是为了弥补 Express 在高并发场景下性能不足的问题,同时解决缺乏类型推导与内建 schema 校验支持的痛点。相比之下,Fastify 在日志记录、序列化、路由匹配等方面都提供了更精细的可配置能力,更适合构建现代、高性能的后端服务。
js
const fastify = require("fastify")();
fastify.get("/hello", async (request, reply) => {
return "Hello from Fastify!";
});
fastify.listen({ port: 3000 }, (err, address) => {
if (err) {
console.error(err);
process.exit(1);
}
console.log(`Fastify server running on ${address}`);
});
Fastify 拥有出色的性能表现,在 HTTP/1 场景下比 Express 快 2--4 倍,简单请求的每秒处理能力可达 65,000+,远超 Koa 和 Express。这得益于其底层对序列化流程的高度优化。
它原生支持 async/await
,并通过 JSON Schema 实现请求校验、类型推导以及自动生成 OpenAPI 文档,极大提升了开发效率与类型安全性。
此外,Fastify 拥有强大的插件系统,几乎所有功能模块都可按需集成,支持 TypeScript、Swagger、日志、JWT 等现代开发需求,真正做到了高性能与高可扩展性的平衡。
五、使用 NestJS 构建企业级项目:结构化才是王道
随着 Node.js 在企业级开发中的普及,传统框架如 Express 虽然灵活易用,却缺乏架构规范、模块化能力和类型安全支持,难以支撑复杂项目。Koa、Fastify 等虽然在性能和控制力上有所改进,但依然偏向"工具型框架",需要开发者自行组织项目结构。NestJS 的出现,就是为了解决这一痛点------它融合了 Angular 风格的模块化架构、依赖注入(DI)机制和强类型 TypeScript 支持,为大型、可维护、可测试的服务端应用提供了完整的开发范式。简而言之,NestJS 是"为企业级 Node.js 项目而生"的架构化解决方案。
ts
// hello.controller.ts
import { Controller, Get } from "@nestjs/common";
@Controller("hello")
export class HelloController {
@Get()
sayHello(): string {
return "Hello from NestJS!";
}
}
这一结构明确区分了请求入口(Controller)与业务逻辑(Service),再搭配模块进行组织,大型项目也能井井有条,这才是真真正正的 spring.js
。
NestJS 提供了清晰的模块化架构,能够将控制器、服务、业务逻辑分层组织,便于团队协作与代码维护。它内建依赖注入机制(DI),提升了代码的可测试性与解耦能力。基于 TypeScript 构建,NestJS 拥有强类型支持与现代开发体验。同时,它原生支持中间件、守卫、拦截器等高级特性,灵活应对各种业务需求。更重要的是,它扩展性强,可无缝集成微服务、GraphQL、WebSockets 等现代后端技术栈。
总结
在 Node.js 后端开发的演进中,原生 http
模块奠定了最底层的通信基础,但开发效率低、缺乏结构,仅适合教学和理解原理。
Express 作为最早普及的 Web 框架,以简洁路由和中间件机制迅速成为事实标准,适合中小型项目和快速开发。
Koa 则是 Express 团队的重构尝试,引入 async/await
和洋葱模型中间件,让异步处理更加优雅、控制更灵活。
Fastify 聚焦于性能优化,具备出色的吞吐能力和插件化设计,是高并发接口、微服务网关的理想选择。
而 NestJS 则在这些框架基础之上构建出完整的企业级架构,提供模块化、依赖注入、类型安全、测试友好等特性,特别适合中大型项目和多团队协作开发。整体来看,这些框架各有所长,从轻量快速到结构清晰,开发者可根据项目规模与复杂度选择最合适的工具。