In origine, JavaScript veniva utilizzato soprattutto lato client. In questo scenario gli script JavaScript, generalmente incorporati all'interno dell'HTML di una pagina web, vengono interpretati da un motore di esecuzione incorporato direttamente all'interno di un web browser. Node.js consente invece di utilizzare JavaScript anche per scrivere codice da eseguire lato server, ad esempio per la produzione del contenuto delle pagine web dinamiche, prima che la pagina venga inviata al browser dell'utente. Node.js in questo modo permette di implementare il cosiddetto paradigma "JavaScript everywhere" (JavaScript ovunque), unificando lo sviluppo di applicazioni Web intorno a un unico linguaggio di programmazione (JavaScript).
Node.js ha un'architettura orientata agli eventi che rende possibile l'I/O asincrono. Questo design punta ad ottimizzare il throughput e la scalabilità nelle applicazioni web con molte operazioni di input/output, è inoltre ottimo per applicazioni web sistema real-time (ad esempio programmi di comunicazione in tempo reale o browser game).
Node.js è stato originariamente creato da Ryan Dahl nel 2009, circa tredici anni dopo l'introduzione del primo ambiente JavaScript lato server, il Web LiveWire Pro di Netscape. La versione iniziale supportava solo Linux e Mac OS. Il suo sviluppo e la sua manutenzione erano guidati da Dahl e in seguito sponsorizzati da Joyent.
Nel giugno 2011 Microsoft e Joyent hanno implementato una versione Windows nativa di Node.js[1]. La prima build di Node.js che supporta Windows è stata rilasciata nel luglio 2011.
Nel gennaio 2012 Dahl si è fatto da parte, promuovendo il collega e creatore di npm Isaac Schlueter a gestire il progetto[2]. Nel gennaio 2014 Schlueter ha annunciato che Timothy J. Fontaine avrebbe guidato il progetto[3].
Nel dicembre 2014, Fedor Indutny ha avviato io.js, un fork di Node.js. A causa del conflitto interno sulla governance di Joyent, io.js è stata creata come alternativa di governance aperta con un comitato tecnico separato[4]. A differenza di Node.js[5] gli autori hanno pianificato di mantenere io.js aggiornato con le ultime versioni del motore JavaScript V8 di Google[6].
Nel febbraio 2015 è stata annunciata l'intenzione di formare una Fondazione Node.js neutrale. A giugno 2015 le comunità Node.js e io.js hanno votato per lavorare insieme nell'ambito della Fondazione Node.js[7].
A settembre 2015 Node.js v0.12 e io.js v3.3 sono stati fusi in Node v4.0[8]. Questa unione ha portato le funzionalità di V8 ES6 in Node.js e un ciclo di rilascio del supporto a lungo termine[9]. A partire dal 2016 il sito web io.js consiglia agli sviluppatori di tornare a Node.js e che non sono previste ulteriori versioni di io.js a causa della fusione[10].
Nel 2019 la JS Foundation e la Node.js Foundation si sono fuse per formare la OpenJS Foundation.
Efficienza
Il modello di networking su cui si basa Node.js non è quello dei processi concorrenti, ma I/Oevent-driven: ciò vuol dire che Node richiede al sistema operativo di ricevere notifiche al verificarsi di determinati eventi, e rimane quindi in modalità sleep fino alla notifica stessa: solo in tale momento torna attivo per eseguire le istruzioni previste nella funzione di callback, così chiamata perché da eseguire una volta ricevuta la notifica che il risultato dell'elaborazione del sistema operativo è disponibile. Tale modello di networking, implementato anche nella libreria Event machine per Ruby e nel framework Twisted per Python, è ritenuto più efficiente nelle situazioni critiche in cui si verifica un elevato traffico di rete[11][12].
Governance del progetto
Nel 2015 vari rami della più ampia comunità di Node.js hanno iniziato a lavorare sotto la Node.js Foundation indipendente dai fornitori. Lo scopo dichiarato dell'organizzazione è[13]
«consentire l'adozione diffusa e aiutare ad accelerare lo sviluppo di Node.js e altri moduli correlati attraverso un modello di governance aperto che incoraggia la partecipazione, il contributo tecnico e un quadro per la gestione a lungo termine da parte di un ecosistema investito in Node.js.»
Il Comitato tecnico direttivo della Fondazione Node.js (TSC) è l'organo di governo tecnico della Fondazione Node.js. Il TSC è responsabile del repository principale Node.js, nonché dei progetti dipendenti e adiacenti. Generalmente il TSC delega l'amministrazione di questi progetti a gruppi di lavoro o comitati[14]. Il gruppo LTS che gestisce le versioni supportate a lungo termine è uno di questi gruppi. Altri gruppi attuali includono Addon API, Benchmarking, Documentazione e Testing[15].
Nell'agosto 2017 un terzo dei membri del TSC si è dimesso a causa di una controversia relativa al codice di condotta del progetto[16].
^ Isaac Schlueter, The Next Phase of Node.js, su nodejs.org, 15 gennaio 2014. URL consultato il 21 gennaio 2014.
^ Krill, Paul, Why io.js Decided to Fork Node.js, su javaworld.com, JavaWorld, 4 dicembre 2014. URL consultato il 15 dicembre 2014 (archiviato dall'url originale il 30 giugno 2017).
^Io.js, JavaScript I/O, "io.js has merged with the Node.js project again. There won't be any further io.js releases. All of the features in io.js are available in Node.js v4 and above."