JavaScript è uno dei linguaggi di programmazione più popolari al mondo. Oggi alimenta milioni di siti web e ha attratto frotte di sviluppatori e designer per creare funzioni per il web. Se siete alle prime armi con la programmazione, sappiate che JavaScript è probabilmente uno dei migliori linguaggi di programmazione da apprendere.

Nei suoi primi 20 anni, JavaScript è stato utilizzato principalmente per lo scripting lato client. Dato che JavaScript poteva essere utilizzato solo all’interno del tag <script>, gli sviluppatori dovevano lavorare contemporaneamente con più linguaggi e framework tra i componenti di front-end e back-end. Poi è arrivato Node.js, che è un ambiente run-time che include tutto ciò che serve per eseguire un programma scritto in JavaScript.

Node.js è un ambiente runtime single-threaded, open-source e multipiattaforma per la creazione di applicazioni server-side e di networking veloci e scalabili. Gira sul motore di runtime JavaScript V8 e usa un’architettura I/O event-driven e non bloccante, il che lo rende efficiente e adatto ad applicazioni real-time.

In Cosa è Scritto Node.js?

Node.js è scritto in C, C++ e JavaScript.

Wikipedia definisce Node.js come “una compilazione del motore JavaScript V8 di Google, livello di astrazione della piattaforma libuv e una libreria core, che è essa stessa scritta principalmente in JavaScript”.

Il runtime usa internamente Chrome V8, che è il motore di esecuzione di JavaScript, anche questo anche scritto in C++. Questo aggiunge ulteriori casi d’uso al repertorio di Node.js, come l’accesso alle funzionalità interne del sistema (come il networking).

Architettura e Funzionamento di Node.js

Node.js utilizza l’architettura “Single Threaded Event Loop” per gestire più client allo stesso tempo. Per capire quanto sia diverso da altri runtime, abbiamo prima bisogno di capire come vengono gestiti i client multi-thread concorrenti in linguaggi come Java.

In un modello di richiesta-risposta multithread, più client inviano una richiesta e il server elabora ognuna di esse prima di inviare la risposta. Tuttavia, per elaborare le chiamate concorrenti vengono utilizzati più thread. Questi thread sono definiti in un pool di thread e, ogni volta che arriva una richiesta, viene assegnato un singolo thread per gestirla.

 Come node.js elabora le richieste in arrivo utilizzando il loop degli eventi
Come node.js elabora le richieste in arrivo utilizzando il loop degli eventi

Node.js funziona in modo diverso. Diamo un’occhiata a tutti i passaggi:

  1. Per servire le richieste, Node.js mantiene un pool di thread limitato.
  2. Ogni volta che arriva una richiesta, Node.js la mette in una coda.
  3. Ora entra in scena il “ciclo di eventi” a thread singolo – il componente core. Questo ciclo di eventi aspetta le richieste a tempo indeterminato.
  4. Quando arriva una richiesta, il ciclo la prende dalla coda e controlla se questa richiede un’operazione di input/output (I/O) bloccante. In caso contrario, elabora la richiesta e invia una risposta.
  5. Se la richiesta deve eseguire un’operazione bloccante, per elaborare la richiesta il ciclo dell’evento assegna un thread dal pool di thread interni. I thread interni disponibili sono limitati. Questo gruppo di thread ausiliari è chiamato worker group.
  6. Il ciclo degli eventi tiene traccia delle richieste bloccanti e le mette in coda una volta che il task bloccante è stato elaborato. In questo modo mantiene la sua natura non bloccante.

Dato che Node.js utilizza un minor numero di thread, utilizza anche meno risorse/memoria, con conseguente esecuzione più veloce dei task. Quindi, per i nostri scopi, questa architettura a thread singolo è equivalente all’architettura a thread multiplo. Quando uno ha bisogno di elaborare task ad alta intensità di dati, allora ha più senso utilizzare linguaggi multi-thread come Java. Ma per applicazioni real-time, Node.js è la scelta più ovvia.

Caratteristiche di Node.js

