Una volta installato Node.js, possiamo iniziare a usarlo lanciando nella shell il seguente comando:
node
Verrà aperta la REPL (Read-Eval-Print-Loop) e verrà mostrato un nuovo prompt (<). A questo punto possiamo digitare del codice javascript che verrà eseguito dopo aver premuto il tasto INVIO.
Il carattere speciale ‘underscore’ (_)
La REPL mette a disposizione una variabile speciale identificata dal carattere underscore (_) che può essere usato per recuperare il risultato dell’ultima espressione eseguita.
Il carattere underscore può essere usato anche per invocare un metodo o accedere le proprietà di un oggetto così come mostrato nell’immagine sottostante.
Modalità multilinea
Abbiamo visto che premendo il tasto INVIO, viene eseguito il codice inserito. In realtà, la REPL è abbastanza ‘intelligente’ da capire quando eseguire un’espressione o andare alla linea successiva per consentire l’inserimento del codice su più linee.
Come potete notare dall’immagine in alto, il cursore va a capo e resta in attesa che venga inserito il corpo della funzione. Per evidenziare questo comportamento, sulla nuova linea vengono inseriti una sequenza di punti (….). Possiamo quindi completare la nostra funzione inserendo il resto del codice.
La REPL resterà in attesa finché non inseriamo la parentesi graffa finale.
Questa funzionalità può risultare utile se si vuole creare un oggetto o un array e si preferisce digitare le diverse proprietà su più linee per migliorare la leggibilità.
Autocompletamento con il carattere TAB
All’interno della REPL è possibile usare il tasto TAB per completare variabili, funzioni o mostrare l’elenco delle proprietà e metodi disponibili per un certo oggetto, così come mostrato nell’immagine sottostante.
Come potete osservare, abbiamo definito una costante di tipo Stringa. Dopo aver digitato il nome della costante seguito dal carattere punto (.), a bbiamo premuto il tasto tabulazione (TAB). Vengono così mostrati un elenco di metodi e proprietà che è possibile accedere per la costante di tipo Stringa.
L’oggetto global
Un caso particolare si verifica quando si preme il tasto TAB senza inserire nessun altro carattere.
In tale situazione viene mostrata una lista di moduli e funzioni che sono disponibili globalmente in Node.js. Si tratta di tutte le proprietà dell’oggetto global il quale è un oggetto speciale che ricopre un ruolo simile a quello rivestito dall’oggetto window all’interno del browser.
Comandi utili da usare nella REPL
Una funzionalità interessante della REPL è costituita dalla possibilità di sfogliare le diverse istruzioni digitate durante la sessione corrente utilizzando i tasti freccia SU e freccia GIÙ.
Digitando inoltre il comando .help e premendo il tasto INVIO, vengono elencati dei comandi ‘speciali’ che la REPL è in grado di interpetrare.
I comandi .break o .clear permettono di ‘uscire’ dal comando corrente. È anche possibile ottenere lo stesso effetto attraverso la scorciatoia da tastiera CTRL+C.
Digitando .exit (oppure CTRL+D) è possibile terminare la sessione corrente della REPL.
Per salvare e poi ripristinare i comandi digitati durante una sessione, che altrimenti andrebbero persi e non sarebbero più disponibili nelle sessioni successive, si può invece usare .save ‘percorso del file’ e .load ‘percorso del file’.
Dopo aver digitato il comando dell’immagine in alto, verrà creato sul Desktop un file session_1.js contenente tutte le istruzioni digitate durante la sessione.
A questo punto, se avviamo una nuova sessione ed eseguiamo il comando .load avremo a disposizione tutte le istruzioni della precedente sessione.
Infatti possiamo verificare la presenza della funzione creata all’interno dell’oggetto global.
Il modulo repl
Node.js fornisce anche un modulo repl che possiamo utilizzare per creare una REPL personalizzata direttamente all’interno della nostra applicazione. Vediamo un semplice esempio. Per maggiori informazioni potete leggere la documentazione ufficiale
const repl = require('repl');
const replServer = repl.start({
prompt: '$ ',
ignoreUndefined: true
});
Object.defineProperty(replServer.context, 'v8', {
configurable: false,
enumerable: true,
value: `Versione corrente di V8: ${process.versions.v8}`
});
Object.defineProperty(replServer.context, 'somma', {
configurable: false,
enumerable: true,
value: function somma(a,b){
return a + b;
}
});
replServer.on('exit', () => {
console.log('Grazie per aver usato la Repl. Buona giornata!');
process.exit();
});
replServer.defineCommand('time', {
help: 'Mostra l'ora corrente',
action() {
const orario = new Date();
let ore = orario.getHours();
let minuti = orario.getMinutes();
ore = (ore < 10 ? '0' : '') + ore;
minuti = (minuti < 10 ? '0' : '') + minuti;
console.log('n========== ORARIO ==========n');
console.log(` ${ore}:${minuti}n`);
console.log('============================n');
this.displayPrompt();
}
});
A questo punto se salviamo il codice mostrato sopra all’interno di un file repl.js, potremo lanciare la nostra REPL personalizzata attraverso il comando:
node repl.js
In questo esempio abbiamo creato una REPL personalizzata importando dapprima l’omonimo modulo e invocando il metodo start() a cui abbiamo passato delle opzioni attraverso un semplice oggetto Javascript. Il metodo start() restituisce un’istanza di repl.REPLServer. Nel nostro caso abbiamo cambiato il prompt che verrà mostrato nella nuova REPL e abbiamo chiesto di non mostrare il valore restituito dall’esecuzione di un comando se questo è pari a undefined.
All’interno della nostra REPL abbiamo reso disponibili la variabile v8 che mostrerà a video la versione attuale del motore Javascript e una funzione somma che permetta semplicemente di sommare due valori. Per far ciò abbiamo usato il metodo Object.defineProperty() in modo tale che non possa essere cambiato il valore delle due proprietà dell’oggetto context da noi definite.
Abbiamo quindi richiesto di stampare un messaggio (‘Grazie per aver usato la Repl. Buona giornata!’) ogni volta che si termina la sessione corrente della REPL.
Infine abbiamo aggiunto un nuovo comando (‘.time’) che una volta eseguito mostrerà l’ora corrente.
Digitando .help nella REPL, verrà mostrato un elenco di comendi che include anche quello aggiunto. Nella descrizione di .time si specifica che il comando serve per mostrare l’ora corrente.
Conclusioni
A partire dalla prossima lezione, affronteremo in maniera più approfondita alcuni dei concetti indispensabili per capire il funzionamento dei vari componenti che costituiscono Node.js.