Introduzione a Node.js

Node.js è un framework che permette di realizzare web application usando un linguaggio di programmazione che utilizza la stessa sintassi di JavaScript.

Node.js è un framework che permette di realizzare server-side web application usando un linguaggio di programmazione che utilizza la stessa sintassi di JavaScript. Ciò significa che molte delle pagine Web dinamiche, solitamente realizzate con linguaggi di programmazione come ad esempio PHP, JSP o ASP, possono essere realizzate usando una sorta di JavaScript arricchito da funzionalità server side.

I vantaggi e la comodità di Node.js sono molteplici: il vantaggio più evidente è la possibilità di realizzare applicazioni server-side senza dover imparare linguaggi di programmazione “tradizionali”. Quasi ogni applicazione Web richiede almeno due tipi di competenze, se non addirittura tre. Partendo dal front-end abbiamo grafici e web designers, che si occupano della presentazione e del look & feel: di solito ciò richiede competenze di HTML, JavaScript, CSS, eccetera. La logica dell’applicazione viene invece sviluppata usando linguaggi di programmazione“tradizionali”, che possono essere PHP, Perl, Java, JSP, .NET ecc. Infine, in molti casi, è necessaria anche la figura di un esperto PL/SQL per ottimizzare l’accesso al database.

L’utilizzo di Node.js permette di unificare i primi due profili: le competenze di un web designer esperto di JavaScript possono essere applicate al framework, consentendo ad un’unica persona (o un unico team) di tenere d’occhio sia gli aspetti della presentazione, sia della business logic. Chiaramente ciò non vale per ogni scenario possibile, ma dipende dal contesto specifico del progetto. Considerando però che uno dei punti di forza di Node.js é la scalabilità del software, ne segue che in linea teorica il framework può essere applicato sia per piccoli progetti, sia per applicazioni enterprise.

Requisiti e tecnologia

Prima di iniziare a lavorare con Node.js vediamo quali sono le tecnologie che fungono da piattaforma al framework. Questa conoscenza non è necessaria quando affrontiamo problemi dettagliati, ovvero quando “smanettiamo” attorno al codice, ma è utile avere almeno una vaga idea delle tecnologie coinvolte. Il supporto e la longevità di un framework dipendono spesso dal successo delle tecnologie sulle quali il framework è edificato: conoscere la natura delle “fondamenta” permette di valutare in modo più preciso i vantaggi e gli svantaggi di un framework o libreria.

La prima tecnologia coinvolta è il motore JavaScript V8 di Google. V8 è un motore di interpretazione del codice JavaScript realizzato da Google, nato principalmente per far girare il codice JavaScript all’interno di Chrome. V8 è molto di più di un semplice motore JavaScript, perché permette di essere utilizzato anche in modalità stand alone. Ciò significa, ad esempio, che possiamo usare V8 per compilare del codice JavaScript in C++, ottenendo così un notevole guadagno in termini di performance. Se aggiungiamo poi il fatto che V8 è open source e che gira su tutti i principali sistemi operativi, capiamo subito che la scelta di edificare Node.js “sopra” V8 è una garanzia di sicurezza, portabilità e stabilità.

Un’altra tecnologia coinvolta è Socket.IO, una libreria che semplifica la gestione dei socket tra client e server, dove ovviamente per client si intende un browser Web. Lo scopo di Socket.IO ricorda un po’ le finalità di jQuery: offrire un livello di API di alto livello rispetto all’implementazione “manuale” dei Web socket. Ciò permette, ad esempio, di usare sempre le stesse API indipendentemente da qual è il sistema di trasporto effettivo. Usando Socket.IO non ci interessa se il trasporto utilizza Flash oppure i nuovi WebSocket: il nostro codice girerà allo stesso modo in entrambi i casi.

Orientamento event-driven

Orientamento event-driven

Una caratteristica molto interessante di Node.js è l’orientamento verso lo sviluppo di codice asincrono. Questo approccio può sembrare innovativo per chi è abituato a lavorare con i normali linguaggi di programmazione server side. Paradigmi di programmazione come Java, Perl, .NET ecc. di solito implicano lo sviluppo di applicazioni sincrone nella gestione di richieste concorrenti. In molti casi ciò significa avere un oggetto di tipo server che esegue un ciclo di attesa su una specifica porta HTTP: per ogni richiesta viene recuperato un thread da un pool di thread in attesa, che si occuperà di gestire la comunicazione con il client. Ne segue che ogni richiesta viene trattata in modo sincrono, eventualmente sospendendo il thread durante l’attesa.

 