Node.js è cresciuto rapidamente negli ultimi anni. Questo grazie al lungo elenco di funzionalità:

  1. Semplice – Iniziare a lavorare con Node.js è abbastanza facile. È una scelta obbligata per i principianti del web development. Con moltissimi tutorial e una grande community, iniziare è davvero molto facile.
  2. Scalabile – Offre una grande scalabilità per le applicazioni. Essendo single-threaded, Node.js è in grado di gestire un enorme numero di connessioni contemporanee con elevata portata.
  3. Velocità – L’esecuzione non bloccante dei thread rende Node.js ancora più veloce ed efficiente.
  4. Pacchetti – Esiste un vasto set di pacchetti Node.js open-source che può semplificare il vostro lavoro. Oggi ci sono oltre un milione di pacchetti nell’ecosistema NPM.
  5. Solido backend – Node.js è scritto in C e C++, il che lo rende veloce e aggiunge funzionalità come il supporto di rete.
  6. Multipiattaforma – Il supporto multipiattaforma permette di creare siti web SaaS, applicazioni desktop e anche applicazioni mobili, tutto questo solo con Node.js.
  7. Mantenibile – Node.js è una scelta abbastanza semplice per gli sviluppatori poiché sia il frontend che il backend possono essere gestiti esclusivamente con JavaScript.

Dimensioni del Mercato

Negli ultimi 2 decenni c’è stata un aumento enorme del numero dei siti web e, come previsto, anche Node.js sta crescendo velocemente. Il popolare runtime ha già superato la soglia di 1 miliardo di download nel 2018 e, secondo W3Techs, è utilizzato dall’1,2% di tutti i siti web. Si tratta di oltre 20 milioni di siti in totale.

Non sorprende che sia una scelta popolare anche per milioni di aziende. Eccone alcune delle più famose:

  • Twitter
  • Spotify
  • eBay
  • Reddit
  • LinkedIn
  • Godaddy

Applicazioni di Node.js

Applicazioni di Node.js
Applicazioni di Node.js

Node.js è utilizzato per un’ampia varietà di applicazioni. Analizziamo alcuni casi d’uso comuni per i quali Node.js viene considerato una buona scelta:

  1. Chat in tempo reale – Grazie alla sua natura asincrona a thread singolo, Node.js è adatto per elaborare comunicazioni in tempo reale. Può scalare facilmente ed è spesso utilizzato nella costruzione di chatbot. Node.js permette anche di creare facilmente funzioni di chat aggiuntive come la chat multi-person e le notifiche push.
  2. Internet of Things – Le Applicazioni-IoT di solito comprendono più sensori, dato che inviano spesso piccoli blocchi di dati che possono accumularsi in un gran numero di richieste. Node.js è un’ottima scelta perché è in grado di gestire con rapidità richieste concorrenti.
  3. Streaming dei dati – Aziende come Netflix usano Node.js per lo streaming. Ciò è dovuto principalmente al fatto che Node.js è leggero e veloce. Inoltre Node.js fornisce un’API di streaming nativa. Questi flussi permettono agli utenti di fare richieste in pipe, con il risultato che i dati vengono trasmessi direttamente alla loro destinazione finale.
  4. Applicazioni complesse a pagina singola (SPA) – Nelle SPA, l’intera applicazione viene caricata in una singola pagina. Questo di solito significa che ci sono alcune richieste eseguite in background per componenti specifici. Viene qui in soccorso il ciclo di eventi di Node.js, dato che elabora le richieste in modo non bloccante.
  5. Applicazioni basate su REST API – JavaScript è utilizzato sia nel frontend che nel backend dei siti. Così, un server può facilmente comunicare con il frontend tramite API REST utilizzando Node.js. Node.js fornisce anche pacchetti come Express.js e Koa, che rendono ancora più facile la costruzione di applicazioni web.

Node.js È un Linguaggio di Programmazione?

In una sola parola: no.

Node.js non è un linguaggio di programmazione. È un ambiente runtime che viene utilizzato per eseguire JavaScript al di fuori del browser.

Node.js non è un framework (una piattaforma per sviluppare applicazioni software). Il runtime di Node.js è costruito sopra un linguaggio di programmazione – in questo caso, JavaScript – e consente di eseguire i framework stessi.

Per riassumere, Node.js non è né un linguaggio di programmazione né un framework; è un ambiente per la loro esecuzione.

Node.js è Frontend o Backend?

Un malinteso comune tra gli sviluppatori è che Node.js sia un framework backend utilizzato esclusivamente per costruire server. Questo non è vero: Node.js può essere utilizzato sia sul frontend che sul backend.

