Autor si vybral nadaci Open Internet/Free Speech Fund, které přispěl v rámci programu Write for DOnations.
Úvod
Modul je v Node.js kolekce funkcí a objektů JavaScriptu, které mohou používat externí aplikace. Popis kusu kódu jako modulu se vztahuje méně k tomu, co je kód zač, a více k tomu, co dělá – jakýkoli soubor nebo kolekci souborů Node.js lze považovat za modul, pokud jsou jeho funkce a data použitelné pro externí programy.
Protože moduly poskytují jednotky funkcí, které lze opakovaně použít v mnoha větších programech, umožňují vytvářet volně vázané aplikace, které se škálují se složitostí, a otevírají vám dveře ke sdílení kódu s dalšími vývojáři. Schopnost psát moduly, které exportují užitečné funkce a data, vám umožní přispívat širší komunitě Node.js – ve skutečnosti byly všechny balíčky, které používáte v npm, svázány a sdíleny jako moduly. Vytváření modulů je tak pro vývojáře Node.js nezbytnou dovedností.
V tomto tutoriálu vytvoříte modul Node.js, který navrhne, jakou barvu by měli vývojáři webových stránek používat ve svých návrzích. Modul vytvoříte tak, že barvy uložíte jako pole a poskytnete funkci pro náhodné načtení jedné z nich. Poté si projdete různé způsoby importu modulu do aplikace Node.js.
Předpoklady
- Ve svém vývojovém prostředí budete potřebovat nainstalovaný Node.js a npm. Tento návod používá verzi 10.17.0. Chcete-li ji nainstalovat na macOS nebo Ubuntu 18.04, postupujte podle pokynů v části Jak nainstalovat Node.js a vytvořit místní vývojové prostředí na macOS nebo v části Instalace pomocí PPA v části Jak nainstalovat Node.js na Ubuntu 18.04. Tím, že máte nainstalovaný Node.js, budete mít také nainstalované npm; tento návod používá verzi 6.11.3.
- Měli byste také znát soubor
package.json
a hodila by se vám také zkušenost s příkazy npm. Chcete-li tyto zkušenosti získat, postupujte podle návodu Jak používat moduly Node.js pomocí npm a package.json, zejména podle části Krok 1 – Vytvoření souborupackage.json
. - Pomůže vám také znalost příkazů Node.js REPL (Read-Evaluate-Print-Loop). Ten budete používat k testování svého modulu. Pokud o tom potřebujete více informací, přečtěte si naši příručku Jak používat Node.js REPL.
Krok 1 – Vytvoření modulu
Tento krok vás provede vytvořením vašeho prvního modulu Node.js. Váš modul bude obsahovat kolekci barev v poli a poskytne funkci pro náhodné získání jedné z nich. Ke zpřístupnění funkce a pole externím programům použijete vestavěnou vlastnost Node.js exports
.
Nejprve se rozhodnete, jaké údaje o barvách budete ve svém modulu uchovávat. Každá barva bude objektem, který obsahuje vlastnost name
, kterou mohou lidé snadno identifikovat, a vlastnost code
, což je řetězec obsahující kód barvy HTML. Kódy barev HTML jsou šestimístná hexadecimální čísla, která umožňují měnit barvu prvků na webové stránce. Více informací o kódech barev HTML se dozvíte z tohoto článku Kódy a názvy barev HTML.
Poté se rozhodnete, jaké barvy chcete ve svém modulu podporovat. Váš modul bude obsahovat pole nazvané allColors
, které bude obsahovat šest barev. Váš modul bude také obsahovat funkci s názvem getRandomColor()
, která náhodně vybere barvu z vašeho pole a vrátí ji.
V terminálu vytvořte novou složku s názvem colors
a přesuňte se do ní:
- mkdir colors
- cd colors
Inicializujte npm, aby ostatní programy mohly tento modul později v tutoriálu importovat:
- npm init -y
Pomocí příznaku -y
jste přeskočili obvyklé výzvy k přizpůsobení vašeho package.json
. Pokud by se jednalo o modul, který byste chtěli publikovat v npm, odpověděli byste na všechny tyto výzvy příslušnými údaji, jak je vysvětleno v kapitole Jak používat moduly Node.js pomocí npm a package.json.
V tomto případě bude váš výstup vypadat takto:
Output{ "name": "colors", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": , "author": "", "license": "ISC"}
Nyní otevřete textový editor příkazového řádku, například nano
, a vytvořte nový soubor, který bude sloužit jako vstupní bod pro váš modul:
- nano index.js
Váš modul bude dělat několik věcí. Za prvé budete definovat třídu Color
. Vaše třída Color
bude instancována pomocí svého názvu a kódu HTML. Pro vytvoření třídy přidejte následující řádky:
class Color { constructor(name, code) { this.name = name; this.code = code; }}
Teď, když máte datovou strukturu pro Color
, přidejte do svého modulu několik instancí. Do souboru zapište následující zvýrazněné pole:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;
Nakonec zadejte funkci, která náhodně vybere položku z právě vytvořeného pole allColors
:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors;}exports.allColors = allColors;
Klíčové slovo exports
odkazuje na globální objekt dostupný v každém modulu Node.js. Všechny funkce a objekty uložené v objektu exports
modulu jsou vystaveny, když jej importují jiné moduly Node.js. Například funkce getRandomColor()
byla vytvořena přímo na objektu exports
. Do objektu exports
jste pak přidali vlastnost allColors
, která odkazuje na lokální konstantu allColors
pole vytvořenou dříve ve skriptu.
Když budou ostatní moduly importovat tento modul, budou jak allColors
, tak getRandomColor()
vystaveny a k dispozici pro použití.
Uložení a ukončení souboru.
Dosud jste vytvořili modul, který obsahuje pole barev a funkci, která náhodně vrací jednu z nich. Pole a funkci jste také exportovali, aby je mohly používat externí programy. V dalším kroku použijete svůj modul v jiných aplikacích, abyste demonstrovali účinky export
.
Krok 2 – Testování modulu pomocí REPL
Před sestavením kompletní aplikace si na chvíli ověřte, že váš modul funguje. V tomto kroku použijete REPL k načtení modulu colors
. Během práce v REPL zavoláte funkci getRandomColor()
, abyste zjistili, zda se chová podle očekávání.
Spustíte REPL Node.js ve stejné složce jako soubor index.js
:
- node
Po spuštění REPL se zobrazí výzva >
. To znamená, že můžete zadat kód JavaScriptu, který bude okamžitě vyhodnocen. Pokud si o tom chcete přečíst více, postupujte podle našeho průvodce používáním REPL.
Nejprve zadejte následující příkaz:
- colors = require('./index');
V tomto příkazu require()
načte modul colors
v jeho vstupním bodě. Po stisknutí ENTER
se zobrazí:
Output{ getRandomColor: , allColors: }
RePL nám ukáže hodnotu colors
, což jsou všechny funkce a objekty importované ze souboru index.js
. Když použijete klíčové slovo require
, Node.js vrátí veškerý obsah uvnitř objektu exports
modulu.
Připomeňte si, že jste do exports
v modulu colors
přidali getRandomColor()
a allColors
. Z tohoto důvodu je při importu v REPL vidíte oba.
Při výzvě otestujte funkci getRandomColor()
:
- colors.getRandomColor();
Bude vám nabídnuta náhodná barva:
OutputColor { name: 'groovygray', code: '#D7DBDD' }
Jelikož je index náhodný, může se váš výstup lišit. Nyní, když jste potvrdili, že modul colors
funguje, ukončete program Node.js REPL:
- .exit
Tím se vrátíte do příkazového řádku terminálu.
Právě jste potvrdili, že váš modul funguje podle očekávání pomocí programu REPL. Dále použijete stejné koncepty a nahrajete svůj modul do aplikace, jako byste to udělali ve skutečném projektu.
Krok 3 – uložení lokálního modulu jako závislosti
Při testování modulu v REPL jste jej importovali s relativní cestou. To znamená, že jste k získání jeho obsahu použili umístění souboru index.js
vzhledem k pracovnímu adresáři. To sice funguje, ale při programování je obvykle lepší importovat moduly pomocí jejich názvů, aby se import neporušil při změně kontextu. V tomto kroku nainstalujete modul colors
pomocí funkce lokálního modulu npm install
.
Nastavte nový modul Node.js mimo složku colors
. Nejprve přejděte do předchozího adresáře a vytvořte novou složku:
- cd ..
- mkdir really-large-application
Nyní se přesuňte do nového projektu:
- cd really-large-application
Stejně jako u modulu colors
inicializujte složku pomocí npm:
- npm init -y
Vygeneruje se následující 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"}
Nyní nainstalujte svůj modul colors
a použijte příznak --save
, aby byl zaznamenán v souboru package.json
:
- npm install --save ../colors
Modul colors
jste právě nainstalovali do nového projektu. Otevřete soubor package.json
, abyste viděli novou místní závislost:
- nano package.json
Zjistíte, že byly přidány následující zvýrazněné řádky:
{ "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" }}
Ukončete soubor.
Modul colors
byl zkopírován do vašeho adresáře node_modules
. Ověřte, že tam je, následujícím příkazem:
- ls node_modules
Tím získáte následující výstup:
Outputcolors
V tomto novém programu použijte nainstalovaný místní modul. Znovu otevřete textový editor a vytvořte další soubor JavaScriptu:
- nano index.js
Váš program bude nejprve importovat modul colors
. Poté náhodně vybere barvu pomocí funkce getRandomColor()
, kterou modul poskytuje. Nakonec vypíše na konzolu zprávu, která uživateli sdělí, jakou barvu má použít.
Vložte následující kód do 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}`);
Uložte a ukončete tento soubor.
Vaše aplikace nyní uživateli sdělí náhodnou možnost barvy komponenty webové stránky.
Spusťte tento skript pomocí:
- node index.js
Výstup bude podobný:
OutputYou should use leafygreen on your website. It's HTML code is #48C9B0
Modul colors
jste nyní úspěšně nainstalovali a můžete jej spravovat jako jakýkoli jiný balíček npm použitý ve vašem projektu. Pokud byste však do svého lokálního modulu colors
přidali další barvy a funkce, museli byste ve svých aplikacích spustit modul npm update
, abyste mohli nové možnosti používat. V dalším kroku použijete místní modul colors
jiným způsobem a získáte automatické aktualizace při změně kódu modulu.
Krok 4 – Propojení místního modulu
Pokud je váš místní modul v intenzivním vývoji, může být neustálá aktualizace balíčků únavná. Alternativou by bylo moduly propojit. Propojení modulu zajistí, že se veškeré aktualizace modulu okamžitě projeví v aplikacích, které jej používají.
V tomto kroku propojíte modul colors
se svou aplikací. Modul colors
také upravíte a potvrdíte, že jeho nejnovější změny v aplikaci fungují, aniž byste jej museli znovu instalovat nebo aktualizovat.
Nejprve odinstalujte místní modul:
- npm un colors
npm propojuje moduly pomocí symbolických odkazů (nebo symlinků), což jsou odkazy, které ukazují na soubory nebo adresáře v počítači. Propojení modulu se provádí ve dvou krocích:
- Vytvoření globálního odkazu na modul. npm vytvoří symlink mezi vaším globálním adresářem
node_modules
a adresářem vašeho modulu. Globální adresářnode_modules
je umístění, ve kterém jsou nainstalovány všechny vaše balíčky npm pro celý systém (všechny balíčky, které instalujete s příznakem-g
). - Vytvoření lokálního odkazu. npm vytvoří symlink mezi vaším lokálním projektem, který používá modul, a globálním odkazem modulu.
Nejprve vytvořte globální odkaz tak, že se vrátíte do složky colors
a použijete příkaz link
:
- cd ../colors
- sudo npm link
Po dokončení váš shell vypíše:
Output/usr/local/lib/node_modules/colors -> /home/sammy/colors
Právě jste vytvořili symlink ve složce node_modules
do adresáře colors
.
Vraťte se do adresáře really-large-application
a propojte balíček:
- cd ../really-large-application
- sudo npm link colors
Výstup bude podobný následujícímu:
Output/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors
Poznámka: Pokud chcete psát o něco méně, můžete místo link
použít ln
. Například npm ln colors
by fungovalo úplně stejně.
Jak ukazuje výstup, právě jste vytvořili symlink z lokálního adresáře really-large-application
node_modules
na symlink colors
v globálním adresáři node_modules
, který ukazuje na skutečný adresář s modulem colors
.
Proces propojení je dokončen. Spusťte svůj soubor, abyste se ujistili, že stále funguje:
- node index.js
Výstup bude podobný:
OutputYou should use sunkissedyellow on your website. It's HTML code is #F4D03F
Funkčnost vašeho programu je zachována. Dále vyzkoušejte, zda jsou aktualizace okamžitě použity. V textovém editoru znovu otevřete soubor index.js
v modulu colors
:
- cd ../colors
- nano index.js
Nyní přidejte funkci, která vybere ten nejlepší odstín modré, který existuje. Nepřijímá žádné argumenty a vrací vždy třetí položku pole allColors
. Na konec souboru přidejte tyto řádky:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors; }exports.allColors = allColors;exports.getBlue = () => { return allColors;}
Soubor uložte a ukončete, poté znovu otevřete soubor index.js
ve složce really-large-application
:
- cd ../really-large-application
- nano index.js
Provede volání nově vytvořené funkce getBlue()
a vypíše větu s vlastnostmi barvy. Na konec souboru přidejte tyto příkazy:
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`);
Uložení a ukončení souboru.
Kód nyní používá nově vytvořenou funkci getBlue()
. Spusťte soubor jako předtím:
- node index.js
Výstup bude vypadat takto:
OutputYou should use brightred on your website. It's HTML code is #E74C3CMy favorite color is skyblue/#5DADE2, btw
Váš skript dokázal použít nejnovější funkci v modulu colors
, aniž byste museli spouštět npm update
. To vám usnadní provádění změn v této aplikaci při vývoji.
Při psaní větších a složitějších aplikací přemýšlejte o tom, jak lze související kód seskupit do modulů a jak chcete tyto moduly nastavit. Pokud bude váš modul využíván pouze jedním programem, může zůstat v rámci stejného projektu a odkazovat se na něj relativní cestou. Pokud bude váš modul později sdílen samostatně nebo existuje na zcela jiném místě než projekt, na kterém právě pracujete, může být instalace nebo propojení schůdnější. Moduly v aktivním vývoji také využívají výhod automatických aktualizací při propojování. Pokud modul není v aktivním vývoji, může být jednodušší volbou použití npm install
.
Závěr
V tomto kurzu jste se dozvěděli, že modul Node.js je soubor JavaScriptu s funkcemi a objekty, které mohou používat jiné programy. Poté jste vytvořili modul a připojili své funkce a objekty ke globálnímu objektu exports
, abyste je zpřístupnili externím programům. Nakonec jste tento modul importovali do programu, čímž jste demonstrovali, jak se moduly spojují do větších aplikací.
Teď, když víte, jak vytvářet moduly, přemýšlejte o typu programu, který chcete napsat, a rozdělte jej na různé komponenty, přičemž každou jedinečnou sadu činností a dat ponechte v jejich vlastních modulech. Čím více praxe v psaní modulů získáte, tím lepší bude vaše schopnost psát kvalitní programy Node.js na vaší vzdělávací cestě. Chcete-li pracovat s příkladem aplikace Node.js, která používá moduly, podívejte se na náš výukový program Jak nastavit aplikaci Node.js pro produkční použití v Ubuntu 18.04.
.