Prima di creare un nuovo modulo è necessario capire come si comporta la funzione require in base al parametro di tipo stringa ricevuto come parametro.
Come funziona require
Se passiamo alla funzione require il nome di uno modulo core di NodeJS, la funzione si occuperà di reperire il modulo dalla cartella delle librerie e di renderlo disponibile all'applicazione corrente.
Possiamo includere i nostri moduli anche a partire da percorsi personalizzati. Passando alla funzione require
un percorso assoluto o relativo di un file, il motore di NodeJS si occupa di rendere fruibile il file all'interno dell'applicazione.
require('./modulo.js')
require('/home/utente/modulo.js')
La cartella di default è 'node_modules', quindi passando alla funzione una stringa che non rappresenta un modulo core e non inizia con punti o backslash
(''), il motore NodeJS cerca il file nella cartella
node_modules
del progetto corrente. Se il file non viene trovato NodeJS si sposterà ricorsivamente nella cartella padre e continuerà la ricerca fino a trovare il file richiesto.
Questo meccanismo può essere comodo per avere un unico punto di accesso a moduli condivisi da più applicazioni (creando una cartella node_modules
nella root di un utente significa permettere a tutte le applicazioni scritte da quell'utente di usufruire di quei moduli).
Includere moduli da NODE_PATH
Se le inclusioni precedenti non vanno a buon fine, NodeJS cercherà i moduli da includere all'interno della cartella definite dalla variabile di sistema $NODE_PATH
.
Organizzare moduli in cartelle
Per i moduli più complessi e composti da più file, è possibile includere l'intero set di file con un unica chiamata a require
. In questo caso è però necessario definire un file descrittore all'interno del modulo che permette al motore di conoscere quali sono i file da includere.
Questo è il meccanismo con il quale vengono incluse le librerie scaricate dal registro NPM.
Per approfondire questo meccanismo di loading il miglior riferimento è la documentazione ufficiale.
Creare il primo modulo
Un modulo non è nient'altro che un file (o un insieme di file) che definisce una serie di funzioni JavaScript e che le espone attraverso un oggetto exports globale. Assegnare quindi proprietà o metodi di questo oggetto nativo significa rendere la funzionalità disponibile da applicazioni esterne.
Guardiamo un esempio.
//simplemath.js
var sum = function(a, b) { //definiamo la funzione sum
return a+b;
}
var product = function(a, b) { //definiamo la funzione product
return a*b;
}
var private = function(a,b) {
return "Io sono private!!";
}
exports.sum = sum; //esportiamo la funzione sum
exports.product = product; //esportiamo la funzione product
//app.js
var sm = require('./simplemath');
console.log(sm.sum(1,2)); //echo 3
console.log(sm.product(1,2)); //echo 2;
console.log(sm.private(1,2)); //error!
Tutto molto semplice. Vengono definite le funzioni richieste e vengono "appese" all'oggetto exports
rendendole di fatto pubbliche. Qualsiasi altra funzione definita nel file risulta privata e non
invocabile se non dall'interno del modulo.
Nelle prossime lezioni metteremo in pratica le nozioni apprese fin'ora per mettere in piedi un'applicazione web vera e propria.