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í souboru package.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:

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

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

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

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

~/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" }}

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:

Output
colors

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:

~/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}`);

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ý:

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

  1. 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).
  2. 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ý:

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

~/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;}

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:

~/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`);

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:

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

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.