Creare un proprio modulo personalizzato su Node.js
Guida su come usare exports

Tempo di lettura: 3 minuti
Come creare dei moduli su Node.js, usare exports

Creare moduli in Javascript con Node.js

Ricordi questa riga?

var http = require('http');

Ѐ stato proprio l’inizio del nostro primo codice. Ti avevo detto che si trattava di una chiamata alla libreria “http” di Node.js (o dovrei dire al modulo “http”).

Quando scriviamo questo, Node cercherà sul nostro hard disk un file chiamato http.js. Allo stesso modo, se chiediamo il modulo “url”, cercherà un file chiamato url.js.

var http = require('http'); // Richiama il file http.js 
var url = require('url'); // Richiama il file url.js

Ma dove sono questi file .js? Non riesco a trovarli!

Sono nascosti in un posto piacevole e caldo (nel tuo hard disk), la loro posizione ci interessa poco in realtà dato che fanno parte del cuore di Node.js, sono sempre disponibili da qualsiasi file li richiamiamo.

È importante capire che i moduli non sono altro che dei semplici file .js.

Se volessimo creare un nostro modulo, diciamo il modulo “test”, ci basterò creare un file test.js nella stessa cartella del file che lo richiama e scrivere un codice tipo questo:

var test = require('./test'); // Richiama il file test.js presente nella stessa cartella

Non mettere l’estensione .js in require()!

Il ./ indica che il percorso è relativo. Se invece il modulo si trova nella cartella principale (o padre), possiamo includerlo in questo modo:

var test = require('../test'); // Richiama il file test.js nella cartella un livello superiore

Cosa succede se non voglio mettere un percorso relativo? Non posso solo richiedere un test?

Certo che è possibile! Bisogna inserire il file test.js in una sottocartella denominata “node_modules” (è uno standard Node.js):

var test = require('test'); //  Richiama il file test.js nella cartella node_modules

Ecco una bella grafica riassuntiva:

come-funzionano-moduli-nodejs-cartella-node_modules
Node.js sa dove cercare i moduli!

Nota bene: Se il file non è presente in node_modules  Node andrà a cercare un file che ha lo stesso nome più in alto nella struttura ad albero delle cartelle. In questo modo, se il tuo progetto si trova nella cartella /home/alberto/dev/nodejs/project, andrà a cercare il file in questo modo:

  • /home/alberto/dev/nodejs/projectnode_modules, e se il file non esiste, andrà a cercarlo in…
  • /home/alberto/dev/nodejs/node_modules ,e se il file non esiste, andrà a cercarlo in…
  • /home/alberto/dev/node_modules, e così via!

Nel concreto, cos’è un modulo Javascript?

Non è altro che un classico file JavaScript, con una piccola aggiunta!

Bisogna “esportare” le funzioni che si vogliono far riutilizzare da altre persone o altri file.

Facciamo una prova!

Creeremo un modulo molto semplice che può dire “Ciao”! e “Addio”! Crea un file chiamato mymodule.js con il seguente codice:

var sayHello = function() {
  console.log('Ciao!');
}

var sayGoodbye = function() {
  console.log('Addio!');
}

exports.sayHello = sayHello;
exports.sayGoodbye = sayGoodbye;

L’inizio del file non contiene nulla di nuovo. Stiamo creando funzioni che inseriamo nelle variabili (es: var sayHello = function(){}).

Poi arriva la nuova parte, stiamo esportando le funzioni in modo che siano utilizzabili al di fuori del nostro modulo: export.sayHello = sayHello;. Da notare che avremmo potuto fare anche cosi:

exports.sayHello = function() { ... };

Tutte le funzioni non esportate nel file del modulo rimarranno private. Non sarà possibile chiamarle all’esterno, tuttavia, potranno essere utilizzate da altre funzioni all’interno del modulo.

Ora, nel file principale della tua app (es: app.js), puoi richiamare queste funzioni, prima però devi importare il modulo!

var mymodule = require('./mymodule');

mymodule.sayHello();
mymodule.sayGoodbye();

require() restituisce un oggetto che contiene le funzioni esportate nel modulo. Memorizziamo questo oggetto in una variabile con lo stesso nome del modulo (ma avremmo potuto dargli un qualsiasi altro nome).

creare-esportare-modulo-node.js-exports
Esportare una funzione con exports e richiamarla con require

OK, quindi ora sai tutto!

Tutti i moduli Node.js sono basati su quest’idea molto semplice. Questo consente di dividere il progetto in diversi piccoli file per distribuire meglio il lavoro.

Nel prossimo articolo approfondiremo l’NPM, la più grande libreria opensource di “moduli” Javascript!


L’articolo che hai appena letto fa parte di una lunga serie di guide e tutorial tradotte in italiano e distribuite gratuitamente. In particolare questo articolo si basa sui testi inglesi di Mathieu Nebra (Ultra fast applications using Node.js), con licenza CC BY-NC-SA. Questo articolo è sotto la stessa licenza.