Appearance
从原生到框架的思维过渡
学完原生 HTTP 和框架,我们来回顾整个演进过程,建立清晰的技术认知。
演进路径
原生 http 模块
↓ 代码重复
封装路由器
↓ 逻辑耦合
引入中间件
↓ 功能完善
Express/Koa核心问题的解决
问题一:路由管理
原生写法
javascript
if (req.url === '/users' && req.method === 'GET') {
// 处理逻辑
} else if (req.url.startsWith('/users/') && req.method === 'GET') {
const id = req.url.split('/')[2];
// 处理逻辑
}Express 写法
javascript
app.get('/users', listUsers);
app.get('/users/:id', getUser);本质:把路由匹配从业务代码中抽离,声明式定义路由。
问题二:请求解析
原生写法
javascript
const chunks = [];
req.on('data', chunk => chunks.push(chunk));
req.on('end', () => {
const body = Buffer.concat(chunks).toString();
const data = JSON.parse(body);
// 处理逻辑
});Express 写法
javascript
app.use(express.json());
app.post('/users', (req, res) => {
const data = req.body; // 直接可用
});本质:通过中间件预处理请求,让处理函数专注业务。
问题三:响应构建
原生写法
javascript
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ success: true }));Express 写法
javascript
res.json({ success: true });本质:封装常用操作,减少重复代码。
问题四:代码复用
原生写法
javascript
// 每个路由都要写
const token = req.headers['authorization'];
if (!token) {
res.statusCode = 401;
res.end('Unauthorized');
return;
}中间件写法
javascript
app.use(authMiddleware); // 一次注册,所有路由生效本质:横切关注点通过中间件集中处理。
框架做了什么
框架的价值在于:
- 约定优于配置:统一的代码组织方式
- 常用功能内置:路由、静态文件、错误处理
- 扩展机制:中间件、插件系统
- 社区生态:大量现成的中间件
何时用原生
原生 http 适合:
- 简单场景:健康检查、webhook 接收
- 学习目的:理解底层原理
- 极致性能:每一行代码都可控
- 特殊需求:框架无法满足的场景
何时用框架
框架适合:
- 业务应用:CRUD、API、Web 站点
- 团队协作:统一规范,降低学习成本
- 快速开发:利用现成中间件
- 长期维护:代码结构清晰
常见误区
误区一:框架封装了性能
框架本质是代码组织工具,性能开销很小。真正的性能瓶颈通常是:
- 数据库查询
- 网络 I/O
- 业务逻辑
误区二:必须精通原生才能用框架
可以先用框架,遇到问题再深入原理。但理解原生会帮助你:
- 调试疑难问题
- 做出更好的技术决策
- 编写自定义中间件
误区三:Express 和 Koa 差别很大
核心思想相同,都是中间件模式。差别主要在:
- Koa 用 async/await
- Koa 用 ctx 统一上下文
- Koa 核心更精简
技术选型建议
小型项目
javascript
// 直接用 Express,开箱即用
const express = require('express');
const app = express();
app.use(express.json());
// ... 路由
app.listen(3000);中型项目
project/
├── src/
│ ├── routes/
│ ├── middlewares/
│ ├── controllers/
│ └── app.js
├── package.json
└── README.md大型项目
考虑更完整的框架:
- NestJS:TypeScript + 依赖注入 + 模块化
- Fastify:高性能 + 插件系统
- Hono:轻量 + 多运行时支持
从前端到后端的思维转变
状态管理
前端:组件状态、全局 Store 后端:无状态设计,状态存数据库/缓存
错误处理
前端:try-catch + 用户提示 后端:中间件统一捕获 + 日志记录 + 监控告警
安全意识
前端:XSS 防护 后端:SQL 注入、权限验证、输入校验、速率限制
性能考量
前端:渲染性能、包体积 后端:并发处理、数据库优化、缓存策略
后续学习路径
HTTP 基础(已完成)
↓
数据库集成
↓
认证与授权
↓
API 设计
↓
测试与部署本章小结
- 框架是对原生能力的封装和组织
- 理解演进过程,才能灵活应对变化
- 选择框架要考虑团队、项目规模、长期维护
- 原生知识是调试和优化的基础
- 后端思维关注无状态、错误处理、安全性
至此,你已经具备了构建 HTTP 服务的基础能力。在后续章节中,我们将深入命令行工具开发。