Il buono e il cattivo di Node.js Web App Development

author
17 minutes, 31 seconds Read
CONTENUTI

Tempo di lettura: 13 minuti

Essendo il linguaggio di programmazione più popolare, JavaScript è anche una delle tecnologie di sviluppo software più universale. Tradizionalmente usato come strumento di sviluppo web frontend, è diventato anche un importante strumento di sviluppo mobile multipiattaforma come tecnologia di base per un gran numero di piattaforme, come Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.

Ma le aree di applicazione per JavaScript non finiscono qui. Ultimamente, c’è stato molto fermento intorno all’uso di JavaScript per la programmazione lato server. Uno degli strumenti che ha indicato questo cambiamento nello sviluppo web è stato Node.js.

Che cos’è Node.js?

Node.js non è in realtà un framework o una libreria, ma un ambiente runtime, basato sul motore JavaScript V8 di Chrome.

La tecnologia è stata presentata per la prima volta nel 2009 da Ryan Dahl all’annuale European JSConf ed è stata immediatamente riconosciuta come “il più eccitante singolo pezzo di software nell’attuale universo JavaScript”.

Come progetto open-source, Node.js è stato sponsorizzato da Joyent, un fornitore di soluzioni di cloud computing e hosting. L’azienda ha investito in una serie di altre tecnologie, come il framework Ruby on Rails, e ha fornito servizi di hosting a Twitter e LinkedIn. Quest’ultimo divenne anche una delle prime aziende a utilizzare Node.js per il suo backend di applicazioni mobili. La tecnologia è stata poi adottata da un certo numero di leader tecnologici, come Uber, eBay, Walmart e Netflix, per citarne alcuni.

Tuttavia, non è stato fino a poco tempo fa che è iniziata un’ampia adozione di JavaScript lato server con Node.js. L’interesse per questa tecnologia ha raggiunto un picco nel 2017, secondo Google Trends, e rimane alto.

Download di Node.js. Installa il Long-Term Support e le ultime versioni di Node.js per Windows e MacOS qui. Inoltre, un promemoria – npm è distribuito con Node.js out-of-the-box.

Documentazione. Trova i documenti e le guide per iniziare al link.

Gli IDE di Node.js. Quasi ogni popolare editor di codice ha supporto e plugin per JavaScript e Node.js, quindi conta solo come si personalizza il proprio IDE per le proprie esigenze di codifica. Ma, molti sviluppatori lodano molto gli strumenti speciali di VS Code, Brackets, Atom e WebStorm.

Frameworks. Usare middleware su Node.js puro è una pratica comune che rende la vita degli sviluppatori più facile. Abbiamo un articolo separato che confronta i frameworks Node.js più popolari, dove guardiamo Express.js, Meteor, Sales.js, Koa.js, Keystone.js, e Loopback.js.

Per altri strumenti dell’ecosistema JavaScript usati con Node.js, vedi l’articolo dedicato.

Punti di forza e debolezze di Node.js lo rendono oggetto di un’accesa discussione. Per mettere le cose in chiaro, abbiamo analizzato entrambi – pro e contro di Node.js – nel tentativo di scoprire quali progetti possono beneficiare di questa scelta tecnologica. Allora, perché usare Node.js?

Una veloce spiegazione di cos’è Node.js (per favore, iscriviti se vuoi altri contenuti video)

I vantaggi di Node.js

⊕ Robusto stack tecnologico

JavaScript ha dimostrato di essere un leader indiscusso tra i linguaggi di programmazione più popolari. A sua volta, Node.js è diventato un nome autonomo nel settore. Con un totale di 368.985.988 download e oltre 750 nuovi collaboratori, come dichiarato nel rapporto Node-by-numbers 2018, il progetto sembra essere più forte che mai.

Usando Node.js per il backend, si ottengono automaticamente tutti i pro dello sviluppo JavaScript full stack, come:

  • migliore efficienza e produttività generale degli sviluppatori
  • condivisione e riutilizzo del codice
  • velocità e prestazioni
  • facile condivisione della conoscenza all’interno di un team
  • un enorme numero di strumenti gratuiti

Di conseguenza, il tuo team è molto più flessibile, lo sviluppo richiede meno tempo e, di conseguenza, ottieni un software veloce e affidabile. Gli sviluppatori formati in JavaScript frontend possono iniziare a programmare il lato server con il minimo sforzo. Con lo stesso linguaggio su entrambi i lati, è possibile riutilizzare il codice sul frontend e sul backend avvolgendolo in moduli e creando nuovi livelli di astrazione.

Nonostante una credenza comune, essendo uno sviluppatore full stack non sei in alcun modo limitato al tradizionale stack MEAN (MongoDB, Express.js, AngularJS e Node.js). L’unico must in questo caso è Node.js (non c’è alternativa in JavaScript per la programmazione backend). Il resto delle tecnologie all’interno di questo stack sono opzionali e possono essere sostituite con alcuni altri strumenti che forniscono funzionalità simili (leggi le alternative nel nostro articolo separato).

⊕ Elaborazione veloce e modello basato sugli eventi

Node.js è veloce; non è un mito. Dai un’occhiata ai test di performance di toptal.com, confrontando come GO, PHP, Java e Node.js gestiscono le richieste concorrenti. Ci sono un paio di ragioni per cui Node.js mostra tali risultati:

Motore V8. Il motore usato nell’implementazione di Node.js è stato originariamente sviluppato per il browser Chrome. Scritto in C++, V8 di Chrome è usato per compilare funzioni scritte in JavaScript in codice macchina, e fa il lavoro ad una velocità impressionante. Basta controllare i benchmark delle prestazioni nel blog di V8. Grazie a Google che investe pesantemente nel suo motore, V8 dimostra miglioramenti nelle prestazioni ogni anno, e Node.js ne estrae tutti i benefici.

Input/Output non bloccanti e gestione asincrona delle richieste hanno reso Node.js capace di elaborare le richieste senza alcun ritardo. Nel contesto del backend, l’elaborazione sincrona presuppone che il codice venga eseguito in sequenza. Così, ogni richiesta blocca un thread, facendo aspettare le altre richieste per il suo completamento. L’elaborazione asincrona permette alle richieste di essere elaborate senza bloccare (I/O non bloccante) il thread. Così, dopo che una richiesta è stata elaborata, può spingere fuori un callback e continuare a servire le richieste. Questo aiuta Node.js a sfruttare al massimo il single threading, ottenendo tempi di risposta brevi e un’elaborazione concorrente.

Un altro aspetto è il modello basato sugli eventi. Quando si usa un linguaggio comune per entrambi i lati client/server, la sincronizzazione avviene velocemente, il che è particolarmente utile per applicazioni in tempo reale basate su eventi. Grazie alla sua natura asincrona, non bloccante e single-threaded, Node.js è una scelta popolare per i giochi online, le chat, le videoconferenze o qualsiasi soluzione che richiede dati costantemente aggiornati.

Gli esempi parlano da soli: molte aziende leader hanno cambiato tecnologia per sviluppare applicazioni Node.js e hanno notato miglioramenti significativi – PayPal, per esempio, ha notato una diminuzione del 35% nel tempo di risposta dopo la migrazione da Java.

⊕ Tecnologia scalabile per i microservizi

Siccome è uno strumento tecnologico leggero, usare Node.js per l’architettura dei microservizi è una grande scelta. Questo stile architettonico è meglio descritto da Martin Fowler e James Lewis come “un approccio allo sviluppo di una singola applicazione come una suite di piccoli servizi, ciascuno in esecuzione nel proprio processo e comunicanti con meccanismi leggeri, spesso un’API di risorse HTTP.”

Seguentemente, rompendo la logica dell’applicazione in moduli più piccoli, i microservizi, invece di creare un unico, grande nucleo monolitico, si consente una migliore flessibilità e si pongono le basi per un’ulteriore crescita. Di conseguenza, è molto più facile aggiungere altri microservizi in cima a quelli esistenti che integrare caratteristiche aggiuntive con la funzionalità di base dell’app.