È proprio questo aspetto che ha suggerito il pattern di programmazione asincrono. Se confrontiamo i tempi di lavoro dei moderni processori con i tempi di trasmissione sul Web, otteniamo una differenza di parecchi ordini di grandezza. Le attese tra una richiesta HTTP e l’altra sono tempi lunghissimi rispetto al clock del processore. Da quest’osservazione nasce l’idea di ricorrere ad un approccio asincrono, dove il software lato server viene attivato solamente in seguito alla generazione di eventi particolari, come ad esempio: arriva una nuova richiesta, una delle risorse precedentemente richieste è pronta per essere restituita, ecc. Sono questi eventi ad attivare il codice Node.js, che per tal motivo è detto even driven.

Dal punto di vista di chi lavora abitualmente con JavaScript, o meglio ancora con le chiamate Ajax o l’oggetto XMLHttpRequest, questo approccio non presenta nulla di nuovo. La maggior parte del codice client side realizzato per girare nel browser usa un approccio asincrono, specialmente quando abbiamo a che fare con chiamate remote dirette verso il server. Per chi invece affronta l’argomento la prima volta, vediamo un semplice esempio che illustra il funzionamento asincrono del codice. Una chiamata sincrona funziona in questo modo

 

 

che implica il seguente timing di esecuzione: prima viene eseguita la chiamata alla getRemoteData. Se questa rimane in attesa, ad esempio perché deve aspettare la risposta del server remoto, l’esecuzione passa comunque alla riga successiva, ovvero all’istruzione di alert. Il risultato è che il nostro alert sarà errato, perché la variabile result non è ancora stata valorizzata.

Al contrario, una chiamata asincrona passa come argomento della funzione invocata un’altra funzione, che viene chiamata callback. Questa funzione è a tutti gli effetti un argomento come gli altri, con la differenza che verrà eseguita solamente quando il server esaudisce la richiesta. Avremo così

 

 

in questo caso, subito dopo l’esecuzione della chiamata alla funzione getRemoteData, il browser prosegue eseguendo l’alert “To be continued”. Al contrario, il codice all’interno della callback, cioè l’alert che visualizza la variabile result, rimane in attesa, risultando così asincrono rispetto al resto del codice. Questo codice verrà eseguito solo quando la variabile result viene valorizzata con la risposta del server.

Quick-start 10 minuti

Quick-start 10 minuti

Dopo l’approccio teorico, passiamo la pratica. Basteranno 10 minuti per scaricare Node.js, verificarne il funzionamento e lanciare il primo server. Iniziamo a scaricare il wizard di installazione qui, semplicemente cliccando su “Install”.

 

node_js_01

 

Figura 1 – Wizard di installazione di Node.js

 

terminata l’installazione apriamo una console (prompt dei comandi o shell) e scriviamo comando node per accedere al terminale di controllo del server. Basterà digitare il comando console per verificare il funzionamento del framework. Se tutto funziona dovremmo ottenere un risultato come questo

 

node_js_02

 

Figura 2 – Verifica dell’installazione

 

A questo punto siamo pronti a creare il primo script server side. Precisiamo che non dovremo eseguire Apache, ovvero non sarà necessario lanciare XAMPP, EasyPHP o altro. Dopo aver creato il primo script, potremmo “tirare su” un server Node.js in modalità stand alone. Lo script di creazione del primo server potrebbe essere il seguente

 

 

Copiamo il testo qui sopra e incolliamolo in un normale editor di testo, salvando il file con estensione JS, come un file JavaScript. Dopodiché torniamo nella console a riga di comando e digitiamo l’istruzione

 

 

che chiaramente va eseguita dalla directory dove si trova il file server.js. Come risultato, all’interno della console, dovremo tenere il messaggio “Server is up and running”.
Apriamo adesso il browser e raggiungiamo l’indirizzo http://localhost:8080: se tutto è andato a buon fine ci verrà restituito il messaggio “Ciao Mondo!”. Come ulteriore conferma possiamo controllare nuovamente la console di esecuzione del server, dove dovremmo trovare il messaggio “Server – on Request” (un messaggio per ciascuna richiesta inviata al server).

Semplice, no? In pochi minuti abbiamo installato il framework e fatto girare il nostro primo server. Nelle prossime lezioni vedremo quali sono i moduli più interessanti, che ci serviranno per realizzare i primi script di utilità pratica.

Facci sapere cosa ne pensi!

Facci sapere cosa ne pensi!

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *