Все мы знаем, что экосистема JavaScript состоит из множества фреймворков. Десятилетиями разработчики пытаются добиться лучшей производительности, при этом не жертвуя безопасностью и удобством разработки. И для этого придумывают новые библиотеки и фреймворки, учитывающие ошибки предшественников.
Для серверной работы с JavaScript используется единая среда выполнения кода — Node.js, а самым популярным фреймворком для неё до сих пор остается Express.js. Но и у него есть недостатки. Приложения на Express плохо структурируются, особенно на сложных проектах. Поэтому разработчики используют новые технологии, решающие конкретные проблемы.
Например, с помощью Koa.js можно уменьшить количество кода на проекте, а Nest.js предоставляет готовую архитектуру. Но среди них есть ещё один кандидат, достойный отдельного упоминания — Fastify.
Что такое Fastify?
Fastify — это один из самых быстрых фреймворков для Node.js, ориентированный на обработку максимального количества запросов без ущерба безопасности и удобству разработки.
Fastify создан как веб-фреймворк общего назначения, но он отлично подходит для создания быстрых API-интерфейсов, использующих JSON в качестве формата данных. Улучшение производительности и уменьшение накладных расходов делает его отличным выбором для тех, кто разрабатывает архитектуру на основе микросервисов.
Фреймворк отлично интегрируется с Nest, поскольку он решает проблемы проектирования так же, как и Express. Тем не менее, по результатам тестов Fastify почти в два раза быстрее , чем Express.
Отсюда возникает справедливый вопрос: почему Nest по-умолчанию использует именно платформу Express?
Причина в том, что Express широко используется, хорошо известен и имеет огромный набор совместимого промежуточного ПО, которое доступно пользователям Nest из коробки. Но поскольку Nest независим от конкретного фреймворка, то разработчик может выбирать более удобные и производительные решения под свои задачи.
Особенности Fastify
Ниже перечислены основные особенности и принципы, на которых построен Fastify:
Высокая производительность
Fastify — один из самых быстрых веб-фреймворков, в зависимости от сложности кода он может обслуживать до 30 тысяч запросов в секунду. Он использует fast-json-stringify для удвоения пропускной способности рендеринга JSON и find-my-way для уменьшения маршрутизации в 10 раз по сравнению с альтернативами.
Расширяемость
Fastify полностью расширяем с помощью своих хуков, плагинов и декораторов. Фреймворк предоставляет API с серверными функциями и создает область для объединения плагинов.
Экосистема фреймворка состоит более чем из 50 основных плагинов и почти 200 плагинов, разработанных сообществом. Каждый отвечает за определенные функции, например, аутентификацию, сжатие, безопасность, маршрутизацию, интеграцию с Next.js и т.д.
Fastify предлагает модель подключаемого модуля. Он добавляет полную инкапсуляцию плагинов, чтобы каждый плагин мог использовать свои собственные зависимости и хуки, если захочет. Это обеспечивает широкое повторное использование программного обеспечения.
Благодаря своей модели инкапсуляции фреймворк позволяет избежать перекрестных зависимостей, это помогает отладке приложения. Следуя этой модели, разработчик может в любой момент разбить приложение на несколько микросервисов без необходимости рефакторинга всего проекта.
Кроме того, модель плагинов основана на реентерабельных блокировках и графах, она отлично обрабатывает асинхронный код и гарантирует порядок загрузки и порядок закрытия плагинов.
Fastify имеет широкий спектр уже разработанных подключаемых модулей, в том числе для рендеринга шаблонов, интеграции с React, поддержки GraphQL, обслуживания статических файлов и драйверов баз данных.
Использование JSON-Schema
Хоть это и не является обязательным, разработчики Fastify рекомендуют использовать JSON-Schema для проверки маршрутов и сериализации выходных данных, а ядро фреймворка компилирует схему в высокопроизводительную функцию.
JSON-Schema не только описывает существующие форматы данных, но и проверяет эти данные, что будет полезно для автоматического тестирования.
Логирование
Ведение журналов очень важно для любого проекта, но оно зачастую дорого обходится для владельцев бизнеса. Поскольку Fastify ориентирован на производительность, он по-умолчанию использует Pino в качестве регистратора.
Pino поддерживает редактирование журналов с низкими издержками. Например, он позволяет скрыть значения определенных свойств в записанных журналах, а также может регистрировать конфиденциальную информацию.
Области применения Fastify
Есть много способов использовать Fastify, и ограничений для этого нет. Однако некоторые варианты использования более популярны, чем другие. Рассмотрим некоторые примеры:
Создание REST API
Одним из наиболее распространенных вариантов использования Fastify является создание REST API. Он обычно реализует шаблон создания, чтения, обновления, удаления данных (CRUD). Сложность будет в основном зависеть от количества функционала в приложении.
В Fastify есть все, что нужно для реализации REST API. Можно в том числе добавить более продвинутые функции, такие как подключение к базам данных или подключение к сторонним ресурсам.
Обслуживание статического контента
Еще одним распространенным вариантом использования Fastify является создание простого приложения, которое обслуживает статический контент. На первый взгляд, хранение изображений и видео в отдельном микросервисе может показаться странным, но это дает определенные преимущества.
Во-первых, приложение ориентировано исключительно на управление доступом к статическому контенту и его обслуживание, а это означает, что у разработчиков будет целостный сервис.
Во-вторых, можно легче реализовать такие функции, как кэширование.
Создание сервиса в Fastify, который может обслуживать статический контент, довольно простое и создается с помощью подключаемого модуля.
Создание бессерверных функций
Бессерверные функции стали невероятно популярными, потому что они позволяют разработчикам создавать простые и эффективные приложения, которые служат только одной цели. Сюда могут входить функции, которые запускаются по таймеру и обновляют данные в базе данных, например конечная точка HTTP, выполняющая определенные вычисления и возвращающая результаты. Основным преимуществом бессерверных функций является то, что они закрываются после завершения выполнения, что может сократить расходы для организации.
Выводы
Среди всех фреймворков для Node.js Fastify больше всех сделал упор на производительность, при этом сохранив простоту и удобство для разработчиков. Он может повысить пропускную способность большинства приложений. Приложение на Fastify собирается как конструктор с помощью плагинов, что позволяет избежать лишнего кода и сделать приложение удобнее в поддержке.
При этом стоит понимать, что фреймворк не настолько популярен, как тот же Express, и в нем может не хватать некоторых нужных функций для приложения.
Команда разработчиков Work Solutions уже много лет использует Node.js для разработки серверной части приложения на JavaScript. Мы знаем преимущества каждого фреймворка и поможем подобрать стек для конкретного проекта.