Architettura monolitica vs architettura a microservizi in poche parole

Node.js è la tecnologia di scelta quando si costruiscono e distribuiscono soluzioni dell’ecosistema microservizi, secondo il Node.js User Survey Report 2017. Circa la metà degli intervistati utilizza tecnologie legate ai microservizi (in particolare Docker, la principale piattaforma di containerizzazione del software) per costruire app web Node.js:

Percentuale di sviluppatori che utilizzano la containerizzazione Docker con Node.js

I risultati più recenti mostrano che le tecnologie legate ai microservizi come Docker e Kubernetes hanno registrato una crescita nell’uso nel 2018, poiché questo stile architettonico diventa solo più popolare. Con ogni microservizio che comunica con il database direttamente attraverso i flussi, tale architettura consente migliori prestazioni e velocità di applicazione. Una partita fatta in cielo è supportata da due framework ampiamente utilizzati per l’architettura a microservizi. Il framework Express elenca IBM e Uber tra i suoi utenti, mentre restify è usato da npm e Netflix.

Come esempio di implementazione dal vivo, il passaggio di Walmart all’architettura a microservizi con Node.js ha portato ai seguenti benefici immediati:

  • Crescita notturna del 20 per cento di conversione in generale e del 98 per cento di conversione mobile
  • Cento per cento di uptime durante il Black Friday (gestendo oltre 500 milioni di pagine viste)
  • Risparmiare fino al 40 per cento sull’hardware e il 20-50 per cento sulle operazioni generali

Un altro brillante esempio di come Node.js può superare la concorrenza in termini di prestazioni è il caso di GoDaddy. Eseguendo la campagna pubblicitaria del SuperBowl, l’azienda è stata in grado di gestire 10.000 richieste al secondo senza tempi morti, utilizzando solo il 10% dell’hardware grazie a Node.js.

⊕ Ricco ecosistema

Una parola – npm, un gestore di pacchetti Node.js predefinito, serve anche come un mercato per strumenti JavaScript open source, che gioca un ruolo importante nel progresso di questa tecnologia. Con circa 836.000 librerie disponibili nel registro npm al momento, e oltre 10.000 nuove che vengono pubblicate ogni settimana, l’ecosistema Node.js è abbastanza ricco. Le stesse statistiche sottolineano che il 97% delle moderne applicazioni web consiste in moduli npm. E questa è la prova della sua indiscutibile popolarità tra gli sviluppatori.

Con una così grande varietà di strumenti gratuiti accessibili in pochi clic, c’è un enorme potenziale per l’uso di Node.js. Allo stesso tempo, il software open source gode di una crescente popolarità in quanto permette di costruire nuove soluzioni riducendo i costi complessivi di sviluppo e il time to market.

⊕ Forte supporto aziendale

Come detto sopra, lo sviluppo di Node.js è stato sostenuto da Joyent. Nel 2015, la Node.js Foundation è stata creata per “permettere l’adozione diffusa e aiutare ad accelerare lo sviluppo di Node.js.” IBM, Microsoft, PayPal, Fidelity e SAP sono diventati i membri fondatori dell’organizzazione.

L’elenco delle organizzazioni che utilizzano Node.js in produzione è in costante crescita. Attualmente comprende quasi trecento aziende famose, come PayPal, Medium, Trello, Uber e Zendesk.

Molto pochi progetti open source hanno goduto di un sostegno così forte da parte delle aziende leader mondiali. E questo preannuncia che Node.js ha un potenziale eccezionale.

⊕ Supporto JSON senza soluzione di continuità

Anche se altre tecnologie backend come PHP e Ruby on Rails possono usare il formato JSON per la comunicazione, Node.js lo fa senza convertire tra modelli binari e usa JavaScript. Questo è particolarmente comodo quando è necessario costruire API RESTful per il supporto di database NoSQL, come MongoDB – la lettera M nello stack MEAN. Questa comunicazione senza soluzione di continuità con uno dei principali standard di trasferimento dati è un altro vantaggio dell’ecosistema JavaScript.

