L’autore ha selezionato l’Open Internet/Free Speech Fund per ricevere una donazione come parte del programma Write for DOnations.
Introduzione
In Node.js, un modulo è una collezione di funzioni e oggetti JavaScript che possono essere usati da applicazioni esterne. Descrivere un pezzo di codice come un modulo si riferisce meno a ciò che il codice è e più a ciò che fa – qualsiasi file o collezione di file Node.js può essere considerato un modulo se le sue funzioni e i suoi dati sono resi utilizzabili da programmi esterni.
Perché i moduli forniscono unità di funzionalità che possono essere riutilizzate in molti programmi più grandi, essi ti permettono di creare applicazioni liberamente accoppiate che scalano con la complessità, e ti aprono la porta per condividere il tuo codice con altri sviluppatori. Essere in grado di scrivere moduli che esportano funzioni e dati utili vi permetterà di contribuire alla più ampia comunità di Node.js – infatti, tutti i pacchetti che usate su npm sono stati impacchettati e condivisi come moduli. Questo rende la creazione di moduli un’abilità essenziale per uno sviluppatore Node.js.
In questo tutorial, creerai un modulo Node.js che suggerisce quale colore gli sviluppatori web dovrebbero usare nei loro progetti. Svilupperai il modulo memorizzando i colori come un array e fornendo una funzione per recuperarne uno in modo casuale. In seguito, si analizzeranno i vari modi di importare un modulo in un’applicazione Node.js.
Prequisiti
- Avrai bisogno di Node.js e npm installati nel tuo ambiente di sviluppo. Questo tutorial usa la versione 10.17.0. Per installarlo su macOS o Ubuntu 18.04, segui i passi in Come installare Node.js e creare un ambiente di sviluppo locale su macOS o la sezione Installare usando un PPA di Come installare Node.js su Ubuntu 18.04. Avendo installato Node.js avrai anche installato npm; questo tutorial usa la versione 6.11.3.
- Dovresti anche avere familiarità con il file
package.json
, e sarebbe utile anche l’esperienza con i comandi npm. Per acquisire questa esperienza, segui Come usare i moduli Node.js con npm e package.json, in particolare il Passo 1 – Creare un filepackage.json
. - Sarà utile anche essere a proprio agio con il Node.js REPL (Read-Evaluate-Print-Loop). Lo userete per testare il vostro modulo. Se hai bisogno di maggiori informazioni su questo, leggi la nostra guida su Come usare il Node.js REPL.
Step 1 – Creare un modulo
Questo passo ti guiderà nella creazione del tuo primo modulo Node.js. Il tuo modulo conterrà una collezione di colori in un array e fornirà una funzione per ottenerne uno a caso. Userai la proprietà exports
incorporata in Node.js per rendere la funzione e l’array disponibili a programmi esterni.
Primo, inizierai a decidere quali dati sui colori memorizzerai nel tuo modulo. Ogni colore sarà un oggetto che contiene una proprietà name
che gli umani possono facilmente identificare, e una proprietà code
che è una stringa contenente un codice colore HTML. I codici colore HTML sono numeri esadecimali a sei cifre che ti permettono di cambiare il colore degli elementi in una pagina web. Puoi imparare di più sui codici colore HTML leggendo questo articolo HTML Color Codes and Names.
Poi deciderai quali colori vuoi supportare nel tuo modulo. Il tuo modulo conterrà un array chiamato allColors
che conterrà sei colori. Il tuo modulo includerà anche una funzione chiamata getRandomColor()
che selezionerà casualmente un colore dal tuo array e lo restituirà.
Nel tuo terminale, crea una nuova cartella chiamata colors
e spostati in essa:
- mkdir colors
- cd colors
Inizializza npm in modo che altri programmi possano importare questo modulo più avanti nel tutorial:
- npm init -y
Hai usato il flag -y
per saltare le solite richieste di personalizzare il tuo package.json
. Se questo fosse un modulo che vuoi pubblicare su npm, dovresti rispondere a tutte queste richieste con dati rilevanti, come spiegato in Come usare i moduli Node.js con npm e package.json.
In questo caso, il tuo output sarà:
Output{ "name": "colors", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": , "author": "", "license": "ISC"}
Ora, apri un editor di testo a riga di comando come nano
e crea un nuovo file che serva come punto di ingresso per il tuo modulo:
- nano index.js
Il tuo modulo farà alcune cose. Per prima cosa, definirete una classe Color
. La tua classe Color
sarà istanziata con il suo nome e il suo codice HTML. Aggiungi le seguenti linee per creare la classe:
class Color { constructor(name, code) { this.name = name; this.code = code; }}
Ora che hai la tua struttura dati per Color
, aggiungi alcune istanze nel tuo modulo. Scrivi il seguente array evidenziato nel tuo file:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;
Infine, inserisci una funzione che selezioni casualmente un elemento dall’array allColors
che hai appena creato:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors;}exports.allColors = allColors;
La parola chiave exports
fa riferimento a un oggetto globale disponibile in ogni modulo Node.js. Tutte le funzioni e gli oggetti memorizzati nell’oggetto exports
di un modulo sono esposti quando altri moduli Node.js lo importano. La funzione getRandomColor()
è stata creata direttamente sull’oggetto exports
, per esempio. Hai poi aggiunto una proprietà allColors
all’oggetto exports
che fa riferimento all’array di costanti locali allColors
creato in precedenza nello script.
Quando altri moduli importano questo modulo, sia allColors
che getRandomColor()
saranno esposti e disponibili all’uso.
Salva e chiudi il file.
Finora hai creato un modulo che contiene un array di colori e una funzione che ne restituisce uno in modo casuale. Avete anche esportato l’array e la funzione, in modo che programmi esterni possano usarli. Nel prossimo passo, userete il vostro modulo in altre applicazioni per dimostrare gli effetti di export
.
Passo 2 – Testare il tuo modulo con il REPL
Prima di costruire un’applicazione completa, prenditi un momento per confermare che il tuo modulo funziona. In questo passo, userai il REPL per caricare il modulo colors
. Mentre siete nel REPL, chiamerete la funzione getRandomColor()
per vedere se si comporta come vi aspettate.
Avvia il Node.js REPL nella stessa cartella del file index.js
:
- node
Quando il REPL è partito, vedrai il prompt >
. Questo significa che potete inserire del codice JavaScript che verrà immediatamente valutato. Se vuoi saperne di più, segui la nostra guida sull’uso del REPL.
Prima, inserisci quanto segue:
- colors = require('./index');
In questo comando, require()
carica il modulo colors
al suo punto di ingresso. Quando premete ENTER
otterrete:
Output{ getRandomColor: , allColors: }
Il REPL ci mostra il valore di colors
, che sono tutte le funzioni e gli oggetti importati dal file index.js
. Quando usi la parola chiave require
, Node.js restituisce tutti i contenuti all’interno dell’oggetto exports
di un modulo.
Ricorda che hai aggiunto getRandomColor()
e allColors
a exports
nel modulo colors
. Per questo motivo, li vedete entrambi nel REPL quando vengono importati.
Al prompt, testate la funzione getRandomColor()
:
- colors.getRandomColor();
Vi verrà richiesto un colore casuale:
OutputColor { name: 'groovygray', code: '#D7DBDD' }
Poiché l’indice è casuale, il vostro risultato può variare. Ora che avete confermato che il modulo colors
funziona, uscite dal Node.js REPL:
- .exit
Questo vi riporterà alla vostra linea di comando terminale.
Avete appena confermato che il vostro modulo funziona come previsto usando il REPL. In seguito, applicherete questi stessi concetti e caricherete il vostro modulo in un’applicazione, come fareste in un progetto reale.
Step 3 – Salvare il vostro modulo locale come dipendenza
Nel testare il vostro modulo nel REPL, lo avete importato con un percorso relativo. Questo significa che hai usato la posizione del file index.js
in relazione alla directory di lavoro per ottenere il suo contenuto. Anche se questo funziona, di solito è un’esperienza di programmazione migliore importare i moduli con i loro nomi in modo che l’importazione non venga interrotta quando il contesto viene cambiato. In questo passo, installerete il modulo colors
con la funzione local module install
di npm.
Imposta un nuovo modulo Node.js fuori dalla cartella colors
. Per prima cosa, vai nella directory precedente e crea una nuova cartella:
- cd ..
- mkdir really-large-application
Ora spostati nel tuo nuovo progetto:
- cd really-large-application
Come per il modulo colors
, inizializza la tua cartella con npm:
- npm init -y
Sarà generato il seguente 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"}
Ora, installa il tuo modulo colors
e usa il flag --save
così sarà registrato nel tuo file package.json
:
- npm install --save ../colors
Hai appena installato il tuo modulo colors
nel nuovo progetto. Apri il file package.json
per vedere la nuova dipendenza locale:
- nano package.json
Troverai che sono state aggiunte le seguenti linee evidenziate:
{ "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" }}
Esci dal file.
Il modulo colors
è stato copiato nella tua directory node_modules
. Verifica che sia lì con il seguente comando:
- ls node_modules
Questo darà il seguente output:
Outputcolors
Usa il tuo modulo locale installato in questo nuovo programma. Riapri il tuo editor di testo e crea un altro file JavaScript:
- nano index.js
Il tuo programma importerà prima il modulo colors
. Poi sceglierà un colore a caso usando la funzione getRandomColor()
fornita dal modulo. Infine, stamperà un messaggio alla console che dice all’utente quale colore usare.
Inserisci il seguente codice in 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}`);
Salva e chiudi questo file.
La vostra applicazione ora comunicherà all’utente un’opzione di colore casuale per un componente del sito web.
Eseguite questo script con:
- node index.js
Il vostro output sarà simile a:
OutputYou should use leafygreen on your website. It's HTML code is #48C9B0
Ora avete installato con successo il modulo colors
e potete gestirlo come qualsiasi altro pacchetto npm usato nel vostro progetto. Tuttavia, se avete aggiunto più colori e funzioni al vostro modulo locale colors
, dovrete eseguire npm update
nelle vostre applicazioni per poter utilizzare le nuove opzioni. Nel prossimo passo, userai il modulo locale colors
in un altro modo e otterrai aggiornamenti automatici quando il codice del modulo cambia.
Passo 4 – Collegare un modulo locale
Se il tuo modulo locale è in forte sviluppo, aggiornare continuamente i pacchetti può essere noioso. Un’alternativa sarebbe quella di collegare i moduli. Collegare un modulo assicura che qualsiasi aggiornamento del modulo si rifletta immediatamente nelle applicazioni che lo utilizzano.
In questo passo, collegherai il modulo colors
alla tua applicazione. Modificherai anche il modulo colors
e confermerai che i suoi cambiamenti più recenti funzionano nell’applicazione senza dover reinstallare o aggiornare.
Prima di tutto, disinstalla il tuo modulo locale:
- npm un colors
npm collega i moduli usando collegamenti simbolici (o symlink), che sono riferimenti che puntano a file o directory nel tuo computer. Il collegamento di un modulo avviene in due passi:
- Creazione di un collegamento globale al modulo. npm crea un collegamento simbolico tra la vostra directory globale
node_modules
e la directory del vostro modulo. La directory globalenode_modules
è la posizione in cui sono installati tutti i tuoi pacchetti npm a livello di sistema (qualsiasi pacchetto che installi con il flag-g
). - Creare un link locale. npm crea un symlink tra il tuo progetto locale che sta usando il modulo e il link globale del modulo.
Prima di tutto, crea il link globale tornando alla cartella colors
e usando il comando link
:
- cd ../colors
- sudo npm link
Una volta completato, la tua shell mostrerà:
Output/usr/local/lib/node_modules/colors -> /home/sammy/colors
Hai appena creato un link simbolico nella tua cartella node_modules
alla tua cartella colors
.
Ritornate alla cartella really-large-application
e collegate il pacchetto:
- cd ../really-large-application
- sudo npm link colors
Voi riceverete un output simile al seguente:
Output/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors
Nota: Se volete digitare un po’ meno, potete usare ln
invece di link
. Per esempio, npm ln colors
avrebbe funzionato esattamente allo stesso modo.
Come mostra l’output, hai appena creato un link simbolico dalla directory locale node_modules
del tuo really-large-application
al link simbolico colors
nel tuo node_modules
globale, che punta alla directory reale con il modulo colors
.
Il processo di collegamento è completo. Esegui il tuo file per assicurarti che funzioni ancora:
- node index.js
Il tuo output sarà simile a:
OutputYou should use sunkissedyellow on your website. It's HTML code is #F4D03F
La funzionalità del tuo programma è intatta. Successivamente, verificate che gli aggiornamenti vengano applicati immediatamente. Nel tuo editor di testo, riapri il file index.js
nel modulo colors
:
- cd ../colors
- nano index.js
Ora aggiungi una funzione che selezioni la migliore tonalità di blu esistente. Non prende argomenti e restituisce sempre il terzo elemento dell’array allColors
. Aggiungi queste righe alla fine del file:
class Color { constructor(name, code) { this.name = name; this.code = code; }}const allColors = ;exports.getRandomColor = () => { return allColors; }exports.allColors = allColors;exports.getBlue = () => { return allColors;}
Salva ed esci dal file, poi riapri il file index.js
nella cartella really-large-application
:
- cd ../really-large-application
- nano index.js
Fai una chiamata alla funzione getBlue()
appena creata, e stampa una frase con le proprietà del colore. Aggiungete queste dichiarazioni alla fine del file:
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`);
Salvate ed uscite dal file.
Il codice ora usa la funzione getBlue()
appena creata. Eseguite il file come prima:
- node index.js
Avrete un output come:
OutputYou should use brightred on your website. It's HTML code is #E74C3CMy favorite color is skyblue/#5DADE2, btw
Il vostro script è stato in grado di usare l’ultima funzione nel vostro modulo colors
, senza dover eseguire npm update
. Questo renderà più facile fare cambiamenti a questa applicazione durante lo sviluppo.
Quando scrivi applicazioni più grandi e complesse, pensa a come il codice correlato può essere raggruppato in moduli, e come vuoi che questi moduli siano impostati. Se il vostro modulo sarà usato solo da un programma, può rimanere all’interno dello stesso progetto ed essere referenziato da un percorso relativo. Se il vostro modulo sarà in seguito condiviso separatamente o esiste in una posizione molto diversa dal progetto su cui state lavorando ora, l’installazione o il collegamento potrebbe essere più conveniente. I moduli in sviluppo attivo beneficiano anche degli aggiornamenti automatici del collegamento. Se il modulo non è in sviluppo attivo, usare npm install
potrebbe essere l’opzione più facile.
Conclusione
In questo tutorial, hai imparato che un modulo Node.js è un file JavaScript con funzioni e oggetti che possono essere usati da altri programmi. Hai poi creato un modulo e collegato le tue funzioni e i tuoi oggetti all’oggetto globale exports
per renderli disponibili ai programmi esterni. Infine, avete importato quel modulo in un programma, dimostrando come i moduli si uniscono in applicazioni più grandi.
Ora che sapete come creare moduli, pensate al tipo di programma che volete scrivere e dividetelo in vari componenti, mantenendo ogni set unico di attività e dati nei propri moduli. Più fai pratica scrivendo moduli, migliore sarà la tua capacità di scrivere programmi Node.js di qualità nel tuo viaggio di apprendimento. Per lavorare su un esempio di un’applicazione Node.js che usa moduli, vedi il nostro tutorial Come impostare un’applicazione Node.js per la produzione su Ubuntu 18.04.
.