Czasami najdzie mnie ochota na spróbowanie czegoś zupełnie nowego i ostatnio padło na technologie backendowe. W końcu warto spojrzeć na cały proces wymiany danych nie tylko z punktu widzenia ‚klienta’. Bardzo dawno temu udało mi się napisać prosty webserwis z wykorzystaniem Node.js, dlatego postanowiłem odświeżyć trochę temat. Pobawiłem się w tej technologi przez kilka weekendów i napisałem krótki, dwuczęściowy poradnik o tym jak zacząć pracę z Node’m. Jeżeli ciekawi Cię ten temat to zapraszam do lektury 🤓.

Do pracy z Node’em konieczna jest przynajmniej podstawowa znajomość języka JavaScript, którego nie będę tutaj omawiał. Instrukcje, z których będziesz korzystał nie będą jednak na tym etapie zbyt skomplikowane. Znajomość innego języka programowania powinna wystarczyć do zrozumienia poszczególnych instrukcji.

 

 

Czym jest Node?

 

Historia Node.js swój początek miała w 2009 roku za sprawą Ryan’a Dahl’a. Rozpoczął on prace nad projektem, który w kolejnych latach dokonał małej rewolucji w technologiach backendu, czyli stronie serwerowej aplikacji. Według oficjalnej definicji Node jest środowiskiem wykonawczym przeznaczonym głównie do tworzenia aplikacji internetowych – z dużym naciskiem na serwery www. Można również za jego pomocą tworzyć aplikacje desktopowe, chociaż jest to rzadziej spotykany wariant.

Według luźniejszej definicji Node jest narzędziem, które pozwoliło językowi JavaScript ewoluować i wyjść poza obsługę przeglądarek internetowych. Pozwolił on na uruchamianie programów bezpośrednio na maszynie docelowej, czyli na przykład na serwerze.

Działanie Node’a opiera się na silniku, którego pełna nazwa brzmi V8 JavaScript runtime engine. Na tym samym silniku została również oparta dobrze wszystkim znana przeglądarka Chrome. Zapewne zdążyłeś już wywnioskować, że za silnik ten odpowiedzialna jest firma Google, która udostępnia go na zasadach open-source.

Silnik V8 “tłumaczy” kod, który napisałeś w języku JavaScript na kod maszynowy rozpoznawalny przez urządzenie, na którym został uruchomiony dany program. Bardziej profesjonalna nazwa tego procesu to kompilacja 😜. Sam silnik V8 został jednak napisany przy użyciu języka C++, co jest zupełnie zrozumiałe, bo język ten określany jest mianem niskopoziomowego.

Oznacza to, że C++ jest bardzo dobrze przystosowany do bliskiej współpracy z poszczególnymi komponentami maszyny, na której pracuje. Takie języki jak na przykład Java lub Swift określane są mianem języków wysokopoziomowych. To z kolei oznacza, że wiele operacji związanych na przykład z zarządzaniem pamięcią jest obsługiwana automatycznie. Nie oznacza to jednak, że odpowiedzialność programisty została całkowicie wyłączona 😅. Po prostu ma sporo mniej na głowie.

Aktualnie rozwojem standardu zajmuje się Fundacja Node.js. Jeżeli interesuje Cię historia Node’a w szerszym ujęciu to polecam zajrzeć pod ten link.

 

Dlaczego warto wybrać Node’a?

 

W ostatnich latach Node zyskał znacznie na popularności. Nawet w Polsce możesz z powodzeniem poszukać bardzo dobrze płatnej pracy na stanowisku programisty Node.js.

Jego pierwszą niewątpliwą zaletą jest fakt, że podczas pracy z Node’em możesz skorzystać z języka JavaScript. Umożliwia to uzyskanie pewnej spójności na poziomie całego stosu technologicznego. Większość bibliotek stworzonych z myślą o projektowaniu frontendu aplikacji webowych została oparta właśnie na JavaScript. Node.js w pewnym sensie umożliwił płynne połączenie backendu z frontendem.

Na oficjalnej stronie projektu – nodejs.org – możesz znaleźć krótką definicję Node’a według samych autorów:

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

O silniku V8 napisałem już troche wcześniej, więc to powinno być już dla Ciebie jasne. Pozostaje jeszcze wyjaśnienie co oznacza event driven / non-blocking I/O oraz czym dokładnie jest npm i jak z niego skorzystać.

 

Event driven / non-blocking I/O

Tradycyjne podejście w relacji klient-serwer zakłada, że każde żądanie wysłane przez klienta tworzy nowy wątek, który zajmuje pewną ilość pamięci RAM systemu. Jeżeli takich żądań (połączeń) będzie zbyt wiele to RAM może nie wytrzymać, a system odmówić posłuszeństwa.

Node.js podszedł do sprawy trochę inaczej i wszystkie operacje wykonuje na jednym wątku, korzystając z operacji wejścia / wyjścia (I/O), które wzajemnie się nie blokują. Operacje I/O są wykonywane przez aplikacje niemal bez przerwy – może to być zapis do pliku, odczyt z bazy danych lub próba uzyskanie dostępu do treści znajdujących się na innym serwerze.

