Что такое Fastify и каковы его основные преимущества перед Express.js?
Fastify — высокопроизводительный Node.js-фреймворк с JSON Schema валидацией, быстрой сериализацией через fast-json-stringify и зрелой plugin-системой с инкапсуляцией контекста.
Что такое Fastify
Fastify — это веб-фреймворк для Node.js, созданный в 2016 году Маттео Колліна и Томасом Делла Вейя. Его главная цель — максимальная производительность без ущерба для удобства разработчика. Название отражает философию: фреймворк обрабатывает десятки тысяч запросов в секунду, опережая Express и Hapi по большинству бенчмарков.
Минимальный пример
import Fastify from 'fastify';
const app = Fastify({
logger: true, // встроенный pino-логгер
});
app.get('/hello', {
schema: {
querystring: {
type: 'object',
properties: { name: { type: 'string' } },
},
response: {
200: {
type: 'object',
properties: { greeting: { type: 'string' } },
},
},
},
async handler(request, reply) {
const { name = 'World' } = request.query;
return { greeting: `Hello, ${name}!` };
},
});
await app.listen({ port: 3000 });
Ключевые преимущества перед Express.js
1. Производительность
Fastify использует fast-json-stringify для сериализации ответов на основе JSON Schema — это в 2–10 раз быстрее нативного JSON.stringify(). Встроенный роутер find-my-way основан на radix tree и эффективнее линейного поиска Express.
2. Встроенная валидация через JSON Schema
В Express валидация — задача сторонних библиотек (joi, zod). В Fastify она встроена: схема описывается прямо в объекте маршрута, компилируется через ajv один раз при старте и применяется к каждому запросу без overhead:
app.post('/users', {
schema: {
body: {
type: 'object',
required: ['email'],
properties: {
email: { type: 'string', format: 'email' },
age: { type: 'integer', minimum: 18 },
},
},
},
async handler(request) {
return request.body; // уже провалидировано
},
});
3. Plugin-система с инкапсуляцией
Каждый плагин создаёт дочерний контекст. Декораторы, хуки и маршруты, зарегистрированные внутри плагина, не видны в родительском контексте. Это исключает случайные утечки между модулями.
4. Встроенный pino-логгер
Express не имеет встроенного логгера. Fastify интегрирует pino — самый быстрый JSON-логгер для Node.js. Каждый запрос получает уникальный reqId, что упрощает трассировку.
5. TypeScript из коробки
Fastify поставляется с полными TypeScript-определениями. Схемы маршрутов можно типизировать через generics или автоматически через @sinclair/typebox.
Когда Express по-прежнему уместен
Express имеет огромную экосистему middleware, написанных именно под него. Если проект плотно зависит от специфического Express-middleware, миграция может быть нецелесообразной.
Подводные камни
- Другая модель middleware: Express использует
app.use(fn)сnext(), Fastify — систему хуков (preHandler,onRequestи т.д.). Прямой перенос Express-middleware невозможен без обёртки@fastify/express. - Асинхронные ошибки: в Express необработанные ошибки в async-обработчиках требуют явного
try/catch+next(err). Fastify перехватывает их автоматически через Promise rejection, но это поведение можно нечаянно сломать, смешав callback и async стили. - JSON Schema — не zod: схемы описываются в формате JSON Schema (Draft-07), а не в TypeScript-first стиле. Для TypeScript-проектов рекомендуется
@sinclair/typeboxилиzod+fastify-type-provider-zod. - Plugin-инкапсуляция удивляет новичков: плагин, зарегистрированный в дочернем контексте, не виден в родительском. Для «глобальных» плагинов нужен
fastify-plugin. - Нет автоматического body-parsing для всех типов: Fastify по умолчанию парсит только
application/json. Дляtext/plain,application/x-www-form-urlencodedиmultipartнужны отдельные плагины.
Common mistakes
- Дает общий ответ про Node.js и не называет конкретные API Fastify.
- Не объясняет, где в lifecycle находится Fastify и преимущества перед Express.
- Не разделяет validation, authorization, business logic и persistence.
- Игнорирует ошибки, лимиты входных данных, observability и тестирование.
What the interviewer is testing
- Может объяснить Fastify и преимущества перед Express на примере кода.
- Называет ключевые API: fastify(), route schema.
- Использует точные API Fastify, а не вымышленные hooks/decorators/methods.
- Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.