Published on

Express.js vs Nest.js - porównanie frameworków Node.js

Authors

Który framework Node.js wybrać? Jakie są różnice i zastosowanie Nest JS i Express.js? Ten wpis jest moim luźnym porównaniem obu rozwiązań.

Long story short

Zawodowo jestem front-end developerem i pracuje z aplikacjami webowymi, kilka razy miałem przyjemność tworzyć backend, ze względu na znajomość JavaScript wybór padł naturalnie na Node.js. Na studiach pisałem kilka aplikacji w Springu (Java) i Laravel (PHP). Z Express.js pierwszy raz spotkałem się w IBM w 2017 roku. Tworzyliśmy serwis (Node.js + Express) żeby powiązać chat (client) z platformą IBM Watson i serwisem do przetwarzania języka naturalnego NLU oraz platformami Social Media (m.in. YouTube i Reddit). Zastosowanie było bardzo specyficzne, Express sprawdził się idealnie. Od tego czasu tworząc backend zawsze używałem już Express.js.

W 2022 roku przesiadłem się na Nest JS. Jestem świeżo po postawieniu nowego projektu na Nest, dlatego zdaje raport na gorąco i spróbuje porównać oba fremeworki – bo różnice są bardzo duże.

Express.js

Strona główna Express.js, https://expressjs.com/

Framework powstał w 2009 roku, jest to minimalistyczny framework webowy dla Node.js. Elastyczność to słowo klucz, Express nazywany jest przez niektórych biblioteką bo dostarcza szereg przydatnych funkcji i obudowuje moduł HTTP dla Node.js (upraszczając). Programista ma dużą dowolność przy wyborze architektury i podejścia. Wiele frameworków Node.js bazuje na express.js (lista).

Strona www: https://expressjs.com/
Repozytorium: https://github.com/expressjs/express

Nest JS

Strona główna Nest JS, https://nestjs.com/

Nest JS powstał w 2017, stworzył go polski developer Kamil Myśliwiec. Rozwiązanie ma ogromne community (prawie 53k ⭐ na githubie). Framework bazuje na TypeScript, znajdziemy tu wiele konceptów znanych z Angulara, Springa, Laravela etc. Jeśli wcześniej pracowałeś w .Net lub Springu to przejście na Nest JS nie powinno być problemem.

Strona www: https://nestjs.com/
Repozytorium: https://github.com/nestjs/nest

Zacznijmy więc porównanie…

Dokumentacja

Pojedynek na dokumentację wygrywa zdecydowanie Nest JS ze względu na czytelność oraz wiele przykładów. Twórcy stworzyli przyjazną dla programistów dokumentacje z życiowymi use-case’ami, wyjaśniają mechanizmy i opisują jak to działa. Czytelność i bycie user-friendly jest na najlepszym poziomie.

Dokumentacja Express wypada w tym porównaniu blado, tak jakby zatrzymała się w 2009 roku. Porównajcie sami jak wyglądają docs’y dla obu frameworków.

Wydajność

Pod maską Nest korzysta z Expressa (domyślnie) ale zapewnia również kompatybilność z Fastify. Nest może korzystać z wielu platform (Socket, Fastify, Express) przez wdrożenie adaptera który jest proxy na moduł HTTP.

Czy Nest jest szybszy niż Express? Tak i nie, jeżeli porównamy Nest JS oparty o platform-express to naturalnie Nest będzie wolniejszy przez to że obudowuję czystego express.js dodatkowymi modułami. Gdy jednak porównamy Nest JS na platform-fasitfy to Nest jest prawie 2x szybszy niż Express.

Skoro Fastify jest szybszy to dlaczego domyślnie ustawiony jest Express? Powodem jest to, że Express jest szeroko stosowany, dobrze znany i ma ogromny zestaw kompatybilnego oprogramowania pośredniego, które jest dostępne dla użytkowników Nest od razu po wyjęciu z pudełka.

Poniżej porównanie wydajności zrobione przez twórców Nest JS.

Benchmark

Warunki:
Running 10s test @ http://localhost:3000, 1024 connections

Express:
165k requests in 10.17s, 35.4 MB read

Nest na @nestjs/platform-express:
156k requests in 10.24s, 33.8 MB read

