Programowanie Node.js
Node.js — środowisko uruchamiania JavaScript po stronie serwerowej umożliwiające m.in. tworzenie backendu aplikacji internetowych
Jedną z naszych specjalizacji jest technologia Node.js pozwalająca na tworzenie aplikacji sterowanych zdarzeniami. Node.js pozwala na budowanie wydajnych aplikacji internetowych opartych o język JavaScript. Dodatkowo platforma umożliwia uruchomienie języka JavaScript na serwerze, czyli poza przeglądarką. Technologia ta jest idealnym wyborem do tworzenia skalowalnych i wydajnych aplikacji webowych i nie tylko.
Spis treści:
- Zakres i obszar pracy z Node.js w ImpiCode
- Nasi klienci
- Czym jest Node.js?
- Charakterystyka
- Najbardziej przydatne moduły
- Historia Node.js
- Zalety
- Ograniczenia
- Jak działa Node.js?
- Gdzie stosować?
Zalety Node.js
Jeden język programowania
Szybka nauka
Skalowalność
Szybkie buforowanie
Zakres prac
Node.js wykorzystujemy głównie do tworzenia back-endu. Specjalizujemy się przede wszystkim w tworzeniu:
- interaktywnych aplikacji webowych,
- systemów opartych o mikroserwery,
- SPA (Single Page Applications), w tym również zoptymalizowanych pod SEO (SSR - Server Side Rendering),
- mikroserwisów współpracujących z urządzeniami IoT,
- rozbudowane aplikacje okienkowe przy wykorzystaniu Electron.
Obszar działania
Nasz zespół programistyczny od technologii w Node.js świadczy następujące usługi:
- projektowanie architektury,
- kompleksowe tworzeni nowych aplikacji www,
- DevOps - automatyzacja developmentu,
- wsparcie i utrzymanie po wdrożeniowe,
- audyty oprogramowania,
- przejęcie projektów po innych zespołach.
Nasi klienci
Polski Związek Motorowy
Adamed
Polska Agencja Prasowa
Astor
IFX Payments
TEB Edukacja
Fundacja Moc Pomocy
Elemental Holding
French Touch
Polski Komitet Normalizacyjny
TU
Bergakademie Freiberg
Bank Nowy BFG
Narodowe Centrum Promieniowania Synchrotronowego SOLARIS
Astorino Kawasaki Robotics
DTK&W Zespół Ogłoszeniowy
Opegieka
Crazy shop
PartyBox
WUOZ w Krakowie
Uniwersytet Medyczny w Łodzi
Grupa Mo
Jeleniogórska Organizacja Turystyczna
eFitness
Instytut Badań Literackich PAN
Danhoss
Fundacja Sztuki, Przygody i Przyjemności ARTS
Opennet.pl
Centrum Medyczne Intermed
Centrum Rozwoju Edukacji Edicon
Winner Europe
Po amputacji
MamMoc.pl
EtnoStoria
Widzisz Wszystko
EMKA Project
NowaLed ILL
Eco Light LED
LoxiMide
Fundacja AVLab.pl
RCC Nova
Vector Controls
Virtual SMS
Parus Holdings
Biuro Partner
Optime.AI
M2M Team
Firma postanowiła stworzyć dedykowany system do zarządzania dokumentacją badań medycznych. W ramach tego projektu pełniliśmy rolę konsultanta technicznego. Aktywnie uczestniczyliśmy w określeniu zakresu systemu, wyborze odpowiednich technologii i projektowaniu jego architektury.
Dzięki naszemu zespołowi, firma może sprawnie i skutecznie wdrażać nowe rozwiązania w branży e-commerce.
Czym dokładnie jest Node.js?
Node.js jest platformą, która umożliwia uruchomienie kodu JavaScript. Platforma udostępnia API, którego najszerszym zastosowaniem jest tworzenie stron internetowych opartych na programowaniu sterowanym zdarzeniami (obsługuje zapytania http/https). Poza samą możliwością uruchomienia skryptów JavaScript w środowisku innym niż przeglądarka (pierwotnie zastosowanie JavaScript), platforma oferuje wiele modułów stanowiących potężny zestaw narzędzi programistycznych. Warto podkreślić, że technologia może zostać uruchomiona na rozmaitych systemach operacyjnych, jak choćby Linux/Unix, MacOS czy Windows.
Node.js opiera się na silniku V8 zapewniającym szybkie wykonanie kodu. Silnik pobiera kod JavaScript i konwertuje go na szybszy kod maszynowy, który może zostać uruchomiony na komputerze bez konieczności przeprowadzenia jego wcześniejszej interpretacji. Należy podkreślić, że technologia sama w sobie nie jest serwerem, jednak umożliwia programistom stworzenie własnego serwera www, np. z wykorzystaniem framework Express.js (lekki, nienarzucający zbyt wielu rozwiązań, a zarazem realizujący niezbędne funkcjonalności serwera www).
Charakterystyka
Node.js posiada kilka cech charakterystycznych i funkcjonalności odróżniających ją od innych technologii. Poniżej zostaną zaprezentowane najważniejsze wyróżniki.
Unifikacja kodu po stronie klienta i serwera
Cechą charakterystyczną platformy jest unifikacja kodu zarówno po stronie klienta jak i serwera. Kod obsługujący klienta (czyli w tym wypadku zazwyczaj przeglądarkę) jest pisany w tym samym języku co kod odpowiedzialny za obsługę serwera. Używanie tego samego języka programowania po obu stronach połączenia pozwala uniknąć koniecznego w innych wypadkach duplikowania logiki fragmentów aplikacji.
Silnik V8
Platforma Node.js została oparta na silniku V8, który jest otwartym silnikiem JavaScript stworzonym na potrzeby Google Chrome. Silnik nie interpretuje kodu JavaScript w czasie rzeczywistym, a kompiluje kod do kodu maszynowego, co zwiększa szybkość działania. W trakcie kompilacji ma miejsce proces optymalizacji wykonania między innymi przez usuwanie “martwego” kodu, czy przewidywanie rozgałęzień wykonania pętli. Zarządzaniem pamięcią zajmuje się wydajny odśmiecacz (garbage collector).
Npm
Npm (Node Packaged Module) jest menadżerem pakietów dla Node.js, używanym do instalacji rozszerzeń. Warto podkreślić, że platforma cały czas rozwija się bardzo dynamicznie – obecnie npm zawiera ponad milion pakietów, a ich liczba wciąż rośnie.
Jednowątkowość
Node.js jest jednowątkowy, co stanowi odejście od popularnego obecnie modelu współbieżności. Architektura Node.js oparta jest na jednowątkowej pętli zdarzeń i nieblokujących operacjach wejścia i wyjścia, które w maksymalny sposób wykorzystują pojedynczy procesor. Dzięki temu użytkownicy platformy przestali martwić się możliwością całkowitego zablokowania procesora, a serwery stały się szybsze i bardziej wydajne.
Asynchroniczność
Najważniejszymi funkcjami środowiska jest jego asynchroniczność i sterowanie zdarzeniami. W architekturze programowania sterowanego zdarzeniami czas występowania zdarzeń oraz ich kolejność nie są określone. Pojawiające się zdarzenia obsługiwane są dopiero wtedy, gdy występują wolne zasoby. Takie podejście skutkuje lepszym wykorzystaniem zasobów oraz większą separacją kodu i luźnym powiązaniem komponentów (loose coupling). Asynchroniczne środowisko JavaScript znacznie ułatwia proces budowania skalowalnych aplikacji sieciowych. Warto podkreślić, że Node.js obsługuje jednocześnie wiele połączeń. Przy każdym połączeniu uruchamiany jest callback, ale w przypadku, gdy nie ma żadnej pracy do wykonania, platforma automatycznie przechodzi w tryb uśpienia. Poniższy przykład „hello world” prezentuje jednoczesną obsługę wielu połączeń.
Najbardziej przydatne moduły npm
Npm jest jedną z najważniejszych części Node.js. Jest to specjalne narzędzie umożliwiające zarządzanie modułami. Ekosystem modułów jest otwarty dla wszystkich, dlatego każdy może opublikować w nim swój własny moduł.
Do obecnie najbardziej znanych i najczęściej używanych modułów npm należą:
- Express.js - jeden z najczęściej wykorzystywanych frameworków do tworzenia aplikacji internetowych.
- Lodash - bibliotek zawierająca dziesiątki przydatnych funkcji eliminujących potrzebę pisania pętli i zbędnych linijek kodu w najczęstszych zastosowaniach.
- Hapi.js - bardzo prosty w użyciu framework wykorzystywany do tworzenia aplikacji internetowych i usługowych.
- Connect.js - rozszerzalny szkielet serwera HTTP zapewniający zbiór wysokowydajnych wtyczek znanych jako oprogramowanie pośrednie.
- Meteor.js - framework pozwalający na szybkie tworzenie prototypów i pisanie wieloplatformowego kodu działającego na Android, iOS i Web.
- Nest.js - framework umożliwiający budowanie wydajnych i skalowalnych aplikacji po stronie serwera.
- Socket.io - biblioteka umożliwiająca tworzenie aplikacji zapewniających komunikację w czasie rzeczywistym pomiędzy klientem a serwerem.
Frameworki dla Node.js
Historia powstania technologii
Node.js jest stosunkowo młodą technologią, ponieważ liczy sobie dopiero 12 lat. Została stworzona w 2009 roku przez Ryana Dahla, a jej pierwsza wersja obsługiwała tylko systemy MacOS i Linux. Dahl na początku sam rozwijał i utrzymywał technologię, lecz wkrótce otrzymał wsparcie od firmy Joyent, która stała się oficjalnym sponsorem Node.js.
Pomysł na Node.js pojawił się z powodu ograniczeń najpopularniejszego wówczas serwera WWW, którym był Apache HTTP Server. Dahl skrytykował możliwości serwera pozwalające na jednoczesną obsługę wielu połączeń (10 000 lub więcej). Zauważył, że w przypadku wystąpienia jednego zablokowanego kodu lub domniemanego stosu wielokrotnych wykonań, serwer stwarza problemy, które można rozwiązać tylko przy pomocy kodu sekwencyjnego. Dahl chciał stworzyć technologię, która znacząco usprawni pracę serwera WWW.
Node.js została zaprezentowana światu podczas JSConf EU 2008, czyli europejskiej konferencji dla społeczności JavaScript. Technologia szybko zdobyła uznanie wśród programistów JavaScript, ponieważ umożliwiała nowatorskie podejście programowania po stronie serwera. W styczniu 2010 roku do środowiska Node.js wprowadzono menadżer pakietów npm, który znacznie ułatwia programistom publikowanie i udostępnianie kodu źródłowego pakietów Node.js.
W czerwcu 2011 roku dzięki współpracy firmy Joyent z Microsoftem powstała natywna wersja Node.js obsługującą system Windows. Rok później Dahl zrezygnował z pracy nad dalszym rozwojem technologii, a jego miejsce zajął twórca npm Isaac Schlueter. W 2014 roku Fedor Indutny uruchomił io.js, która jest kompatybilną platformą opartą o Node.js. W 2019 roku organizacje non-profit Node.js i io.js połączyły siły, co doprowadziło do powstania OpenJS Foundation.
Kilka firm, których aplikacje zostały napisane przy użyciu Node.js
Zalety technologii
Dzięki silnikowi V8 i używaniu jednego z najpopularniejszych języków programowania jakim jest JavaScript, Node.js jest bardzo często wybieraną technologią przez programistów. Jednak Node.js posiada jeszcze więcej zalet sprawiających, że jest świetnym wyborem do wielu projektów. Poniżej zaprezentujemy najważniejsze zalety technologii.
Skalowalność
Jedną z najważniejszych zalet technologii jest jej skalowalność. Programiści doceniają fakt, że bardzo łatwo mogą skalować aplikacje powstałe w środowisku Node.js zarówno w kierunku poziomym jak i pionowym. Aplikacje można skalować w kierunku poziomym poprzez dodanie nowych węzłów do istniejącego systemu. Warto podkreślić, że technologia daje możliwość dodawania dodatkowych modułów podczas pionowego skalowania. Pod względem skalowalności, Node.js oferuje lepsze możliwości i opcje niż pozostałe serwery JavaScript.
Łatwość nauki
Bezwątpienia JavaScript jest jednym z najpopularniejszych i najczęściej używanych języków programowania. Dzięki dobrej znajomości języka JavaScript, nauka Node.js jest szybka i przyjemna. Programiści kodujący w JavaScripcie bardzo łatwo przystosowują się do technologii Node.js, co w rezultacie prowadzi do szybszego pisania kodów.
Jeden język programowania
Node.js pozwala na tworzenie front-endu i back-endu w języku JavaScript. Programiści nie muszą używać innego języka programowania po stronie serwera, a technologia obsługuje aplikację zarówno od strony klienta jak i serwera. Oznacza to, że aplikacje zbudowane w Node.js wymagają mniejszej ilości plików i mniej napisanego kodu w porównaniu z technologiami, które korzystają z odmiennych języków dla części front-endowych i back-endowych. Warto zauważyć, że w tym przypadku nie trzeba zatrudniać oddzielnych programistów front-endowych i back-endowych do stworzenia aplikacji, co pozwala nie tylko na obniżenie kosztów, ale również przyśpiesza pracę.
Wysoka wydajność
Jak już wspomniano Node.js posiada silnik V8 firmy Google, który pozwala na kompilację kodu JavaScript. Kompilacja znacząco przyspiesza wykonywanie kodu dzięki uruchamianiu kodu maszynowego. Silnik dba o zgodność obu kodów.
Szybkie buforowanie
Node.js zawiera moduł buforowania odpowiedzialny za szybkie ładowanie się stron internetowych. Cały proces polega na tym, że za każdym razem, gdy moduł aplikacji otrzymuje żądanie, jest ono natychmiast buforowane w pamięci wewnętrznej aplikacji. Dzięki temu procesowi użytkownicy uzyskują szybki dostęp do stron internetowych.
Tworzenie wieloplatformowych aplikacji
Dzięki technologii Node.js programiści mogą korzystać z takich platform jak Electron lub NW.js, które umożliwiają budowanie wieloplatformowych aplikacji internetowych w czasie rzeczywistym. Oznacza to, że nie trzeba tracić czasu na pisanie oddzielnych kodów dla różnych systemów, a programiści mają dostęp do większej ilości narzędzi przydatnych w procesie pisania i debugowania kodu.
Zaangażowana społeczność
Dużą rolę w rozwoju technologii odgrywa prężnie działająca społeczność, dzięki której powstało wiele narzędzi, bibliotek i modułów ułatwiających programowanie w Node.js. Społeczność technologii jest wspierana przez programistów JavaScript, którzy chętnie dzielą się autorskimi rozwiązaniami i kodami dostępnymi na GitHubie. Warto podkreślić, że technologia jest wspierana również przez takie firmy jak: Amazon, Google, Facebook i Netflix. Giganci technologiczni bardzo często wykorzystują Node.js w swoich projektach.
Ograniczenia technologii
Mimo iż Node.js posiada wiele zalet, to jednak nie jest idealnym rozwiązaniem dla każdego projektu. Poniżej zaprezentujemy najważniejsze ograniczenia technologii.
Utrata wydajności przy dużych obliczeniach
Node.js nie jest najlepszym wyborem przy projektach wymagających dużej mocy procesora. Moc procesora uzależniona jest między innymi od ilości i złożoności obliczeń. Im bardziej skomplikowane obliczenia, tym procesor zużywa więcej mocy na jego rozwiązanie. Z powodu blokowania żądań przychodzących przez obliczenia, wydajność technologii znacząco spada. Z tego powodu Node.js nie nadaje się do rozwiązań wymagających dużej ilości obliczeń.
Callback hell
Callback hell jest wielokrotnym zagnieżdżeniem funkcji wywołania zwrotnego, który negatywnie wpływa na jakość kodu JavaScript, a także może przyczynić się do zmniejszenia tempa rozwoju projektu. Obecnie występują funkcje, które łagodzą problemy z wywołaniami zwrotnymi. Niestety dostępne rozwiązania, nie umożliwiają całkowitego uniknięcia sytuacji callback hell.
Częste zmiany kodu spowodowane zmianami API
Najczęstsze błędy zgłaszane przez użytkowników technologii dotyczą częstych zmian API, które są zazwyczaj niekompatybilne wstecz. Zmiana API wymusza na programiście zaktualizowanie kodu dostępu w taki sposób, aby był zsynchronizowany z najnowszą wersją interfejsu API.
Niedojrzałość narzędzi
Chociaż podstawowe moduły Node.js są dość stabilne i dojrzałe, to w rejestrze npm istnieje wiele narzędzi złej jakości lub posiadających błędną dokumentację. Ponadto sam menadżer pakietów nie posiada odpowiedniej struktury umożliwiającej oferowanie narzędzi w oparciu o ich ocenę lub jakość. Powoduje to, że użytkownik ma problem w określeniu i wybraniu najlepszych rozwiązań spełniających jego potrzeby. Podczas gdy podstawowa technologia Node.js odznacza się wysoką jakością, to wiele jej narzędzi stworzonych przez społeczność, nie jest odpowiednio przetestowanych lub udokumentowanych. Dodatkowo część narzędzi nie spełnia wymogów odpowiednio wysokiej jakości.
W jaki sposób działa Node.js?
Istotą Node.js jest wykorzystanie silnika serwera opartego o nieblokujący model wejścia i wyjścia. Dzięki temu język JavaScript jest szybko i wydajnie tłumaczony na język maszynowy. W rezultacie otrzymujemy środowisko wykonywania, w którym kod JavaScript bardzo szybko porusza się w kierunku od serwera do klienta. Dzięki Node.js programiści mają większe możliwości w tworzeniu interaktywnych stron internetowych napisanych w języku JavaScript.
Dzięki działaniu na jednym wątku i wykorzystaniu nieblokującego modelu wejścia/wyjścia, Node.js pozwala na obsługę kilkunastu tysięcy równoczesnych połączeń przechowywanych w pętli zdarzeń. Dane są przesyłane bez ciągłego wykonywania zapytań. Warto dodać, że wszystkie zadania asynchroniczne są wykonywane przez pętlę zdarzeń, która zapewnia wysoki poziom reakcji, a tym samym przyczynia się do zwiększenia szybkości.
Gdzie warto stosować technologię Node.js?
Node.js wykorzystywany jest w wielu projektach i dziedzinach. Poniżej zaprezentujemy najpopularniejsze obszary i rozwiązania, w których wykorzystuje się tę technologię.
IoT
Dzięki swojej specyfice i strukturze Node.js obsługuje ogromną liczbę połączeń jednocześnie. Obsługa ogromnej ilości połączeń w czasie rzeczywistym odgrywa znaczącą rolę przy wyborze technologii dla systemów z obszaru IoT. Dodatkowo technologia umożliwia łatwą integrację z różnymi kontrolerami takimi jak Arduino wykorzystywanymi bardzo często w budowaniu urządzeń cyfrowych tworzących systemy IoT. Należy podkreślić, że powstało wiele pakietów umożliwiających szybszą i efektywniejszą integrację technologii z urządzeniami z zakresu IoT.
Czaty
Node.js oferuje zaawansowane funkcje niezbędne do tworzenia czatów o dowolnej złożoności. W technologii można tworzyć czaty grupowe do rozmów w czasie rzeczywistym oparte o model wiadomości błyskawicznych IM lub IRC (Internet Relay Chat). Technologia działa bardzo dobrze z protokołem WebSockets umożliwiającym szybką dwustronną wymianę wiadomości pomiędzy klientem a serwerem za pośrednictwem jednego otwartego połączenia. Proces budowania czatu z wykorzystaniem technologii jest bardzo prosty i polega na zainstalowaniu odpowiedniej biblioteki np. socket.io po stronie serwera i klienta.
SPA
Node.js świetnie sprawdza się w tworzeniu jednostronicowych aplikacji SPA (single page application). Technologia może zbudować SPA, której wygląd jest bardzo zbliżony do wyglądu aplikacji desktopowych. Ze względu na swoje wszechstronne możliwości, Node.js doskonale sprawdza się w budowaniu platform społecznościowych, dynamicznych stron internetowych i rozwiązań mailingowych. Pętla zdarzeń ułatwia zarządzanie wieloma współbieżnymi żądaniami klienta, co zapewnia bezproblemową aktualizację danych. Ponadto Node.js bardzo dobrze współpracuje z pakietami SPA bazującymi na danych. Warto dodać, że technologia jest napisana w tym samym języku co najbardziej popularne frameworki wykorzystywane do budowy SPA takie jak: Ember, Meteor, React i Angular. Dzięki temu programiści mogą używać tych samych struktur danych, podejść modułowych oraz tego samego języka zarówno po stronie serwera jak i klienta. W rezultacie skutkuje to szybszym rozwojem i łatwiejszym utrzymaniem SPA.
Serwisy streamingowe
Technologia bardzo dobrze nadaje się do tworzenia aplikacji wykorzystujących strumieniowe przesyłanie danych. Node.js umożliwia przesyłanie części kodu wykonywalnego na komputer lokalny, zachowując jednocześnie otwarte połączenie dla nowych żądań. Przesyłanie strumieniowe umożliwia użytkownikom zarówno wysyłanie żądań do siebie nawzajem, jak i bezpośrednio do miejsca docelowego. Nic dziwnego, że technologię wykorzystują największe serwisy streamingowe takie jak Netflix.
Gry przeglądarkowe
Technologia jest bardzo często wykorzystywana do tworzenia gier online. Node.js bardzo łatwo zintegrować z HTML5 wykorzystywanym dość często w budowaniu gier. Dodatkowo technologia posiada wiele frameworków takich jak Express.js lub Socket,io, które pozwalają na konstruowanie gier przeglądarkowych takich jak choćby: Ancient Beast lub PaintWar.
Popularność Node.js
Node.js został doceniony przez programistów z wielu powodów. Po pierwsze, jego duża popularność wynika ze stosowania języka JavaScript. Większość programistów znających JavaScript wybierze technologię stosującą właśnie ten język. Po drugie, możliwość pisania front-endu i back-endu w tym samym języku może być dużym ułatwieniem dla zespołu programistów. Do rosnącej popularności na pewno przyczynia się także duża ilość dostępnych bibliotek. Obecnie istnieje wiele frameworków, które znacznie usprawniają pracę deweloperów. Do najpopularniejszych należą między innymi Express.js i Socket.io. Kolejną zaletą jest obecność menadżera pakietów npm odpowiedzialnego za sprawne zarządzanie bibliotekami, dzięki czemu można szybko znaleźć bibliotekę realizującą wymagane funkcjonalności. Warto dodać, że technologię można uruchomić na urządzeniach zawierających procesory ARM, czyli takich, do których w dużej części należą urządzenia IoT.