Fastify 和 Express 深度对比:该不该换框架?
Fastify 性能领先、内置校验与日志,Express 生态无敌、简单自由。本文从路由、性能、插件、错误处理、TypeScript 支持全面对比,附迁移路径。
Fastify 在框架开销控制、内置 JSON Schema 校验、结构化日志、TypeScript 支持上全面现代化;Express 胜在生态规模与极简心智。新项目、性能敏感、API 密集选 Fastify;存量 Express 应用没有性能痛点不必强迁。
设计哲学的分野
Express(2010)的极简主义:框架只给路由+中间件,其余一切自选。Fastify(2016)的"有主见的快":JSON Schema 内建于路由、序列化走编译优化路径、插件有作用域隔离、内置 pino 日志。Express 给你自由,Fastify 给你答案。
路由与校验
// Express:校验自己装
app.post('/users', (req, res) => {
const { error } = schema.validate(req.body);
if (error) return res.status(400).json(error);
// ...
});
// Fastify:Schema 即路由配置
fastify.post('/users', {
schema: {
body: {
type: 'object',
required: ['name', 'email'],
properties: { name: { type: 'string' }, email: { type: 'string', format: 'email' } }
}
}
}, async (request, reply) => {
// 进来就是合法数据
});
Fastify 的 Schema 还驱动响应序列化(fast-json-stringify,比 JSON.stringify 快)和自动 API 文档生成——一份 Schema 三份产出。
性能差距的真相
Fastify 对框架开销的优化包括:路由树预编译、Schema 编译序列化、更少的中间件开销。但请注意:真实业务瓶颈几乎都在数据库与外部调用——框架层差距只在高并发网关类场景成为决定性因素。为性能换框架之前,先确认瓶颈位置。
插件与钩子
Express 中间件是全局线性管道;Fastify 插件有封装作用域(register 形成独立上下文,插件间不污染),加上 onRequest/preHandler/onSend 等精细生命周期钩子,大型应用的可组合性明显更好。认证、多租户这类横切逻辑在 Fastify 里写得更优雅。
日志与错误处理
Fastify 内置 pino(结构化 JSON 日志,性能最好的 Node 日志库),请求日志自动携带请求 ID;Express 要自己接 morgan/winston 并手动串联。错误处理两者都支持集中式 handler,Fastify 的 setErrorHandler 可以按插件作用域分层设置。
迁移路径
路由层 API 形似(fastify.get/post 对 app.get/post),主要心智转换:req/res → request/reply、中间件 → 插件/钩子、res.json(data) → return data。官方有 fastify-express 兼容层过渡中间件,完整迁移指南见本系列《从 Express 迁移到 Fastify》。
常见问题(FAQ)
Q:Fastify 生态比 Express 小很多吗?
数量级差距存在但质量集中:认证、CORS、限流、Swagger、WebSocket 等核心需求都有官方/准官方插件。冷门需求确实可能要自己写插件——好在 Fastify 插件写起来规范且简单。
Q:Express 5 出来后差距还值得迁移吗?
Express 5 补上了异步错误处理,但性能、Schema 校验、结构化日志的差距依旧。迁移与否看这些特性对你的价值,而不是版本号。
Q:NestJS 和这两个什么关系?
NestJS 是上层架构框架,底层 HTTP 引擎可以选 Express 或 Fastify(一行配置切换)。想要分层架构选 NestJS,其中引擎档建议 Fastify。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。