Gli svantaggi di Node.js

Θ Strozzature di prestazioni con compiti di calcolo pesanti

Il più grande svantaggio di Node.js anche ora è la sua incapacità di elaborare compiti legati alla CPU. Ma, per capire quali sono le radici di questo problema, abbiamo bisogno di un po’ di contesto. Cominciamo dalle basi, con JavaScript stesso.

Come sappiamo, Node.js è un ambiente runtime che esegue JavaScript sul lato server. Essendo un linguaggio di programmazione frontend, JavaScript utilizza un singolo thread per elaborare rapidamente i compiti. Il threading non è richiesto per funzionare, perché i compiti in JavaScript sono leggeri e richiedono poca CPU.

Tornando a Node.js, ora sappiamo perché è considerato a thread singolo: Elabora JavaScript, che è a thread singolo. Un modello di input/output non bloccante significa che Node.js risponde alla chiamata del client per avviare una richiesta ed elabora il compito durante il tempo in cui spara la callback, man mano che il compito è pronto. Elaborando i compiti in modo asincrono, Node esegue il codice JS sul suo singolo thread su base evento. Questo è ciò che si chiama un event-loop.

Il problema si verifica quando Node.js riceve un compito legato alla CPU: Ogni volta che una richiesta pesante arriva all’event-loop, Node.js imposterebbe tutta la CPU disponibile per processarla per prima, e poi rispondere alle altre richieste in coda. Ciò si traduce in un’elaborazione lenta e in un ritardo complessivo nel ciclo degli eventi, motivo per cui Node.js non è raccomandato per calcoli pesanti.

Tuttavia, nel 2018, il multithreading è stato introdotto in Node.js come caratteristica sperimentale con l’aggiornamento 10.5.0. Una nuova caratteristica chiamata modulo worker threads può essere utilizzata per sfruttare ulteriori threads da un pool di thread, per portare compiti legati alla CPU. Ma questo può essere fatto solo su macchine con più core, poiché Node.js permette ancora di usare un core per un thread. Ciò significa che i processi paralleli pesanti possono essere eseguiti su un thread diverso. Questa caratteristica rimane sperimentale nella versione 12 di Node.js, ma è stata significativamente migliorata.

Θ Callback hell issue

A causa della sua natura asincrona, Node.js si basa molto sulle callback, le funzioni che vengono eseguite dopo che ogni task in coda è finito. Mantenere un certo numero di compiti in coda in background, ognuno con il suo callback, potrebbe portare al cosiddetto inferno di callback, che ha un impatto diretto sulla qualità del codice. In parole povere, è una “situazione in cui le callback sono annidate all’interno di altre callback a diversi livelli di profondità, rendendo potenzialmente difficile la comprensione e la manutenzione del codice.”

Esempio di codice con callback annidate

Fonte immagine: callbackhell.com

Ma questo è spesso considerato un segno di cattivi standard di codifica e mancanza di esperienza con JavaScript e Node.js in particolare. Il codice, rappresentato sopra, può essere rifatto e semplificato, in pochi passi, come mostrato in callbackhell.com.

Θ Immaturità degli strumenti

Anche se i moduli di base di Node.js sono abbastanza stabili e possono essere considerati maturi, ci sono molti strumenti nel registro di npm che sono di scarsa qualità o non adeguatamente documentati/testati. Inoltre, il registro stesso non è strutturato abbastanza bene da offrire gli strumenti in base alla loro valutazione o qualità. Quindi potrebbe essere difficile trovare la soluzione migliore per i propri scopi senza sapere cosa cercare.

Il fatto che il Node.L’ecosistema js è per lo più open source, ha anche il suo impatto. Mentre la qualità della tecnologia di base di Node.js è supervisionata da Joyent e da altri importanti collaboratori, il resto degli strumenti potrebbe mancare della qualità e degli alti standard di codifica stabiliti dalle organizzazioni globali.

