В быстро развивающемся мире Node.js разработчики постоянно ищут надежные и масштабируемые решения для создания современных веб-приложений.

Именно в таком положении я оказался при перестройке нашего приложения SaaS. Я рассмотрел все распространенные варианты, Express.js, Koa.js и Restify. Помимо NodeJS, мы также смотрели на Django и Flask с Python и даже на некоторые фреймворки Rust, такие как Rocket. В конце концов, NestJS действительно соответствует всем требованиям. Главными требованиями были:

  • Быть масштабируемым.
  • Модульная структура.
  • Встроенная поддержка GraphQL.

Почему я выбираю NestJS

Было несколько причин, по которым я выбрал NestJS, о которых я расскажу ниже, это далеко не все причины, но, безусловно, некоторые из них.

  • Масштабируемость и ремонтопригодность:

NestJS продвигает модульную архитектуру, вдохновленную принципами проектирования Angular. Это позволяет разработчикам легко организовывать приложения в модули, компоненты, службы и контроллеры. Эта модульность помогает с удобством сопровождения кода и масштабируемостью, а также позволяет нам легко изолировать и реорганизовать определенные части приложения, не затрагивая другие области. Это важно, так как это позволяет небольшим (как моя) или большим группам работать над разными функциями и возможностями параллельно.

  • Встроенная поддержка микросервисов:

При перестройке нашего API мы знали, что микросервисы — это путь, по которому мы хотели пойти, поэтому важно было найти фреймворк, поддерживающий этот тип архитектуры. Найти тот, который изначально поддерживал его, было еще лучше. У NestJS есть удобный пакет@nestjs/microservices, который обрабатывает всю служебную связь и поддерживает ряд транспортных протоколов, таких как gRPC, который я выбрал. Я напишу более подробно об этом в другой статье.

  • Сходство с Angular:

В Ricoh Europe у нас уже есть большой опыт работы с Angular, а это означает, что начать работу с NestJS было намного проще, чем с другими вариантами. Любой разработчик Angular может легко приступить к созданию приложения NestJS с небольшой кривой обучения. Это большое преимущество, когда вы начинаете создавать новый API. При перестройке нашего приложения SaaS у нас были сжатые сроки, и нам была важна возможность быстро приступить к работе.

  • TypeScript в своей основе:

NestJS использует TypeScript в своей основе, что дает сильную приверженность TypeScript. TypeScript хорош по многим причинам, которые я сейчас не буду рассматривать, но некоторые из причин, по которым это было важно для нас, — безопасность типов, надежная кодовая база и раннее обнаружение ошибок.

  • Встроенная поддержка GraphQL.

NestJS имеет встроенный модуль для GraphQL под названием @nestjs/graphql, что означает, что GraphQL легко интегрировать в ваше приложение. Этот модуль позволяет вам определять схемы GraphQL с помощью декораторов и классов TypeScript, упрощая создание API GraphQL и управление им.

Встроенная поддержка важна, поскольку вы можете быть более уверены в том, что то, чего вы хотите достичь, возможно, а поддерживаемый пакет NPM всегда удобен в использовании!

  • Промежуточное ПО и защита:

Также подобно Angular, NestJS предлагает промежуточное ПО и средства защиты, которые позволяют нам перехватывать входящие запросы и применять логику предварительной обработки до того, как они достигнут контроллеров.

ПО промежуточного слоя может обеспечивать функции ведения журналов, а средства защиты позволяют легко реализовать механизмы аутентификации и авторизации. В наших API Guards используются в качестве механизмов аутентификации и авторизации. Мы считаем, что цепные ограждения обеспечивают лучшую и более гибкую функциональность.

  • Активное сообщество и богатая экосистема:

NestJS имеет сильное сообщество, которое активно способствует его росту. Экосистема включает в себя различные плагины, библиотеки и сторонние пакеты, расширяющие функциональность фреймворка.

