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 pliku package.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ę:

~/colors/index.js
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:

~/colors/index.js
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ś:

~/colors/index.js
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:

Output
Color { 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:

~/really-large-application/package.json
{ "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:

Output
colors

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:

~/really-large-application/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:

Output
You 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:

  1. Tworzenie globalnego łącza do modułu. npm tworzy symlink między twoim globalnym katalogiem node_modules a katalogiem twojego modułu. Globalny katalog node_modules jest lokalizacją, w której są zainstalowane wszystkie systemowe pakiety npm (każdy pakiet, który instalujesz z flagą -g).
  2. 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:

Output
You 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:

~/colors/index.js
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:

~/really-large-application/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}`);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:

Output
You 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.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.