Fastify:
320k requests in 10.18s, 48.7 MB read

Nest na @nestjs/platform-fastify:
295k requests in 10.17s, 45.1 MB read

Inny test przesłany przez twórcę Nest w odpowiedzi na wątek na Stackoverflow:

Req/sec Trans/sec Nest-Express 15370 3.17MB
Nest-Fastify 30001 4.38MB
Express 17208 3.53MB
Fastify 33578 4.87MB

Oczywiście nic nie zastąpi testów wydajnościowych w realnej aplikacji w środowisku produkcyjnym/testowym. Jeśli jednak zależy nam na wydajności to opierając Nest JS na platformie Fastify, możemy uzyskać lepszą przepustowość i wydajność niż na zwykłym Express.

Źródła:
1. Benchmark w repozytorium Nest JS
2. Wątek na Stackoverflow

Architektura i filozofia

Twórcy obu rozwiązań mają różne podejście do architektury, przez co tutaj zauważymy największą różnicę między nimi.

Express daje nam zestaw narzędzi i mówi „zbuduj co chcesz, jak chcesz”. Mamy pełną dowolność i sami tworzymy strukturę naszej aplikacji. Elastyczność może jednak stanowić problem w miarę wzrostu wielkości zespołu lub złożoności aplikacji, zwłaszcza w przypadku programistów pracujących nad różnymi aspektami aplikacji. Jeżeli nie przemyślimy dobrze naszej architektury na początku może się okazać że nasz serwis będzie trudny w utrzymaniu w przyszłości.

Nest zapewnia gotową architekturę aplikacji, która pozwala programistom i zespołom tworzyć wysoce testowalne, skalowalne, luźno powiązane i łatwe w utrzymaniu aplikacje. Architektura jest mocno inspirowana Angularem.

Nest.js domyślnie używa TypeScript co daje nam silne typowanie, sprawdzanie typów i lepsze podpowiadanie składni. Nest jest kompatybilny zarówno z TypeScript, jak i czystym JavaScript wtedy będziemy potrzebować kompilatora Babel. Jeszcze kilka lat temu nie sądziłem że stanę się fanem silnego typowania, przesiadka na TypeScript zmieniła wszystko, teraz przy większym projekcie nigdy nie wróciłbym do VanillaJS.

Więcej o architekturze, podejściu MVC, komponentach takich jak Controllers, Modules, Providers możecie przeczytać w dokumentacji.

Out-of-the-box vs third-party library

Zaczynając nowy projekt w Express.js będziemy musieli skonfigurować wiele rzeczy samemu. To nie prawda tak jak piszą niektórzy, że Nest JS ma wyższy próg wejścia. Konfiguracja testów, prekompilatora, TS (jeśli chcemy go używać) zarządzanie strukturą projektu i wybór zewnętrznych bibliotek będzie bardzo trudny dla osób które dopiero zaczynają. Osoby doświadczone zrobią to jednak i tak będą musiały poświęcić kilkanaście godzin na samą konfiguracje.

NestJS obsługuje szeroką gamę oprogramowania pośredniego, w tym typowe funkcje, takie jak uwierzytelnianie, CORS, logowanie, swagger. Korzystamy z modułów i pakietów które dostarczają nam twórcy. Za pomocą Express.js możemy zrobić oczywiście to samo choć będzie to wymagać więcej pracy od programisty i używania wielu zewnętrznych bibliotek.

NestJS obsługuje websockety, co pozwala na komunikację w czasie rzeczywistym pomiędzy klientem a serwerem. W Express.js musimy dodać zewnętrzną bibliotekę np. express-ws.

To samo tyczy się obsługi GraphQL. Nest ułatwia budowanie i udostępnianie interfejsów API GraphQL. W Express.js obsługa musi być dodana przy użyciu biblioteki innej firmy.

Mając wiele zewnętrznych zależności musimy częściej martwić się o aktualizowanie paczek i ich kompatybilność.

CLI

NestJS zapewnia potężne narzędzie CLI (interfejs wiersza poleceń), które pomaga programistom tworzyć sprawniej nowe moduły, auto-generować i dodawać kod. Express.js nie ma wbudowanego narzędzia CLI, więc developerzy muszą korzystać zewnętrznych narzędzi a najczęściej kopiować pliki i dokonywać monotonnych modyfikacji.