Una delle ragioni per cui i framework Node.js sono una scelta molto popolare tra gli sviluppatori che costruiscono un backend flessibile e scalabile è nella sua natura event-driven e non bloccante. Ma gli sviluppatori frontend vedranno altrettanto chiaramente nel loro lavoro questi vantaggi offerti da Node.js.

Perché Node.js funziona sia per il backend che per il frontend?

  1. Riusabilità – JavaScript è un linguaggio molto utilizzato sia per il backend che per il frontend, con l’aiuto di framework come Express.js e Meteor.js. Alcuni stack popolari come MERN utilizzano Express.js come backend (un framework Node.js). Inoltre, tra frontend e backend possono essere riutilizzati più componenti.
  2. Produttività ed efficienza degli sviluppatori – Grazie alla riduzione del passaggio di contesto tra più linguaggi, si può permettere agli sviluppatori di risparmiare molto tempo. Utilizzare JavaScript sia per il backend che per il frontend porta ad una maggiore efficienza, dato che molti strumenti sono comuni ad entrambi.
  3. Enorme community – Una fiorente community online contribuisce alla velocità di un ciclo di sviluppo di successo. Quando vi bloccate su un problema, c’è una buona probabilità che qualcuno l’abbia già risolto e abbia condiviso la soluzione su Stack Overflow. Node.js fa grande uso di questa community attiva e impegnata.

Come Iniziare con Node.js

Decidere da dove iniziare con Node.js può spaventare. Per fortuna è abbastanza semplice da installare. Una volta fatto, sarete in grado di provarlo da soli.

Come Installare Node.js

Se avete già installato Node.js, passate pure oltre questa sezione.

Su macOS

Con Bash su Mac

curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"

Con Homebrew su Mac

brew install node

Su Windows

Scaricate il Windows Installer direttamente dal sito di nodejs.org.

Su Linux

Su Ubuntu 18.04+ potete installare Node utilizzando i seguenti comandi.

sudo apt update
sudo apt install nodejs

Verificare la Versione di Node.js Installata

Nella sezione precedente, abbiamo visto come installare Node. Ora verifichiamo la versione installata. Eseguite il seguente comando nel terminale.

node -v

Potete anche controllare tramite il flag più lungo

node --version

Dovreste vedere un output simile a questo, anche se il numero di versione potrebbe essere diverso.

v14.16.0

Cos’è NPM?

NPM è il sistema di pacchetti di Node.js. È il più grande ecosistema di tutte le librerie open-source del mondo, con oltre 1 milione di pacchetti, in continuo aumento. NPM è gratuito e gode del contributo quotidiano di migliaia di sviluppatori open source.

NPM è dotato di una utility a riga di comando pronta all’uso. Vi basta semplicemente andare sul sito web di NPM, cercare il pacchetto di cui avete bisogno e installarlo con un singolo comando. Tramite questa utility a riga di comando, potete anche gestire le versioni del vostro pacchetto, rivedere le dipendenze ed anche impostare script personalizzati nei vostri progetti. Senza dubbio, NPM è il patrimonio più amato della community di Node.js; Node.js attrae un gran numero di sviluppatori soprattutto grazie al suo eccellente supporto dei pacchetti.

Installare i Pacchetti NPM via CLI

Con Node.js viene automaticamente installato NPM. Nelle sezioni precedenti abbiamo spiegato come installare Node.js, quindi ora vediamo qual è il comando per installare un pacchetto con NPM:

npm install <package-name>

Sì, è proprio così facile! Potete anche installare più pacchetti in una volta sola:

npm install <pkg-1> <pkg-2> <pkg-3>

Potete specificare il flag -g (global) per installare un pacchetto nel contesto globale. Questo vi permette di utilizzare il pacchetto ovunque voi siate sulla vostra macchina.

Quando inizializzate una nuova applicazione, NPM crea automaticamente un file package.json che consiste in tutti i pacchetti NPM. È qui che potete specificare versioni, dipendenze e script personalizzati.

C’è un lungo elenco di comandi insieme alla utility NPM, tra cui publish, audit, run e altro. Potete scoprire come utilizzarli con il comando npm help.

Versione di Node e npm.
Versione di Node e npm.

Pacchetti Popolari

