返回项目目录
服务端框架精选项目

Fastify

面向 Node.js 的高性能低开销 Web 框架,拥有成熟的插件与 JSON Schema 生态。

主要语言JavaScript
开源许可MIT
项目类型服务端框架
维护状态活跃维护
OVERVIEW

项目概述

Fastify 围绕性能、可扩展性和开发体验设计,通过 JSON Schema 编译请求验证与响应序列化,并以插件封装模型组织路由、Hook、装饰器和基础设施依赖。

Fastify 是 OpenJS Foundation 的 At-Large 项目,也是 Node.js 生态中成熟的高性能服务端框架。它使用 Ajv 编译请求 Schema,并通过 fast-json-stringify 根据响应 Schema 生成高效序列化函数;内置 Pino 日志、生命周期 Hook、装饰器和可封装的插件上下文。Fastify v5 面向 Node.js 20 及以上版本,并要求 body、querystring、params 等使用完整 JSON Schema。框架既可用 JavaScript,也提供 TypeScript 泛型和 Type Provider 来从 Schema 推断类型。

当前主线Fastify v5
运行环境Node.js 20+
Schema 引擎Ajv + fast-json-stringify
FEATURES

主要特点

Fastify 把高性能路由、编译式 Schema、结构化日志和插件封装组合成适合长期运行服务的基础。

01

低开销高性能核心

路由、请求处理和日志路径围绕低开销设计,适合对延迟与吞吐有明确要求的 Node.js 服务。

02

编译式请求验证

使用 Ajv 将 body、query、params 和 headers 的 JSON Schema 编译成高效验证函数。

03

响应序列化优化

通过响应 Schema 与 fast-json-stringify 提升 JSON 输出速度,并限制可返回字段以降低敏感数据泄露风险。

04

插件封装模型

register 会创建继承式上下文,路由、Hook、Decorator 和 Schema 默认只影响当前作用域及其子级。

05

完整生命周期 Hook

可在请求、解析、验证、处理、序列化、响应和关闭阶段加入认证、审计、清理与观测逻辑。

06

内置结构化日志

与 Pino 深度集成,为请求自动关联日志上下文,并支持自定义级别、脱敏和传输配置。

07

TypeScript Type Provider

可通过 TypeBox、json-schema-to-ts 或 Zod Provider 从路由 Schema 推断请求和响应类型。

08

成熟插件生态

官方及社区插件覆盖 CORS、JWT、Cookie、限流、OpenAPI、数据库、缓存、WebSocket 和指标采集。

USE CASES

适用场景

适合以 Node.js 为核心、重视吞吐与可观测性,并需要成熟插件生态和清晰模块边界的后端系统。

高吞吐 REST API

适合请求量大、JSON 数据结构稳定,并希望验证和序列化路径可预测的业务接口。

微服务与领域服务

插件封装和依赖图便于按领域拆分路由、数据库、认证及跨切面能力。

企业 Node.js 后端

成熟的生命周期、日志、错误处理和运维生态适合需要长期维护的内部与对外服务。

API 网关与聚合层

可利用代理、认证、限流、Schema 和结构化日志构建 Backend for Frontend 或服务聚合入口。

Schema 驱动平台

共享 Schema、Type Provider 和 OpenAPI 插件适合需要严格契约、文档与代码生成的团队。

从 Express 渐进迁移

相近的 Node.js 服务模型和丰富生态便于逐步迁移,同时引入更明确的验证、日志和插件边界。

EVALUATION

优点与注意事项

技术选型不仅要看能力,也要理解它带来的团队成本。

主要优点

Fastify 擅长的地方

  • Node.js 生态成熟,拥有丰富的官方与社区插件
  • 请求验证和响应序列化均可通过 JSON Schema 预编译优化
  • 插件封装能限制 Hook、Decorator 和依赖的可见范围
  • Pino 结构化日志内置于框架,便于建立请求级观测
  • inject 无需监听端口即可启动插件并测试完整请求链
  • JavaScript 与 TypeScript 均得到良好支持,Type Provider 可减少重复类型

需要注意

采用前应考虑的问题

v5 要求 Node.js 20 或更高版本

旧运行环境需要先升级 Node.js,或继续维护 Fastify v4;迁移时还要检查插件的主版本兼容矩阵。

必须使用完整 JSON Schema

Fastify v5 不再接受过去的简写 Schema,body、querystring 和 params 应明确声明 type、properties 等结构。

Schema 不能来自不可信输入

Ajv 和 fast-json-stringify 会使用动态函数编译 Schema,应把 Schema 视为应用代码,绝不能直接接受用户提供的定义。

封装作用域需要理解

子插件中的 Decorator、Hook 和 Schema 默认不会暴露给父级或兄弟级;错误的注册层级可能导致依赖不可见。

异步验证应放在 Hook 中

数据库查询等异步工作不应放入初始 Schema 验证,否则可能形成拒绝服务风险;应在 preHandler 等阶段执行。