Эта обширная экосистема поддержки гарантирует, что разработчики могут найти решения для большинства вариантов использования и ускорить процесс разработки. Существует также обширная документация и даже корпоративные пакеты. В зависимости от того, какой вы разработчик и какая у вас команда, это может быть полезно, поскольку это может обеспечить ускоренную разработку, чтобы помочь вам уложиться в сроки. Это не то, что я использовал лично, поэтому я не могу комментировать, насколько это хорошо.

  • Полная интеграция с рабочей областью nx.dev:

NestJS легко интегрируется с nx.dev, мощным инструментом разработки для проектов на основе монорепозиториев. nx.dev предоставляет важные функции, такие как генерация кода (на самом деле я использую его вместо инструментов генерации кода, таких как Angular CLI), визуализацию графа зависимостей (я использую это все время, чтобы понять циклические зависимости) и поддержку непрерывной интеграции.

Используя возможности nx.dev, разработчики могут эффективно управлять крупномасштабными приложениями с несколькими проектами, модулями и общими библиотеками. Я собираюсь написать полную статью о nx.dev и о том, как моя команда использует его как в наших API, так и в веб-проектах.

Подходит ли он для всех?

Хотя я лично считаю, что NestJS великолепен, я не закрываю глаза на тот факт, что он подходит не всем. Несколько вещей сразу бросаются мне в глаза.

  • Кривая обучения:

В то время как NestJS заимствует архитектурные концепции из Angular, разработчики, не имевшие опыта работы с Angular, могут столкнуться с трудностями обучения. Использование всего потенциала фреймворка и понимание его сложных функций может потребовать дополнительного времени и усилий.

  • Сложность в небольших проектах:

Для небольших приложений модульная структура NestJS и соблюдение лучших практик могут привести к ненужной сложности. Накладные расходы на настройку проекта и поддержание модульной структуры могут быть неоправданными для простых вариантов использования. Есть много других фреймворков, которые гораздо больше подходят для небольших проектов.

  • Накладные расходы на производительность:

Хотя NestJS предоставляет надежные функции, некоторые разработчики могут быть обеспокоены потенциальными потерями производительности по сравнению с более легкими платформами. Эта проблема становится актуальной при создании чрезвычайно высокопроизводительных приложений или микросервисов, требующих минимального потребления ресурсов.

Накладные расходы на производительность в настоящее время не являются чем-то, с чем я сталкиваюсь, однако я ожидаю, что если у вас нет хороших методов разработки, это быстро станет очевидным.

  • Ограниченное внедрение в устаревшие проекты:

Акцент NestJS на TypeScript и модульную структуру может быть несовместим с существующими проектами, основанными исключительно на JavaScript или более старых фреймворках. Миграция устаревших проектов в NestJS может потребовать значительных усилий по рефакторингу и интеграции.

Я бы рекомендовал использовать NestJS только с совершенно новым API, что для большинства людей невозможно.

Заключение

NestJS стал мощной и инновационной средой Node.js, предлагающей множество преимуществ разработчикам, создающим современные веб-приложения. Акцент на TypeScript, модульность, внедрение зависимостей и встроенную поддержку GraphQL обеспечивает прочную основу для масштабируемых и поддерживаемых проектов.

Однако инфраструктура может подходить не для каждого проекта, особенно для небольших приложений или устаревших систем, где кривая обучения, проблемы интеграции и время на сборку перевешивают преимущества.

В конечном счете, решение о внедрении NestJS должно основываться на конкретных потребностях проекта, опыте команды и долгосрочном видении роста приложения.

Надеюсь, эта статья поможет людям взвесить, стоит ли выбирать NestJS для своего API-проекта, и даст представление о моих плюсах и минусах.

На мой взгляд, NestJS — идеальный вариант для команд, которые уже имеют опыт работы с Angular и хотят создать большое серверное приложение, возможно, с несколькими микросервисами.

Тем не менее, для небольших API, я думаю, это приводит к ненужному раздуванию, и что-то более легкое, такое как Koa.js или даже Rust API, было бы более подходящим. Для существующих устаревших API, где пересборка с нуля невозможна, это также не подходит.

Пишите мне в фолловеры или Подпишитесь на меня, чтобы узнать больше, или напишите мне все, о чем вы хотите, чтобы я говорил.