Autor wybrał Open Internet/Free Speech Fund, aby otrzymać darowiznę w ramach programu Write for DOnations.
Wprowadzenie
W Node.js moduł jest zbiorem funkcji i obiektów JavaScript, które mogą być używane przez zewnętrzne aplikacje. Opisanie fragmentu kodu jako modułu odnosi się mniej do tego, czym jest kod, a bardziej do tego, co robi – każdy plik Node.js lub zbiór plików może być uznany za moduł, jeśli jego funkcje i dane są użyteczne dla zewnętrznych programów.
Ponieważ moduły zapewniają jednostki funkcjonalności, które mogą być ponownie wykorzystane w wielu większych programach, umożliwiają tworzenie luźno powiązanych aplikacji, które skalują się wraz ze złożonością i otwierają drzwi do dzielenia się swoim kodem z innymi programistami. Umiejętność pisania modułów, które eksportują przydatne funkcje i dane, pozwoli ci wnieść wkład w szerszą społeczność Node.js – w rzeczywistości wszystkie pakiety, których używasz na npm, zostały połączone i udostępnione jako moduły. To sprawia, że tworzenie modułów jest niezbędną umiejętnością dla programisty Node.js.
W tym tutorialu stworzysz moduł Node.js, który sugeruje, jakiego koloru twórcy stron internetowych powinni używać w swoich projektach. Stworzysz moduł przechowując kolory jako tablicę i dostarczając funkcję do losowego pobierania jednego z nich. Następnie prześledzimy różne sposoby importowania modułu do aplikacji Node.js.
Wymagania wstępne
- W twoim środowisku programistycznym musi być zainstalowany Node.js i npm. Ten tutorial używa wersji 10.17.0. Aby zainstalować to na macOS lub Ubuntu 18.04, wykonaj kroki w How To Install Node.js and Create a Local Development Environment na macOS lub w sekcji Installing Using a PPA w How To Install Node.js on Ubuntu 18.04. Mając zainstalowany Node.js, będziesz miał również zainstalowany npm; ten tutorial używa wersji 6.11.3.
- Powinieneś również znać plik
package.json
, a doświadczenie z poleceniami npm będzie również przydatne. Aby zdobyć to doświadczenie, postępuj zgodnie z How To Use Node.js Modules with npm and package.json, szczególnie Krok 1 – Tworzenie plikupackage.json
. - Pomocne będzie również wygodne posługiwanie się Node.js REPL (Read-Evaluate-Print-Loop). Będziesz go używał do testowania swojego modułu. Jeśli potrzebujesz więcej informacji na ten temat, przeczytaj nasz przewodnik Jak korzystać z Node.js REPL.
Krok 1 – Tworzenie modułu
Ten krok poprowadzi cię przez tworzenie twojego pierwszego modułu Node.js. Twój moduł będzie zawierał kolekcję kolorów w tablicy i dostarczy funkcję, aby uzyskać jeden losowo. Użyjesz wbudowanej właściwości Node.js exports
, aby udostępnić funkcję i tablicę zewnętrznym programom.
Na początku zdecydujesz, jakie dane o kolorach będziesz przechowywać w swoim module. Każdy kolor będzie obiektem, który zawiera właściwość name
, którą ludzie mogą łatwo zidentyfikować, oraz właściwość code
, która jest łańcuchem zawierającym kod koloru HTML. Kody kolorów HTML to sześciocyfrowe liczby szesnastkowe, które pozwalają na zmianę koloru elementów na stronie internetowej. Możesz dowiedzieć się więcej o kodach kolorów HTML, czytając ten artykuł Kody kolorów i nazwy HTML.
Następnie zdecydujesz, jakie kolory chcesz obsługiwać w swoim module. Twój moduł będzie zawierał tablicę o nazwie allColors
, która będzie zawierała sześć kolorów. Twój moduł będzie również zawierał funkcję o nazwie getRandomColor()
, która losowo wybierze kolor z tablicy i zwróci go.
W swoim terminalu utwórz nowy folder o nazwie colors
i przenieś do niego:
- mkdir colors
- cd colors
Zainicjalizuj npm, aby inne programy mogły zaimportować ten moduł w dalszej części samouczka:
- npm init -y
Użyłeś flagi -y
, aby pominąć zwykłe podpowiedzi, aby dostosować swój package.json
. Jeśli byłby to moduł, który chciałbyś opublikować w npm, odpowiedziałbyś na wszystkie te podpowiedzi, podając odpowiednie dane, jak wyjaśniono w rozdziale How To Use Node.js Modules with npm and package.json.
W tym przypadku twoje dane wyjściowe będą następujące:
Output{ "name": "colors", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": , "author": "", "license": "ISC"}
Teraz otwórz edytor tekstu wiersza poleceń, taki jak nano
, i utwórz nowy plik, który posłuży jako punkt wejścia dla twojego modułu:
- nano index.js
Twój moduł zrobi kilka rzeczy. Po pierwsze, zdefiniujesz klasę Color
. Twoja klasa Color
będzie instancjonowana z jej nazwą i kodem HTML. Dodaj następujące linie, aby utworzyć klasę:
class Color { constructor(name, code) { this.name = name; this.code = code; }}
Teraz, gdy masz już swoją strukturę danych dla Color
, dodaj kilka instancji do swojego modułu. Zapisz następującą wyróżnioną tablicę do swojego pliku:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;
Na koniec wprowadź funkcję, która losowo wybiera element z tablicy allColors
, którą właśnie utworzyłeś:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors;}exports.allColors = allColors;
Słowo kluczowe exports
odwołuje się do globalnego obiektu dostępnego w każdym module Node.js. Wszystkie funkcje i obiekty przechowywane w obiekcie exports
modułu są ujawniane, gdy inne moduły Node.js go importują. Na przykład, funkcja getRandomColor()
została utworzona bezpośrednio na obiekcie exports
. Następnie dodałeś właściwość allColors
do obiektu exports
, która odwołuje się do stałej lokalnej allColors
tablicy utworzonej wcześniej w skrypcie.
Gdy inne moduły zaimportują ten moduł, zarówno allColors
, jak i getRandomColor()
będą odsłonięte i dostępne do użycia.
Zapisz i zamknij plik.
Do tej pory utworzyłeś moduł zawierający tablicę kolorów i funkcję, która zwraca jeden losowo. Wyeksportowałeś również tablicę i funkcję, aby zewnętrzne programy mogły z nich korzystać. W następnym kroku użyjesz swojego modułu w innych aplikacjach, aby zademonstrować efekty export
.
Krok 2 – Testowanie modułu za pomocą REPL
Zanim zbudujesz kompletną aplikację, poświęć chwilę na potwierdzenie, że Twój moduł działa. W tym kroku użyjesz REPL do załadowania modułu colors
. Podczas pracy w REPL-u wywołasz funkcję getRandomColor()
, aby sprawdzić, czy zachowuje się ona tak, jak tego oczekujesz.
Uruchom REPL Node.js w tym samym folderze co plik index.js
:
- node
Po uruchomieniu REPL-a zobaczysz znak zachęty >
. Oznacza to, że możesz wprowadzić kod JavaScript, który zostanie natychmiast przetworzony. Jeśli chcesz dowiedzieć się więcej na ten temat, zapoznaj się z naszym przewodnikiem na temat używania REPL.
Najpierw wprowadź następujące polecenie:
- colors = require('./index');
W tym poleceniu require()
ładuje moduł colors
w jego punkcie wejścia. Po naciśnięciu klawisza ENTER
otrzymamy:
Output{ getRandomColor: , allColors: }
REPL pokazuje nam wartość colors
, czyli wszystkie funkcje i obiekty zaimportowane z pliku index.js
. Kiedy używasz słowa kluczowego require
, Node.js zwraca całą zawartość wewnątrz obiektu exports
modułu.
Przypomnij sobie, że dodałeś getRandomColor()
i allColors
do exports
w module colors
. Z tego powodu widzisz je oba w REPL-u, gdy są importowane.
Przy zachęcie przetestuj funkcję getRandomColor()
:
- colors.getRandomColor();
Podpowiedzi udzieli losowy kolor:
OutputColor { name: 'groovygray', code: '#D7DBDD' }
Ponieważ indeks jest losowy, twoje dane wyjściowe mogą się różnić. Teraz, gdy potwierdziłeś, że moduł colors
działa, opuść REPL Node.js:
- .exit
To przywróci cię do wiersza poleceń terminala.
Właśnie potwierdziłeś, że twój moduł działa zgodnie z oczekiwaniami przy użyciu REPL. Następnie zastosujesz te same koncepcje i załadujesz swój moduł do aplikacji, tak jak zrobiłbyś to w prawdziwym projekcie.
Krok 3 – Zapisanie lokalnego modułu jako zależności
Podczas testowania modułu w REPL, zaimportowałeś go ze ścieżką względną. Oznacza to, że użyłeś położenia pliku index.js
w stosunku do katalogu roboczego, aby uzyskać jego zawartość. Chociaż to działa, zazwyczaj lepszym doświadczeniem programistycznym jest importowanie modułów po ich nazwach, aby import nie został przerwany, gdy zmieni się kontekst. W tym kroku zainstalujesz moduł colors
za pomocą npm’s local module install
feature.
Ustaw nowy moduł Node.js poza folderem colors
. Najpierw przejdź do poprzedniego katalogu i utwórz nowy folder:
- cd ..
- mkdir really-large-application
Teraz przejdź do swojego nowego projektu:
- cd really-large-application
Podobnie jak w przypadku modułu colors
, zainicjalizuj swój folder za pomocą npm:
- npm init -y
Zostanie wygenerowany następujący package.json
:
Output{ "name": "really-large-application", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": , "author": "", "license": "ISC"}
Teraz zainstaluj swój moduł colors
i użyj flagi --save
, aby został on zapisany w twoim pliku package.json
:
- npm install --save ../colors
Właśnie zainstalowałeś swój moduł colors
w nowym projekcie. Otwórz plik package.json
, aby zobaczyć nową lokalną zależność:
- nano package.json
Zobaczysz, że zostały dodane następujące wyróżnione linie:
{ "name": "really-large-application", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": , "author": "", "license": "ISC", "dependencies": { "colors": "file:../colors" }}
Wyjdź z pliku.
Moduł colors
został skopiowany do twojego katalogu node_modules
. Sprawdź, czy tam jest, wykonując następujące polecenie:
- ls node_modules
To da następujący wynik:
Outputcolors
Użyj zainstalowanego modułu lokalnego w tym nowym programie. Ponownie otwórz edytor tekstu i utwórz kolejny plik JavaScript:
- nano index.js
Twój program najpierw zaimportuje moduł colors
. Następnie wybierze kolor losowo przy użyciu funkcji getRandomColor()
dostarczonej przez ten moduł. Na koniec wydrukuje na konsoli komunikat, który powie użytkownikowi, jakiego koloru użyć.
Wprowadź następujący kod w index.js
:
const colors = require('colors');const chosenColor = colors.getRandomColor();console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);
Zapisz i zamknij ten plik.
Twoja aplikacja podpowie teraz użytkownikowi losową opcję koloru dla komponentu strony internetowej.
Uruchom ten skrypt z:
- node index.js
Twoje dane wyjściowe będą podobne do:
OutputYou should use leafygreen on your website. It's HTML code is #48C9B0
Teraz pomyślnie zainstalowałeś moduł colors
i możesz nim zarządzać jak każdym innym pakietem npm używanym w twoim projekcie. Jeśli jednak dodasz więcej kolorów i funkcji do swojego lokalnego modułu colors
, będziesz musiał uruchomić npm update
w swoich aplikacjach, aby móc korzystać z nowych opcji. W następnym kroku użyjesz lokalnego modułu colors
w inny sposób i otrzymasz automatyczne aktualizacje, gdy kod modułu ulegnie zmianie.
Krok 4 – Łączenie modułu lokalnego
Jeśli Twój lokalny moduł jest intensywnie rozwijany, ciągłe aktualizowanie pakietów może być uciążliwe. Alternatywą jest powiązanie modułów. Powiązanie modułu zapewnia, że wszelkie aktualizacje modułu są natychmiast odzwierciedlane w aplikacjach z niego korzystających.
W tym kroku połączysz moduł colors
z twoją aplikacją. Zmodyfikujesz również moduł colors
i potwierdzisz, że jego najnowsze zmiany działają w aplikacji bez konieczności ponownej instalacji lub aktualizacji.
Najpierw odinstaluj swój lokalny moduł:
- npm un colors
npm łączy moduły za pomocą dowiązań symbolicznych (lub symlinków), które są odwołaniami wskazującymi na pliki lub katalogi w komputerze. Łączenie modułu odbywa się w dwóch krokach:
- Tworzenie globalnego łącza do modułu. npm tworzy symlink między twoim globalnym katalogiem
node_modules
a katalogiem twojego modułu. Globalny katalognode_modules
jest lokalizacją, w której są zainstalowane wszystkie systemowe pakiety npm (każdy pakiet, który instalujesz z flagą-g
). - Tworzenie lokalnego łącza. npm tworzy symlink między lokalnym projektem, który używa modułu, a globalnym łączem modułu.
Po pierwsze, utwórz globalne łącze, powracając do folderu colors
i używając polecenia link
:
- cd ../colors
- sudo npm link
Po zakończeniu, twoja powłoka wyprowadzi:
Output/usr/local/lib/node_modules/colors -> /home/sammy/colors
Właśnie utworzyłeś symlink w swoim folderze node_modules
do swojego katalogu colors
.
Powróć do folderu really-large-application
i połącz pakiet:
- cd ../really-large-application
- sudo npm link colors
Otrzymasz dane wyjściowe podobne do poniższych:
Output/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors
Uwaga: Jeśli chcesz pisać nieco mniej, możesz użyć ln
zamiast link
. Na przykład npm ln colors
zadziałałoby dokładnie tak samo.
Jak pokazuje wyjście, właśnie utworzyłeś symlink z lokalnego katalogu node_modules
twojego really-large-application
do symlinka colors
w twoim globalnym node_modules
, który wskazuje na rzeczywisty katalog z modułem colors
.
Proces łączenia został zakończony. Uruchom swój plik, aby upewnić się, że nadal działa:
- node index.js
Twoje dane wyjściowe będą podobne do:
OutputYou should use sunkissedyellow on your website. It's HTML code is #F4D03F
Funkcjonalność twojego programu jest nienaruszona. Następnie należy sprawdzić, czy aktualizacje są natychmiast stosowane. W edytorze tekstu otwórz ponownie plik index.js
w module colors
:
- cd ../colors
- nano index.js
Teraz dodaj funkcję, która wybierze najlepszy odcień niebieskiego, jaki istnieje. Nie przyjmuje ona żadnych argumentów i zawsze zwraca trzeci element tablicy allColors
. Dodaj te wiersze na końcu pliku:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors; }exports.allColors = allColors;exports.getBlue = () => { return allColors;}
Zapisz i zamknij plik, a następnie otwórz ponownie plik index.js
w folderze really-large-application
:
- cd ../really-large-application
- nano index.js
Wywołaj nowo utworzoną funkcję getBlue()
i wypisz zdanie z właściwościami koloru. Dodaj te stwierdzenia do końca pliku:
const colors = require('colors');const chosenColor = colors.getRandomColor();console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);const favoriteColor = colors.getBlue();console.log(`My favorite color is ${favoriteColor.name}/${favoriteColor.code}, btw`);
Zapisz i zamknij plik.
Kod używa teraz nowo utworzonej funkcji getBlue()
. Wykonaj plik tak jak poprzednio:
- node index.js
Uzyskasz dane wyjściowe jak:
OutputYou should use brightred on your website. It's HTML code is #E74C3CMy favorite color is skyblue/#5DADE2, btw
Twój skrypt był w stanie użyć najnowszej funkcji w module colors
, bez konieczności uruchamiania npm update
. Ułatwi to wprowadzanie zmian w tej aplikacji w trakcie rozwoju.
Jak piszesz większe i bardziej złożone aplikacje, zastanów się, jak powiązany kod może być pogrupowany w moduły i jak chcesz, aby te moduły były skonfigurowane. Jeśli twój moduł będzie używany tylko przez jeden program, może on pozostać w tym samym projekcie i być przywoływany przez względną ścieżkę. Jeśli moduł będzie później udostępniany osobno lub znajduje się w zupełnie innym miejscu niż projekt, nad którym teraz pracujesz, instalowanie lub łączenie może być bardziej opłacalne. Moduły, które są aktywnie rozwijane, również korzystają z automatycznych aktualizacji dzięki łączeniu. Jeśli moduł nie jest aktywnie rozwijany, użycie npm install
może być łatwiejszą opcją.
Zakończenie
W tym poradniku dowiedziałeś się, że moduł Node.js jest plikiem JavaScript z funkcjami i obiektami, które mogą być używane przez inne programy. Następnie utworzyłeś moduł i dołączyłeś swoje funkcje i obiekty do globalnego obiektu exports
, aby udostępnić je zewnętrznym programom. Na koniec zaimportowałeś ten moduł do programu, demonstrując, jak moduły łączą się w większe aplikacje.
Teraz, gdy wiesz, jak tworzyć moduły, pomyśl o typie programu, który chcesz napisać, i podziel go na różne komponenty, zachowując każdy unikalny zestaw działań i danych w ich własnych modułach. Im więcej praktyki zdobędziesz pisząc moduły, tym lepiej będziesz w stanie pisać wysokiej jakości programy Node.js podczas swojej podróży edukacyjnej. Aby prześledzić przykład aplikacji Node.js, która używa modułów, zobacz nasz poradnik How To Set Up a Node.js Application for Production on Ubuntu 18.04.
.