Θ Crescente domanda di professionisti esperti

Nonostante una credenza comune, non tutti gli sviluppatori JavaScript sono anche sviluppatori Node.js. Padroneggiare la programmazione JavaScript lato server richiede un notevole sforzo e un certo background nello sviluppo backend. A causa di una curva di apprendimento così ripida, il numero di ingegneri Node.js è significativamente inferiore al numero totale di professionisti JS.

Come l’hype su Node.js continua a crescere, la domanda di professionisti esperti in questo campo aumenta.

C’è un grande divario di conoscenza tra gli studenti di ingegneria che iniziano il loro lavoro e le esigenze dei datori di lavoro
Fonte: HackerRank

Quindi, con milioni di sviluppatori JavaScript là fuori, potrebbe essere difficile trovare un abile professionista Node.js per il tuo progetto. In questo caso, certamente non vuoi limitare la tua ricerca a un solo paese. Cercare talenti tecnici all’estero è diventata la norma nell’industria IT.

Come imparare Node.js

Ecco il tuo pacchetto iniziale per capire e lavorare con Node.js.

Turorial. Non limitarti ai documenti ufficiali: Guarda tonnellate di lezioni gratuite su W3Schools, visita i workshop internazionali di Nodeschool e, naturalmente, usa la libreria di tutorial gratuiti di freeCodeCamp.

Classi. Se sei uno studente dedicato, inizia un corso online su Node.js: qui ce n’è uno su PluralSight, e naturalmente uno su Udemy.

Apprendimento interattivo. Vedi risorse gratuite e a pagamento che ti permettono di imparare Node.js usando lezioni ed esercizi interattivi. Uno dei più popolari è The Art of Node.

Comunità. Vedi la lista ufficiale dei progetti di Node.js gestiti dalla comunità. Un consiglio veloce: cerca su Facebook gruppi e comunità nella tua zona/prima lingua. E naturalmente, fate riferimento alle comunità Node.js su Reddit, un tag su StackOverflow, e l’argomento su Quora.

Node.js vs Ruby on Rails vs Django vs Symfony

Non ci sono molte tecnologie che possono competere con la popolarità di Node.js o la domanda del mercato. Tuttavia, se guardiamo alle alternative per la programmazione lato server, vediamo almeno altre tre stelle splendenti nel cielo. Sono Ruby on Rails, Django e Symfony. Vediamo se reggono i vantaggi di Node.js e ne condividono gli svantaggi.

Confronto delle statistiche di Node.js, Rails, Django e Symfony

Fonte: StackShare

Ruby on Rails è noto per il suo linguaggio semplice ma discreto e per la disponibilità di gemme – l’ecosistema di pacchetti personalizzati di Rails. Ruby stesso è un linguaggio intuitivo e adatto ai principianti, con una comunità solidale e dedicata che contribuisce al codice di RubyGems. Rails è stato creato per lo sviluppo rapido e la prototipazione, anche se è usato con successo da marchi come GitHub, Twitter e Airbnb, dimostrando la sua vasta gamma di casi d’uso. La sua funzionalità di migrazione dei dati è particolarmente impressionante – a differenza di Node.js, che usa pacchetti aggiuntivi, Rails ha già una caratteristica che ti permette di manipolare facilmente e coerentemente il tuo database.

Quando dovresti usare Rails invece di Node.js? Rails non può competere con le prestazioni e la scalabilità di Node, tuttavia, Rails può essere una scelta migliore per uno sviluppo veloce. Node.js deve usare moduli di terze parti per raggiungere quella velocità di sviluppo, ma Ruby ha tutto questo in modo non convenzionale. Per quanto riguarda il linguaggio, nessuno strumento ha un vantaggio distinto – mentre Node.js ha un’alta domanda ma una bassa proposta, il pool di talenti di Ruby è inizialmente più piccolo.

Django è un framework web su Python, il linguaggio di programmazione in più rapida crescita secondo i dati su StackOverflow. Commercializzato come uno strumento per perfezionisti con scadenze, è stato creato per creare applicazioni il più velocemente possibile e nel modo più strutturato, sicuro e facile da capire. Django, insieme a Python, è anche considerato avere una curva di apprendimento più blanda. Mentre lavorare con Node.js richiederà una vasta conoscenza di JavaScript, Django è una tecnologia “inclusa nelle batterie”. Ha un pannello di amministrazione integrato per aggiornare e mantenere facilmente i vostri database e modelli per accelerare il vostro lavoro.

Quando dovreste usare Django rispetto a Node.js? Rispetto a Node.js, Django è uno strumento adatto ai principianti. A parte il linguaggio stesso, non c’è una vera ragione per scegliere uno piuttosto che l’altro. È più una questione di comfort e di esperienza con JavaScript o Python che di casi d’uso specifici.

Symfony è un framework PHP che fornisce automaticamente più di 20 anni di documentazione e una comunità massiccia e attiva. Più dell’80% del web è alimentato da PHP con progetti come Facebook, Baidu, o qualsiasi altro sito web che gira su WordPress. Mentre Symfony è solo uno dei framework PHP sul mercato, è incredibilmente stabile, scalabile e funziona bene per progetti su larga scala. Utilizza anche un motore di template Twig che funziona in modo simile a molti sistemi di gestione dei contenuti basati su PHP.

Quando si dovrebbe usare Symfony invece di Node.js? Symfony supporta naturalmente le caratteristiche dei CMS come i template e le dashboard amministrative che gli permettono di gestire blog, siti di notizie e negozi eCommerce. Alcuni esempi sono Yahoo Answers, Dailymotion e National Geographic.

Fai brillare Node.js

Ovviamente, con tutti i vantaggi e gli svantaggi elencati di Node.js, la tecnologia non è una pallottola d’argento. Ma nemmeno Java, .Net framework o PHP lo sono. Eppure, ci sono casi specifici in cui ciascuna delle tecnologie elencate si comporta meglio. Per Node.js, si tratta di applicazioni in tempo reale con intensi I/O, che richiedono velocità e scalabilità.

Si potrebbe trattare di social network, applicazioni di gioco, chat dal vivo o forum, così come software di borsa o server pubblicitari, dove la velocità è tutto. Veloce e scalabile, Node.js è la tecnologia di scelta per i dispositivi e le applicazioni IoT ad alta intensità di dati e in tempo reale.

Node.js ha reso JavaScript una tecnologia full-stack di scelta per lo sviluppo di applicazioni web. Grazie alla sua architettura non bloccante, Node.js funziona bene per la codifica e la trasmissione di video e audio, il caricamento di più file e lo streaming dei dati. Quest’ultimo potrebbe essere estremamente utile per il software dell’industria dei viaggi in cui è necessario prelevare dati da diverse API di diversi fornitori.

Di recente, Node.js è stato attivamente utilizzato nel software di livello enterprise. Mentre ci sono ancora molte discussioni su questo, molte grandi aziende e organizzazioni globali, come Capital One e la NASA, hanno già adottato Node.js. E l’ecosistema enterprise Node.js continua a maturare con strumenti come IBM API Connect, Triton di Joyent, N|Solid di NodeSource, Red Hat OpenShift, Trace di RisingStack e altri.

Questo post fa parte della nostra serie “Il buono e il cattivo”. Per maggiori informazioni sui pro e i contro delle tecnologie più popolari, vedi gli altri articoli della serie:

Il buono e il cattivo di Xamarin Mobile Development

Il buono e il cattivo di JavaScript Full Stack Development

Il buono e il cattivo di ReactJS e React Native

Il buono e il cattivo del linguaggio di programmazione Swift

Il buono e il cattivo di .NET Framework Programming

Il buono e il cattivo dello sviluppo Angular

Il buono e il cattivo dello strumento di automazione dei test Selenium

Il buono e il cattivo dello sviluppo di applicazioni Android

Similar Posts

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.