类型安全需要额外选择

原生 JSON Schema 不会自动生成精确 TypeScript 类型,需要选择 Type Provider 或维护请求泛型并统一团队规范。

QUICK START

快速开始

使用 TypeScript、TypeBox Type Provider 和 Node Test Runner 创建并测试一个 Schema 驱动的任务 API。

1初始化 TypeScript 项目
bash
mkdir fastify-tasks
cd fastify-tasks
npm init -y
npm install fastify @fastify/type-provider-typebox
npm install --save-dev typescript tsx @types/node
2创建 Schema 驱动的应用
typescript
import Fastify from "fastify";
import {
  Type,
  type TypeBoxTypeProvider,
} from "@fastify/type-provider-typebox";

const CreateTask = Type.Object({
  title: Type.String({ minLength: 1, maxLength: 120 }),
});

const Task = Type.Object({
  id: Type.String(),
  title: Type.String(),
  completed: Type.Boolean(),
});

export function buildApp() {
  const app = Fastify({ logger: true })
    .withTypeProvider<TypeBoxTypeProvider>();

  app.get("/health", async () => ({ status: "ok" }));

  app.post(
    "/api/tasks",
    {
      schema: {
        body: CreateTask,
        response: { 201: Task },
      },
    },
    async (request, reply) => {
      return reply.code(201).send({
        id: crypto.randomUUID(),
        title: request.body.title,
        completed: false,
      });
    },
  );

  return app;
}
3启动 HTTP 服务
typescript
import { buildApp } from "./app.js";

const app = buildApp();

try {
  const address = await app.listen({
    port: 3000,
    host: "127.0.0.1",
  });
  app.log.info({ address }, "server started");
} catch (error) {
  app.log.error(error);
  process.exit(1);
}
4使用 inject 测试完整请求链
typescript
import assert from "node:assert/strict";
import test from "node:test";
import { buildApp } from "../src/app.js";

test("creates a task", async (t) => {
  const app = buildApp();
  t.after(() => app.close());

  const response = await app.inject({
    method: "POST",
    url: "/api/tasks",
    payload: { title: "学习 Fastify" },
  });

  assert.equal(response.statusCode, 201);
  assert.deepEqual(response.json(), {
    id: response.json().id,
    title: "学习 Fastify",
    completed: false,
  });
});
5添加开发与测试脚本
json
{
  "type": "module",
  "scripts": {
    "dev": "tsx watch src/server.ts",
    "start": "tsx src/server.ts",
    "test": "tsx --test test/**/*.test.ts"
  }
}

下一步:将应用构建函数与监听入口分离,所有外部输入都声明 Schema;上线前补充统一错误格式、请求 ID、超时、优雅关闭和依赖健康检查。

ALTERNATIVES

类似项目

这些服务端框架也关注高性能、类型安全或模块化的 API 开发。

COMPARISON

Fastify vs Elysia

Fastify 和 Elysia 都强调高性能、Schema 与插件化。Fastify 专注成熟的 Node.js 生产生态和 JSON Schema 流程;Elysia 则以 Bun 为核心,提供更紧密的类型推断、生命周期和 Eden 客户端。

比较维度FastifyElysia
核心定位成熟的 Node.js 高性能 Web 框架Bun 优先的端到端类型安全后端框架
主要运行时Node.js 20+Bun,Node.js 等通过适配器支持
SchemaJSON Schema,Ajv 验证与快速响应序列化内置 t Schema,也支持 Standard Schema
类型推断泛型或 Type Provider,需要显式选择方案链式路由原生推断并贯穿 Eden Treaty
扩展模型register、Decorator、Hook 与封装上下文Elysia 实例、Plugin、Hook、Guard 与 Macro
测试方式inject 启动插件并模拟 HTTP 请求handle 接收标准 Request,或使用 Eden Treaty
更适合长期运行的 Node 服务和成熟企业生态Bun 新项目、严格类型链和快速全栈迭代
如何选择

如果系统以 Node.js 为标准运行环境、依赖成熟插件和运维体系,或需要精细控制 JSON Schema 验证与序列化,Fastify 通常更稳妥;如果团队采用 Bun,并希望服务端 Schema 到客户端调用获得更紧密的自动类型推断,Elysia 更有吸引力。两者都应以真实插件、负载和团队维护经验验证。

VERIFICATION

资料核验

版本、维护信息与本页采用的官方资料来源。

最后核验2026 年 7 月 26 日
核验版本官方当前稳定版与文档主线
内容维护Docs100 编辑整理
项目维护状态活跃维护

本次核验覆盖 Fastify 的核心定位、主要能力、官方入口与开源许可。项目版本持续更新,具体补丁版本、兼容性和迁移要求请在采用前继续核对官方发布记录。

维护状态核验2026 年 7 月 26 日 · 最近可见代码活动:2026 年 7 月 25 日

官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 25 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。

查看官方仓库