Node.js cos'è
Node.js è un runtime JavaScript costruito sul motore JavaScript V8 di Chrome. Non è né un linguaggio di programmazione né un framework.
Possiamo definire node.js come un ambiente che ci permette di eseguire codice Javascript al di fuori del browser. Come sai il linguaggio Javascript è un linguaggio di programmazione prettamente front-end che ci consente di manipolare il DOM e di rendere interattive le nostre pagine web. Tuttavia, con Node.js abbiamo la possibilità di sviluppare un'intera applicazione web, front-end e back-end, utilizzando un solo linguaggio di programmazione.
Node.js è costruito sul motore JavaScript V8 di Chrome. Ma cosa significa esattamente?
V8 è il nome del motore sviluppato da Google per eseguire e compilare Javascript, viene utilizzato in Chrome e, per l'appunto, in Node.js. Il motore V8 è scritto in C++, implementa ECMAScript e può essere eseguito autonomamente o può essere incorporato in qualsiasi applicazione C++.
Come funziona Node.js
Node.js utilizza l'Event Loop a thread singolo per gestire le diverse operazioni di input/output (lettura/scrittura files, accesso database, richieste di rete) in maniera asincrona e non bloccante.
Nei modelli multi-thread quando più client inviano una richiesta, il server elabora le richieste ed assegna ad ognuna di esse un thread. I thread vengono utilizzati per gestire più client simultaneamente.
Node.js funziona in modo diverso poiché è una modello a thread singolo, l'Event Loop gli permette di gestire più client contemporaneamente.
L'Event Loop non è altro che un ciclo di eventi, il suo compito principale è quello di attendere le richieste a tempo indeterminato. Ogni volta che arriva una richiesta, Node.js la inserisce in una coda (queue). L'Event Loop preleva la richiesta dalla coda e verifica se richiede un'operazione di blocco input/output (I/O), in caso contrario, elabora la richiesta e invia una risposta.
Se la richiesta ha un'operazione di blocco da eseguire, l'Event Loop assegna un thread per elaborare la richiesta. Node.js ha un numero limitato di thread in azione e vengono definiti worker threads.
L'Event Loop tiene traccia delle richieste di blocco e le inserisce nella coda una volta elaborata l'attività di blocco. In questo modo mantiene la sua natura non bloccante.
A cosa serve Node.js
Node.js serve principalmente per la creazione di un server, per implementare API REST o GraphQL, per la realizzazione di un sistema di autenticazione, per la gestione dei dati e per interagire con API di terze parti.
Quando usare Node.js
Node.js è la soluzione ideale per lo sviluppo di applicazioni Web Real Time, spesso è utilizzato per la creazione di chatbot, per lo streaming di dati e per applicazioni su singola pagina. Quali sono i pro e i contro? Vediamoli insieme.
Pro
- Node.js supporta le versioni principali a lungo termine, ha una vasta community di sviluppatori attivi e vanta il più grande repository di pacchetti open source del mondo, NPM, che attualmente contiene oltre un milione di pacchetti;
- L'utilizzo di Javascript sia per il back-end che per il front-end si traduce in una maggiore efficienza e ciò permette agli sviluppatori di risparmiare una grande quantità di tempo;
- Node.js utilizza meno thread e di conseguenza meno risorse/memoria, ciò consente un'esecuzione più rapida delle attività;
- Node.js è un componente fondamentale per le applicazioni stack MEAN, MERN o MEVN. Uno stack di solito è costituito da un database (linguaggio SQL o NoSQL), tecnologia back-end (Node.js e Express.js) e front-end (Angular, React o Vue).
Contro
- Essendo a thread singolo, Node.js non è l'ideale per elaborare attività pesanti ad alta intensità, l'utilizzo di linguaggi multi-thread come Java sono la scelta migliore;
- I pacchetti NPM possono certamente semplificare il lavoro degli sviluppatori. Tuttavia non tutti i pacchetti presentati sono di alta qualità, alcuni sono incompleti e non adeguatamente documentati.
Quali possono essere le alternative?
Per sviluppare applicazioni web lato server è possibile utilizzare diversi linguaggi e framework come ad esempio:
- Linguaggio Python con flask o django
- PHP con Laravel
- Ruby con Ruby on Rails
- ASP.NET e .NET Framework
Come installare Node.js
- Visita la pagina Download del sito ufficiale di Node.js e scegli la versione che desideri installare;
- Scarica il programma di installazione predefinito per la tua piattaforma;
- Una volta avviata l'installazione si aprirà una schermata, segui i passaggi predefiniti lasciando le impostazioni predefinite;
- Per verificare di aver completato l'installazione con successo apri il terminale e digita il comando "node -v", in questo modo otterrai il numero della versione node.js che hai appena installato.
Installare Node.js su Windows
Scarica Windows Installer direttamente dal sito Web nodejs.org.
Installare Node.js su Mac
Scarica macOS Installer direttamente dal sito Web nodejs.org. Puoi scegliere tra due formati, .pkg (consigliata) e .tar.gz.
Con Homebrew
- Apri il terminale e utilizza il comando seguente: brew install node
- Verifica l'installazione tramite il comando: node -v
Installare Node.js su Linux
Su Ubuntu 18.04 puoi installare Node.js tramite il repository ufficiale di Ubuntu:
- Apri il terminale e utilizza il comando seguente: sudo apt install nodejs
- Verifica l'installazione tramite il comando: node -v
Differenza tra la versione LTS e la versione corrente
LTS è l'acronimo di Long Term Support, supporto a lungo termine, la versione Node LTS è quella più stabile e sicura. Le applicazioni in fase di sviluppo dovrebbero utilizzare le versioni LTS.
La versione corrente è quella in fase di sviluppo attivo; in genere Node.js rilascia una nuova versione principale ogni 6 mesi.
Tutorial Node.js
In questo tutorial troverai un esempio che ti aiuterà a creare un server in Node.js.
Creare un server con Node.js
Apriamo l'editor di testo, creiamo un nuovo file "app.js" e iniziamo.
//importiamo il modulo http
const http = require('http')
//impostiamo una porta
const port = 3000
//creiamo un server
//req e res sono l'abbreviazione di request e response
const server = http.createServer((req, res) => {
//vediamo da cosa è composta una richiesta
console.log(req);
//rispondiamo alla richiesta con una pagina html
res.setHeader('Content-type', 'text/html')
//scriviamo un titolo
res.write('<h1>Ho creato un server con Node.js</h1>');
//terminiamo il processo di risposta
res.end();
})
//mettiamo il server in ascolto sulla porta che abbiamo impostato
server.listen(port, () => {
//verifichiamo che il server sia in funzione
console.log(`Server is running on port:${port}`);
})
HTTP è un modulo incluso in Node.js che consente di avviare un server e di trasferire dati tramite il protocollo HTTP. Per poter utilizzare i moduli di Node.js dobbiamo prima includerli all'interno dei nostri file javascript, require ci permette di fare questo.
Il server è impostato per restare in ascolto sulla porta (port) specificata, in questo caso la numero 3000.
Utilizziamo il metodo createServer() di http per elaborare una richiesta (request) e una risposta (response), la funzione ci permetterà di vedere in console da cosa è composta una richiesta e di rispondere con una pagina di tipo html, il metodo setHeader() consente di impostare il tipo di contenuto da restituire.
Il metodo write() invia un pezzo del corpo della risposta, nel nostro caso il pezzo è una stringa "<h1>Ho creato un server con Node.js</h1>". Infine terminiamo il processo di risposta con il metodo end().
Mettiamo il server in ascolto con il metodo listen() sulla nostra porta e verifichiamo che sia in funzione. Se tutto va come previsto troveremo il nostro messaggio di conferma nel terminale.
Per avviare il server apri il terminale e digita il seguente comando: node app.js
Nel terminale dovresti leggere "Server is running on port 3000". Ora visita http://localhost:3000/, il link restituirà la risposta che abbiamo impostato. Ritorna sul terminale, vedrai la richiesta che hai appena inviato al tuo server.
Congratulazioni, hai creato il tuo primo server in Node.js!