Node.js dla początkujących – Moduły node.js.

System modułów w node.js to nie tylko bardzo wygodny sposób na organizacje kodu. To wręcz niezbędny element programów pisanych w tym środowisku.

Mówiąc wprost: jeśli nie używasz modułów w swoich programach node, robisz to źle 🙂 . Ale spokojnie, dziś postaram się wyjaśnić Ci podstawy tego zagadnienia. W mgnieniu oka zaczniesz korzystać z npm’a lub będziesz budował własne moduły.

Moduły node.js

Moduły w Node to nie to samo, co prosty wzorzec projektowy często używany w JS. Konstrukcja tego systemu jest trochę bardziej skomplikowana. Jeżeli ktoś chce dokładnie poznać mechanizm, który za to odpowiada, polecam książkę Zrozumieć JavaScript (i szczerze mówiąc, polecam też każdemu zgłebienie tego zagadnienia). Rozdział dziesiąty całkiem przystępnie opisuje działa ten system.

W systemie modułów w nodzie mamy cztery podstawowe zasady:

  • Każdy plik to osobny moduł.
  • Każdy plik ma dostęp do obiektu module.
  • Właściwości modułów, które mają być publicznie dostępne dla innych modułów, umieszcza się w obiekcie exports, który jest polem dla module.
  • Aby zaimportować eksportowany interfejs jakiegoś modułu, należy użyć metody require obiektu.

Jak to wygląda w praktyce? Szybki przykład. Stworzyłem dwa pliki main.js oraz hello.js. Oba znajdują się w tym samym katalogu. hello.js to moduł, który zawiera kod, odpowiedzialny za wyświetlanie powitania w konsoli. Treść tego pliku wygląda tak:

Natomiast plik main.js będzie, jak nazwa wskazuje, głównym plikiem programu. W nim importuje moduł hello a następnie go używam:

Wynik działania taki jak przewidziałem:

Moduły node.js

Jeżeli to wygląda mało skomplikowanie to dobrze. Nie ma w tym nic trudnego :). Jak widać do obiektu require przekazałem ścieżkę prowadzącą do odpowiedniego pliku. W Node, można (i powinno się) pominąć rozszerzenie ‚.js’. Z zasady, moduły są tworzone tylko w tym języku. Warto uwagę na to jak przekazuje moduł do require, bo są też inne sposoby 🙂 .

Ale moduły to nie tylko pisane przez programistę pliki. To tylko jeden ich rodzaj, a w Node możemy wyróżnić trzy: moduły core, czyli wbudowane, moduły zewnętrzne oraz moduły plików.

Moduły wbudowane, to takie, których nie trzeba instalować. Są one zawsze dostępne w node. Aby z nich korzystać wystarczy w swoim programie użyć funkcji require. Przykładem takiego modułu jest readline, z którego korzystałem w ostatnim wpisie. Listę wbudowanych modułów można znaleźć w dokumentacjach nodea.

W przypadku modułów wbudowanych, wystarczy funkcji require, przekazać nazwę modułów. Nie ma potrzeby podawanie dokładnej ścieżki do pliku. Node sam potrafi go odnaleźć.

Drugi rodzaj modułów w Node.js, to moduły zewnętrzne. Im poświęcę najwięcej miejsca w tym wpisie. Są one bardzo ważne i chyba najczęściej używane w projektach. Można by powiedzieć, że moduły zewnętrzne różnią się od takich napisanych przez właściciela projektu tylko tym, że napisał je ktoś inny i umieścił w odpowiedniej bazie. Bazę takich modułów można znaleźć na stronie NPM.

Pierwszym odruchem kogoś, kto chciałby zainstalować taki moduł, byłoby pewnie ściągnięcie odpowiedniego pliku z git’a, wrzucenie go do katalogu projektowego i dodanie do swojego kodu za pomocą require, przekazując ścieżkę do pliku modułu. Sposób ten zadziała, ale nie jest zbyt efektywny. Tym bardziej, że do dyspozycji dużo lepsze narzędzie: npm.

npm to node package manager, czyli manadżer pakietów node 🙂 . Robi dokładnie to co mówi nazw 🙂 zarządza modułami. Zakładając, że chcę dodać do swojego projektu bibliotekę underscore. Wystarczy, że wpiszę w konsoli taką komendę:

Użycie tej komendy utworzy w aktualnym katalogu katalog node_modules a wewnątrz katalog z plikami underscore. Node zawsze wie o istnieniu katalogu node_modules i pozwala na korzystanie z zawartych w nim modułów w każdym projekcie.

To oznacza, że teraz mogę korzystać w swoich projektach z underscore’a tak jakby był modułem wbudowanym. Czyli nie muszę podawać w require bezpośredniej ścieżki do pliku, mogę po prostu napisać:

I to już jest dobra praktyka. Ale nie najlepsza… W końcu katalog node_modules znajduje się na dysku na moim komputerze. A co gdy będę chciał wrzucić mój projekt na serwer, straci on dostęp do odpowiednich modułów. Niby mogę zainstalować je w środowisku produkcyjnym, ale co jeśli korzystam z bardzo wielu modułów (a często tak jest). Instalowanie każdego z osoba robi się to trochę męczące… Ale i z tego jest wyjście.

npm ma bardzo ciekawą funkcję init. Aby z niej skorzystać wystarczy będą w katalogu projektowym wpisać w konsoli npm init. Efekt będzie wyglądał mniej więcej tak:

npmInit

Node zada parę pytań i tak naprawdę na żadne z nich nie trzeba odpowiadać, wystarczy każde z nich potwierdzić enterem. Jedyne, na które warto zwrócić uwagę to „entry point”, w jego przypadku należy podać główny plik JS. Po tej nazwie node będzie szukał głównych funkcji projektu. Domyślnie jest to index.js.

Efektem tego działania, będzie nowy plik w katalogu projektowym package.json. To jest plik, do którego zagląda się często więc warto się z nim zaprzyjaźnić i zadać sobie trud odszyfrowania znaczenia jego zawartości 🙂 .

Początkowo zawartość mojego pliku package.json wygląda tak:

Nie zawiera on jeszcze tego co jest mi potrzebne, czyli pola „dependencies”. W takim razie, dodam je:

dependecies zawiera obiekt, który będzie listą wszystkich potrzebnych mi modułów. Klucze będą nazwami modułów, a wartości to wersje, z których chcę skorzystać. W przypadku wersji można po prostu wpisać gwiazdkę, co oznaczać będzie najnowszą wersję. Zaktualizowany plik package.json:

Teraz wystarczy, że w katalogu projektowym wywołam komendę:

To zainstaluje lokalnie wszystkie moduły wpisane w obiekcie dependencies. W tym wypadku będzie to tylko jeden moduł, ale w trakcie rozwoju projektu, mogę z łatwością dodawać kolejne i zainstalowanie ich będzie kwestią jednej komendy. Oczywiście npm nie pobiera zainstalowanych już modułów.

Ostatni rodzaj modułów, to moduły, które tworzone są przez programistę na potrzeby projektu. O nich tak naprawdę pisałem już na początku 🙂 . Więcej na ich temat pokaże w przyszłych postach, poświęconych własnym projektom.

Mam nadzieję, że to wszystko wydaje się w miarę proste, bo takie właśnie jest. Oczywiście sama teoria na niewiele się zda, ale zanim w kolejnych postach przejdę do konkretnych projektów / przykładów, musiałem ją przytoczyć. Jeżeli do teraz nie do końca załapałeś o co w tym wszystkim chodzi, nie martw się. Gdy zobaczysz praktyczny przykład, na pewno wszystko ułoży się w spójną całość.

Aby na pewno nie przegapić kolejnych postów zachęcam do polubienia mojej strony na facebooku. Zawsze umieszczam tam informacje o nowościach na blogu. Jest to też dobre miejsce na kontakt ze mną, jeżeli ktoś ma jakieś wątpliwości. Jak najbardziej zachęcam też do zadawania pytań i dzielenia się opiniami w komentarzach poniżej 🙂 .

Dodaj komentarz

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