Mikroserwisy

Nest natywnie obsługuje architekturę mikroserwisów. Koncepcje takie jak wstrzykiwanie zależności, dekoratory, potoki, etc, są tutaj wykorzystywane w równym stopniu jak w aplikacji monolitycznej. Możemy wybrać inną warstwę transportową niż HTTP i używać TCP.
Więcej w dokumentacji: https://docs.nestjs.com/microservices/basics

Testy

Express daje nam dowolność, musimy jednak sami skonfigurowac nasze testy. Nest już od samego początku konfiguruje i strukturyzuje nasze testy jednostkowe i E2E. Konfiguracja domyślna oparta jest na Jest. Testowanie aplikacji jest zdecydowanie łatwiejsze i szybsze w Nest JS.
Więcej w dokumentacji: https://docs.nestjs.com/fundamentals/testing

Rozwój i community

Porównajmy repozytoria tych frameworków (na dzień 10 grudnia 2022 roku).
Najważniejsza kwestia czyli licencja, oba rozwiązania oparte są na licencji MIT – daje nam to pełną dowolność do pracy, modyfikacji i komercjalizacji naszych produktów opartych o te frameworki.

NazwaGwiazdki ⭐ObserwatorzyForksLicencjaWspółtwórcyUżywany przez projektyCommityWersja
Express.js59.2k1.7k10kMIT295Ponad 10 milionów5,752v4.18.2 (2022-10-08)
Nest JS52.7k6986.3kMIT353Ponad 218 tysięcy11,981v9.2.1 (2022-11-29)

Co z tego wynika?

Express ma ugruntowaną pozycję na rynku, jest to najpopularniejszy framework Node.js. Większa ilość projektów opartych na express.js świadczy że wachlarz możliwości jest jak szwajcarski scyzoryk. Często gdy myślimy Node.js to mamy na myśli Node.js + Express.

Nest JS jest dużo młodszym frameworkiem a mimo to prawie dogonił w popularności starego poczciwego Expressa. Większa ilość współtwórców znaczy że framework ten będzie rozwijany jeszcze przez wiele lat.

Uważam że tak jak Spring dla Javy, .Net dla C#, Laravel dla PHP tak i Nest JS stanie się wiodącym frameworkiem dla Node.js. W przyszłości będzie zyskiwał na znaczeniu. Szczególnie cieszy że twórcą jest Polak Kamil Myśliwiec który wykonał kawał solidnej roboty. Nie tylko stworzył dobre rozwiązanie ale również zaprosił społeczność do współpracy i dalszego rozwoju.

Podsumowanie

Porównanie Nest JS oraz Express.js wypada na korzyść Nest JS. Głównie ze względu na narzuconą architekturę i wymuszenie dobrych praktyk. Twórcy Nest JS dają nam rozwiązania out-of-the-box oraz przyjazne CLI to wydajniejszej pracy nad kodem. Gotowa pre-konfiguracja, testy jednostkowe i E2E oraz TypeScript by default. Nest jest nowocześniejszym frameworkiem niż Express a jego community ciągle rośnie.

Jeśli budujemy typowe REST API, chcemy z góry narzuconą strukturę, skalowalność, testowalność oraz szybko rozwijać kod przy jak najmniejszym nakładzie pracy, wybrałbym Nest JS.

Jednak jeśli nasze potrzeby są bardziej nietypowe, budujemy aplikacje typu fintech lub mocno opartą o streaming danych to zdecydowałbym się na Express.js. Da to nam pole do większej customizacji i wydajniej obsługi asynchronicznych strumienii danych.

Oba frameworki mają swoje plusy i minusy. Oczywiście ostateczna decyzja co do wyboru zależy od nas oraz tego co chcemy robić. Jeśli czytałeś ten wpis do końca to najpewniej znałeś Express.js wcześniej, artykuł ten miał na celu zachęcenie Cię do poznania Nest JS. Nie jest to kolejny framework JS który umrze za rok, ta obawa często zniechęca nas do poznawania nowych frameworków. Polecam zapoznać się z dokumentacją i być może wdrożyć Nest JS przy okazji zaczęcia kolejnego nowego projektu. Ja jestem pozytywnie zaskoczony.