Ecco alcuni dei pacchetti più popolari di Node.js oggi:

  • Express – Express.js, o semplicemente Express, è un framework di sviluppo web ispirato a Sinatra per Node.js ed è lo standard de-facto per la maggior parte delle applicazioni Node.js.
  • MongoDB – È il driver ufficiale di MongoDB. Fornisce l’API per i database a oggetti MongoDB in Node.js.
  • Socket.io – Socket permette una comunicazione in tempo reale, bidirezionale e basata sugli eventi.
  • Lodash – Lodash rende JavaScript più facile, togliendo il fastidio di lavorare con array, numeri, oggetti, stringhe, ecc.
  • Moment – È una libreria di gestione delle date in JavaScript che consente di analizzare, validare, manipolare e formattare le date.
  • Commander.js – Questo è tutto ciò di cui avete bisogno per lavorare con interfacce a riga di comando per node.js.
  • Forever – Un semplice strumento CLI per assicurare che un dato script venga eseguito continuamente (cioè per sempre). Mantiene il vostro processo Node.js in produzione di fronte a qualsiasi fallimento inaspettato.
  • Async – Un modulo di utilità che fornisce funzioni semplici e potenti per lavorare con JavaScript in modalità asincrona.
  • Redis – Una libreria client per l’integrazione del database Redis.
  • Mocha – Un framework di test JavaScript pulito e flessibile per Node.js e per il browser.
  • Passport – Autenticazione semplice e discreta per Node.js. L’unico scopo di Passport è quello di autenticare le richieste.

Hello World in Node.js

Come sempre, iniziamo con il programma base “Hello World”, dove creiamo un server in Node.js che restituirà un output “Hello World” su richiesta del server. Prima di iniziare, assicuratevi di avere un buon editor di testo.

Una volta aperto il vostro editor di testo, ecco il codice da usare per il vostro programma “Hello World”:

// server.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World! Welcome to Node.js');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Salvate questo file come `server.js` e poi andate al terminale e avviate il server con il comando

node server.js

Il server dovrebbe ora iniziare a lavorare. Per verificare l’output, aprite http://localhost:3000 nel vostro browser. Dovreste vedere il messaggio –

Hello World! Welcome to Node.js

Spiegazione di Hello World Server

Node.js è dotato di un modulo integrato chiamato “HTTP” che permette a Node.js di trasferire dati tramite il protocollo HyperText Transfer Protocol (HTTP).

Nel codice qui sopra, prima carichiamo il modulo http nel nostro programma, poi utilizziamo il metodo createServer per accettare una richiesta e restituire una risposta con un codice di stato. Infine, ascoltiamo su una porta definita.

Congratulazioni, avete appena creato il vostro primo server in Node.js! Nella prossima sezione, vedremo come utilizzare il framework Express per creare un server.

Creare un Server con Express

In primo luogo, dovremmo spiegare su cosa sia un server. Un server è responsabile di raccogliere le richieste dei client tramite il suo software (più comunemente Apache o Nginx), eseguire la serie di task richiesti e, infine, inviare le risposte ai client. Express è un framework che ci aiuta a creare un server in Node.

Express.js è un framework per applicazioni web Node.js minimale e flessibile, dotato di un solido set di funzioni per applicazioni web e mobile. Permette di aggiungere tabelle route e di impostare il middleware nella vostra applicazione. Potete installare Express con il seguente comando.

npm install express --save

Nella sezione precedente, per creare un server abbiamo utilizzato la utility http integrata. Ora creiamo un server “Hello World” utilizzando Express.js.

Aprite il vostro editor di testo e inserite questo codice:


// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000

// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})

app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})

Successivamente, eseguiremo il nostro server con il seguente comando.

node server-express.js

Ora digitate http://localhost:3000 nel vostro browser per vedere qual è l’output di “Hello World”.

Riepilogo

In sintesi, Node.js è un popolare ambiente di programmazione che può essere utilizzato per costruire applicazioni su larga scala che hanno bisogno di supportare più richieste concorrenti. L’I/O single-threaded non bloccante lo rende una scelta eccellente sia per applicazioni real-time che per lo streaming dei dati.

Node.js ha anche una imponente community di sviluppatori attivi e vanta il più grande repository di pacchetti open-source del mondo, NPM, che al momento conta oltre un milione di pacchetti.

È facile iniziare a lavorare con Node.js. Abbiamo spiegato come installare e creare un server in Node.js, quindi tutto ciò che vi rimane da fare è pensare a come utilizzare e implementare Node.js nel vostro stack. Potete anche allargare le vostre conoscenze consultando la documentazione ufficiale di Node.js su nodejs.dev.