Dzięki swojemu unikalnemu podejściu, Node jest w stanie obsłużyć dziesiątki tysięcy połączeń jednocześnie, przy zachowaniu pełnej dostępności zasobów. Jest to oczywiście bardzo uproszczone wyjaśnienie, ale na początku Twojej przygody z Node’em tyle w zupełności wystarczy 😉.

 

NPM: The Node Package Manager

Npm jest instalowany w pakiecie z samym Node’em, więc nie musisz wykonywać żadnych dodatkowych kroków, aby uzyskać do niego dostęp. Node Package Manager jest narzędziem przeznaczonym do zarządzania zależnościami w projekcie – np. określenie z jakich bibliotek oraz konkretnych wersji Twój program będzie korzystał. Dzięki niemu uzyskujesz dostęp do kilkuset tysięcy bibliotek rozpowszechnianych na zasadach open source. Jeżeli miałeś do czynienia z programowaniem na platformę iOS, to npm może słusznie kojarzyć Ci się z CocoaPods. Jeżeli nie to nic straconego 😉. W dalszej części poradnika będziesz mógł zobaczyć jak npm sprawdza się w praktyce.

Myślę, że jak na pierwszy kontakt z platformą Node tyle suchej teorii w zupełności wystarczy. Czas zabrać się za część praktyczną.

 

Instalacja Node.js

 

Ja swoją instalację wykonywałem na maszynie z Windowsem, ale na platformie OSX wszystkie kroki są identyczne. W dowolnej przeglądarce internetowej wpisz adres nodejs.org. Przywita Cię mniej więcej taki ekran:

 

 

Za pomocą tej strony będziesz mógł pobrać instalację całego pakietu Node. Polecam wybranie wersji znajdującej się po lewej stronie, z rozszerzeniem LTS (Long-Term Support). Skrótem tym oznaczana jest najbardziej stabilna wersja rekomendowana dla większości użytkowników, z naciskiem na użytkowników biznesowych.

Jej największą zaletą jest fakt, że posiada ona ściśle określony cykl wprowadzania nowych wersji z jasno zdefionowanym okresem wsparcia. Taka stabilność w środowisku biznesowym jest wymagana. W Twoim przypadku również sprawdzi się bardzo dobrze.

Wersja znajdująca się po prawej stronie (określana jako Current) jest najnowszą wersją Noda’a, w której zostały zaimplementowane funkcje eksperymentalne. Z racji tego, że wersja Current nie ma już tak ściśle narzuconego cyklu wydawniczego, może nie być najlepszym rozwiązaniem dla użytkowników biznesowych.

Na pewnym etapie wersja Current mianowana zostaje na wersję LTS – w przypadku Node’a zwykle jest to wersja o numerze parzystym. Na przykład Node w wersji 8.9.0 został w październiku 2017 mianowany na wersję Node 8 LTS, a wersją Current została ta z numerem 9. Trochę to zakręcone, ale z czasem to tego przywykniesz 😉. Podczas pisania tego poradnika najbardziej aktualną wersją LTS był Node 8.11.3.

Wróćmy do instalacji. Strona sama zaproponuje Ci wersję Noda odpowiednią dla Twojego systemu, ale warto zwrócić uwagę czy wszystko się zgadza. Po pobraniu pakietu na dysk twardy możesz rozpocząć proces instalacji. Nie odbiega on niczym od instalacji dowolnego programu w systemie, więc nie napotkasz tu żadnych problemów.

Zwróć tylko uwagę na ekran Custom Setup. Upewnij się, że masz zaznaczoną opcję „Add to Path”. Doda ona do systemu globalną zmienną, która pozwoli na korzystanie ze wszystkich narzędzi w dowolnym projekcie.

Po zakończeniu instalacji uruchom systemowy terminal i wpisz poniższe polecenie:

Za jego pomocą sprawdzisz jaka wersja Node’a została zainstalowana na Twoim komputerze, a tym samy upewnisz się, że instalacja została wykonana poprawnie. Widok w terminalu powinien wyglądać mniej więcej tak:

 

 

Jeżeli pojawi się informacja ‚node’ is not recognized as an internal or external command, operable program or batch file’, to oznacza, że podczas instalacji coś poszło nie tak, albo nie zaznaczyłeś opcji „Add to Path”, o której wspomniałem powyżej. W razie konieczności odinstaluj Node z systemu i wykonaj instalację ponownie.

Jeżeli wszystko poszło zgodnie z planem to Node powinien być już gotowy do użycia. Możesz to sprawdzić w bardzo prosty sposób. Uruchom konsolę i wpisz następujące polecenie:

W tej chwili ekran powinien wyglądać tak:

 

 

Uruchomiłeś właśnie środowisko wykonawcze, które będzie w stanie zinterpretować wpisany przez Ciebie kod JavaScript bezpośrednio z poziomu konsoli. Żeby to potwierdzić wpisz w konsoli następujące polecenie, a następnie naciśnij enter:

