Express 5 vs Fastify 对比

Node 生态的默认选择:灵活、成熟、中间件库庞大

VS
Fastify

Schema 驱动、以性能为核心:每个路由都是一份契约

10 分钟阅读Backend

快速结论

Fastify 官方(带"仅供参考"提示的)基准测试显示吞吐量领先 1.6 倍、延迟降低 1.7 倍,背后是 Schema 驱动的序列化和官方 OpenAPI 插件的支持。Express 5 的进步在于异步处理函数自动捕获错误。GitHub 上 Express 星标数遥遥领先(69,478 对 37,195)。新建的、对性能敏感的服务选 Fastify;已有 Express 代码库且团队熟悉 → 继续用 Express 5,官方没有提供迁移工具。

Express 5Fastify
阅读完整结论

评分对比

图表加载中…

详细评分

详细评分: Express 5 和 Fastify ——按类别打分,满分 10 分
分类Express 5Fastify
性能
6/10
9/10
学习难易度
9/10
7/10
生态系统
9/10
7/10
社区
10/10
7/10
就业市场
8/10
6/10
面向未来
7/10
8/10

优缺点

Express 5

优点

  • 中间件生态极其庞大——几乎任何需求都能找到现成的包
  • Express 5 中异步路由处理函数会自动捕获错误(相比 Express 4 是重大改进)
  • GitHub 上 69,478 星标,学习资源丰富,新手入门门槛低
  • 架构灵活:框架不强迫你使用固定结构,可以按自己的方式搭建
  • 官方提供 4→5 迁移代码模组(codemod),框架内部版本升级已自动化
  • 在 OpenJS Foundation 旗下拥有长期维护历史(自 2010 年起)

缺点

  • Schema 校验和 OpenAPI 生成不在框架内置功能中,必须依赖第三方包
  • 没有中间件隔离(encapsulation)——所有中间件都挂在全局栈上
  • 官方基准测试中吞吐量和延迟均落后于 Fastify
  • 官方包不含 TypeScript 类型定义,@types/express 是社区维护的独立包
  • 没有默认日志库——官方文档建议使用 Pino,但需要自行搭建

最适合

团队已经熟悉 Express 的项目需要丰富中间件多样性的应用快速原型开发和 MVP 构建维护现有的大型 Express 代码库非常看重学习资源丰富程度的团队

Fastify

优点

  • 官方基准测试中吞吐量领先 1.6 倍、延迟降低 1.7 倍(fastify.dev/benchmarks,2026 年 9 月 2 日)
  • 通过 fast-json-stringify 实现基于 Schema 编译的高性能 JSON 序列化
  • 封装上下文(encapsulation context)在架构层面保证插件/中间件隔离
  • 通过 @fastify/swagger 从路由 Schema 自动生成 OpenAPI v2/v3 文档
  • 框架内置基于 pino 的结构化日志(logger: true)
  • 官方类型定义(fastify.d.ts)内置在包中
  • 使用 Ajv v8 实现高性能、基于 JSON Schema 的请求校验

缺点

  • GitHub 星标/fork 数落后于 Express(37,195 对 69,478),学习资源相对较少
  • 官方文档承认部分 TypeScript API 可能类型标注有误
  • v5 要求 Node.js v20 以上——旧项目需要先升级 Node
  • v5 中强制要求完整 JSON Schema(移除了简写形式),带来迁移摩擦
  • 没有官方提供的 Express 迁移工具——迁移意味着更换框架

最适合

以性能为核心、追求高 RPS 的新服务API-first、一开始就需要 Schema/OpenAPI 契约的项目多团队协作、不断增长的 monorepo API,需要架构级隔离已有基于 pino 的结构化日志基础设施的团队运行在 Node.js v20+ 上的全新绿地项目

代码对比

Express 5
// Express 5 - 异步路由处理函数 + 自动错误捕获
import express from 'express';

const app = express();
app.use(express.json());

// 简单的错误类 —— 用于在 API 边界给出有意义的错误信息
class NotFoundError extends Error {
  status = 404;
}

async function getUser(id) {
  const user = await db.users.findById(id);
  if (!user) throw new NotFoundError('User not found');
  return user;
}

// Express 5:异步处理函数 reject 或 throw 时会自动调用 next(err)。
// 别忘了 return 这个 Promise —— 否则 rejection 可能变成 unhandled。
app.get('/api/users/:id', async (req, res) => {
  const user = await getUser(req.params.id);
  res.json(user);
});

// 集中式错误中间件 —— 添加在全局栈的末尾
app.use((err, req, res, next) => {
  const status = err.status ?? 500;
  res.status(status).json({ error: err.message });
});

app.listen(3000, () => {
  console.log('Express server listening on port 3000');
});
Fastify
// Fastify 5 - Schema 校验 + 自动序列化
import Fastify from 'fastify';

const fastify = Fastify({ logger: true });

// 响应 Schema:fast-json-stringify 会基于这个 Schema
// 编译出一个专用的序列化函数 —— 比通用的 JSON.stringify 更快。
const userSchema = {
  type: 'object',
  properties: {
    id: { type: 'string' },
    name: { type: 'string' },
    email: { type: 'string' },
  },
  required: ['id', 'name', 'email'],
};

const getUserOpts = {
  schema: {
    params: {
      type: 'object',
      properties: { id: { type: 'string' } },
      required: ['id'],
    },
    response: {
      200: userSchema,
    },
  },
};

// 封装隔离:在这个插件内注册的 hook/decorator
// 只会渗透到这个 context 下的路由。
fastify.register(async function userRoutes(instance) {
  instance.get('/api/users/:id', getUserOpts, async (request, reply) => {
    const user = await db.users.findById(request.params.id);
    if (!user) {
      return reply.code(404).send({ error: 'User not found' });
    }
    request.log.info({ userId: user.id }, 'user fetched');
    return user;
  });
});

fastify.setErrorHandler((error, request, reply) => {
  reply.status(error.statusCode ?? 500).send({ error: error.message });
});

await fastify.listen({ port: 3000 });

结论

Fastify 官方(带"仅供参考"提示的)基准测试显示吞吐量领先 1.6 倍、延迟降低 1.7 倍,背后是 Schema 驱动的序列化和官方 OpenAPI 插件的支持。Express 5 的进步在于异步处理函数自动捕获错误。GitHub 上 Express 星标数遥遥领先(69,478 对 37,195)。新建的、对性能敏感的服务选 Fastify;已有 Express 代码库且团队熟悉 → 继续用 Express 5,官方没有提供迁移工具。

获取免费咨询
常见问题

常见问题

如果你要搭建一个新的、对性能敏感且需要 Schema 校验的服务,选 Fastify;如果已有 Express 投入且团队熟悉,选 Express 5。两者都在积极维护——npm registry 上 express@latest 是 5.2.1,fastify@latest 是 5.12.5(Fastify v6 处于 alpha 阶段,但稳定版仍是 5.x)——所以不要用"Express 已经过时"这种理由来做决定。如果你需要大量第三方中间件,天平会更倾向 Express。

相关博客文章

查看全部文章
全部对比