Funkcja log jest chyba jedną z najprostszych funkcji ze standardowej biblioteki i odpowiada za wyświetlenie tekstu w oknie terminala. Jeżeli widok w Twojej konsoli prezentuje się tak jak na poniższym obrazku, to gratuluję 😉. Node został poprawnie skonfigurowany.

 

 

Oczywiście pisząc bardziej złożone programy nie będziesz korzystał z terminala, a z normalnego edytora. Więcej na ten temat dowiesz się za chwilę, w sekcji Instalacja Edytora. Wyrażenie ‚undefined’ znajdujące się pod „Hello Node” jest związane ze specyficznym zachowaniem języka JavaScript. W języku tym każda funkcja musi coś zwracać. Jeżeli nie określisz typu zwracanego (tak jak w przypadku funkcji log), to funkcja zwróci właśnie ‚undefined’. Nie ma to jednak żadnego wpływu na działanie samego programu.

 

Instalacja edytora

 

Do pisania aplikacji w Node.js nie będzie potrzebne Ci skomplikowane IDE jak Android Studio, czy też Xcode. Tak na dobrą sprawę to wystarczy zwykły edytor tekstowy, ale tego oczywiście nie polecam 😉. Ja korzystam z Atom’a, którego możesz pobrać za darmo pod adresem atom.io. Wystarczy pobrać paczkę i zainstalować tak jak każdy program.

Atom jest bardzo łatwy w obsłudze i posiada możliwość instalowania wielu przydatnych narzędzi (plugins). Przykładowo możesz z poziomu edytora uruchamiać okno terminala, co pozwala zaoszczędzić sporo czasu. Jedną z wtyczek obsługujących takie bajery jest Terminal-Plus. Instalacji możesz dokonać wchodząc kolejno w File > Settings, a następnie wybierając zakładkę Install z menu, które się pojawi.  Gorąco polecam 👍.

A jak byś bardzo chciał skorzystać z innych opcji to proponuję rzucić okiem na Visual Studio Code.

 

Uruchomienie pierwszej aplikacji w Node

 

Skoro cały pakiet jest już gotowy to możesz zabrać się za pisanie prostej aplikacji, która pomoże Ci zrozumieć jak poszczególne elementy ze sobą współpracują. Zacznij od utworzenia np. na pulpicie folderu o nazwie first_node. Zwróć uwagę na pisownię. Używanie spacji w nazwach nie jest dobrym pomysłem, ponieważ większość operacji będziesz wykonywał za pośrednictwem terminala, a ten za spacjami nie przepada.

Uruchom teraz edytor Atom i za pomocą górnego menu wybierz File > Open Folder, a następnie wybierz folder, który przed chwilę utworzyłeś. W lewym oknie prezentowana jest cała struktura projektu. W tej chwili jest ona bardzo skromna, ale z czasem się to zmieni. Kliknij teraz prawym przyciskiem myszy na nazwę folderu i wybierz opcję New File. Jako nazwę podaj app.js. Struktura powinna teraz wyglądać tak:

 

 

To będzie punkt startowy Twojej aplikacji, w którym za chwilę umieścisz pierwszą linijkę kodu. Dodaj do pliku app.js poniższy fragment i zapisz zmiany:

To właściwie wszystko czym będzie zajmowała się ta aplikacja 🤣. Jeżeli się nad tym zastanawiasz to podpowiem, że w nowszych wersjach języka JavaScript nie ma konieczności używania średnika na końcu instrukcji.

Przejdź teraz do okna terminalu i za jego pomocą udaj się do folderu first_node. Jeżeli projekt utworzyłeś na pulpicie to okno Twojego terminala powinno wyglądać podobnie do poniższego obrazka:

 

 

Gdybyś miał wątpliwości i chciał sprawdzić co znajduje się w bieżącym folderze to możesz to zrobić za pomocą polecenia dir w przypadku Windowsa oraz ls w przypadku Linuxa i OSX:

 

 

W folderze znajduje się utworzony przed chwilą plik app.js, który jak już wspomniałem jest punktem startowym. Do uruchomienia aplikacji wykorzystuje się polecenie node, a następnie podaje się nazwę pliku, w którym został umieszczony kod do wykonania. Wpisz teraz do konsoli następującą instrukcję:

W wyniku tej operacji w konsoli powinien zostać wyświetlony tekst „Hello Node!”:

 

 

Gratulacje! Właśnie napisałeś swoją pierwszą aplikację za pomocą Node.js. Najlepsze jednak jeszcze przed Tobą 😉.

 

Podsumowanie

 

W tej części poradnika zapoznałeś się bliżej z filozofią jaka kryje się za Node.js oraz jego podstawowymi możliwościami. Przeprowadziłeś też wstępną konfigurację całego pakietu oraz stworzyłeś bardzo prostą aplikację. W następnej części zaczyna się prawdziwa zabawa. Zbudujemy wspólnie serwer webowy, który posłuży Ci do obsługi prostej strony internetowej.

 


 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *