Express, Koa, Meteor, Sails.js: quattro strutture dell'Apocalisse

Pubblicato: 2022-03-11

JavaScript è diventato sicuramente uno dei linguaggi più popolari negli ultimi anni, a causa dell'enorme richiesta di applicazioni web. Durante la codifica per più browser, JavaScript è quasi l'unica scelta per gli sviluppatori front-end. Si potrebbe obiettare che ci sono CoffeeScript, TypeScript o Dart come alternative. Tuttavia, la verità è che CoffeeScript è per lo più visto come uno zucchero sintattico che alla fine si riduce a JavaScript. TypeScript è semplicemente un superset di JavaScript che include diverse funzionalità del linguaggio orientato agli oggetti, come tipizzazione statica opzionale, classi e interfacce, ed è ancora agli albori. Dart è anche un linguaggio orientato agli oggetti che ha una sintassi simile al C, ma si compila ancora in JavaScript per i browser tradizionali.

Con la nascita e la rapida crescita di Node.js, JavaScript non è più limitato allo sviluppo front-end e lo sviluppo back-end non è più una scienza missilistica per i programmatori front-end. Le persone tendono a pensare a JavaScript come a un proiettile d'argento che si adatta a tutte le situazioni: front-end, server Web, applicazioni desktop, sistemi embedded, database... l'elenco continua ad allungarsi. In effetti, dato il pubblico diffuso di JavaScript, Node.js+MongoDB+AngularJS/React ha creato una grande quantità di sviluppatori web full stack. Tuttavia, Node.js è progettato per essere leggero e fornisce solo funzionalità fondamentali come server Web per aumentare la velocità di sviluppo delle applicazioni Web. Uno dei framework disponibili come pacchetti npm sarebbe un'opzione migliore nel mondo reale.

In questo post, esamineremo alcuni di questi framework Node.js ben noti e testati nel tempo che hanno sollevato gli sviluppatori dal dover reinventare la ruota più e più volte. Per essere più specifici, in questo articolo daremo un'occhiata a Express, Koa, Meteor e Sails.js. Invece di cercare di capire come ciascuno di questi framework si sovrappone l'uno all'altro, vedremo le aree chiave in cui ciascuno di questi framework eccelle e come sono rilevanti per le varie esigenze del progetto.

Express: un framework Web minimalista

Inutile dire che Express è il più grande affare per il business di Node.js. Ogni giocatore di Node.js ne ha sentito parlare e lo sta usando con o senza accorgersene. Attualmente è alla sua 4a generazione e ci sono alcuni framework Node.js costruiti sulla base di esso o ispirati dai suoi concetti.

Prestazione

La maggior parte degli sviluppatori adora Node.js per la sua velocità grezza e, quando si tratta di selezionare il framework, un perfezionista può disdegnare qualsiasi rischio di prestazioni. Express fornisce uno strato sottile su Node.js con le funzionalità delle applicazioni Web come il routing di base, il middleware, il motore di modelli e la pubblicazione di file statici, in modo che le drastiche prestazioni di I/O di Node.js non vengano compromesse.

Express è un framework minimo e senza opinione. non applica nessuno dei modelli di progettazione prevalenti come MVC, MVP, MVVM o qualsiasi cosa sia di tendenza fuori dagli schemi. Per gli appassionati della semplicità, questo è un grande vantaggio tra tutti gli altri framework perché puoi creare la tua applicazione con le tue preferenze e senza curva di apprendimento non necessaria. Ciò è particolarmente vantaggioso quando si crea un nuovo progetto personale senza oneri storici, ma man mano che il progetto o il team di sviluppo cresce, la mancanza di standardizzazione può portare a lavoro extra per la gestione del progetto/codice e, nel peggiore dei casi, può portare all'impossibilità di mantenere .

Generatore

Anche se il framework non ha opinioni, ha il generatore che genera una struttura di cartelle di progetto specifica. Dopo aver installato il pacchetto npm express-generator e aver creato lo scheletro dell'applicazione con il comando generatore, verrà creata una cartella dell'applicazione con una chiara gerarchia per aiutarti a organizzare immagini, JavaScript statico front-end, file di fogli di stile e file di modello HTML.

 npm install express-generator -g express helloapp
 create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts

Middleware

I middleware sono fondamentalmente solo funzioni che hanno pieno accesso sia agli oggetti di richiesta che di risposta.

Stack di gestione delle richieste

Come suggerisce il nome, il middleware applica alcune istruzioni di filtraggio prima di trasferire il controllo alla logica aziendale effettiva o al livello successivo di middleware. Alcune attività comuni, come il controllo dello stato di accesso dell'utente, la convalida dell'autorizzazione dell'utente o la prevenzione di attacchi tra siti, possono essere estratte come middleware.

 var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);

Un'applicazione Express è essenzialmente Node.js con una serie di funzioni middleware, sia che tu voglia personalizzare il tuo middleware o sfruttare i middleware integrati del framework, Express ha reso il processo naturale e intuitivo.

Motore di modelli

I motori di modello consentono allo sviluppatore di incorporare variabili di back-end in file HTML e, quando richiesto, il file di modello verrà visualizzato in un semplice formato HTML con le variabili interpolate con i loro valori effettivi. Per impostazione predefinita, il generatore di express utilizza il motore di modelli Pug (originariamente noto come Jade), ma anche altre opzioni come Moustache ed EJS funzionano perfettamente con Express.

Integrazione database

Come framework minimo, Express non considera l'integrazione del database come un aspetto richiesto all'interno del suo pacchetto, quindi non tende a nessun utilizzo specifico del database. Pur adottando una particolare tecnologia di archiviazione dei dati, che si tratti di MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch o qualcos'altro, si tratta solo di installare il particolare pacchetto npm come driver di database. Questi driver di database di terze parti non sono conformi alla sintassi unificata quando si eseguono le istruzioni CRUD, il che rende il cambio di database una grande seccatura e soggetto a errori.

Koa: utilizzo delle funzionalità JavaScript di nuova generazione

Koa è sviluppato dal team dietro Express e il suo obiettivo è ridurre al minimo l'Express minimalista non raggruppando alcun middleware all'interno del suo core. Oltre ad essere privo di middleware, Koa sembra molto simile a Express, leggero e privo di opinioni. Tuttavia, ciò che rende Koa davvero eccezionale è il suo modo di abbandonare completamente la richiamata utilizzando la funzione ES6 Generator.

Flusso di controllo elegante

Javascript è un linguaggio di programmazione asincrono e con tale istinto del linguaggio stesso e il meccanismo guidato da eventi a thread singolo di Node.js, il callback è ovunque, da qui il famigerato inferno del callback.

Un modo per appiattire l'annidamento delle callback consiste nell'usare Async.js. Async.js fornisce tecniche per mappare, parallelizzare, serializzare o iterare più funzioni senza dover incorporare l'una nell'altra e quindi passare il flusso di controllo con una funzione di callback, una funzione di callback e una di gestione degli errori sono sufficienti per la maggior parte delle funzioni raggruppate insieme da un metodo Async.js. Tuttavia Async.js non può cancellare completamente i callback. Quando si scrive codice Node.js con Async.js, l'indentazione del codice tende ancora a spostarsi a destra, ma non così in profondità.

Fuggi dall'inferno della richiamata

Un altro modo più pulito è usare le promesse allora in grado. Alcune librerie Promise di terze parti con reputazione sono bluebird e q. Nell'ultima edizione di JavaScript, ES6, Promise è stata adottata come standardizzazione. Per farla breve, Promise garantisce che le funzioni vengano eseguite e restituite in modo sequenziale collegando i blocchi/funzioni di implementazione con un gruppo di funzioni "allora" di Promise. Puoi "risolvere" alla fine di ogni blocco/funzione di implementazione in modo che la successiva funzione "allora" venga eseguita, oppure "rifiutare" la seguente implementazione in modo che il flusso di controllo passi direttamente alla gestione degli errori. In questo modo, aggreghi tutte le funzioni di gestione degli errori in un'unica posizione ed elimini completamente i callback.

Ora ES6 porta in tavola un punto di svolta: ES6 Generator. Questa nozione è nuova per JavaScript, ma non è affatto nuova nel mondo della programmazione. ES6 Generator è come un'interruzione in C, invece di eseguire righe di codice dall'alto verso il basso, ES6 Generator introduce un mezzo per eseguire->fermarsi ed eseguire qualcos'altro->torna per finire ciò che è rimasto.

Koa utilizza i generatori ES6 per fornire un modo elegante per far fronte alla programmazione asincrona JavaScript, quindi non puoi vedere i callback in un'applicazione Koa pura. Un tipico caso d'uso di ES6 Generator in Koa è il middleware a cascata, che consente al middleware personalizzato di essere eseguito uno dopo l'altro senza fastidiosi callback.

 var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);

Non possiamo saltare a conclusioni affermando che questa tecnica all'avanguardia è superiore alle soluzioni della vecchia scuola come Async.js, Promise o emettitore di eventi, ma una cosa è certa che questo nuovo concetto richiede del tempo per abituarsi. Con la sequenza del flusso di controllo non convenzionale, potrebbe causare ulteriori difficoltà al debug del codice.

Meteor: Framework per Web, dispositivi mobili e desktop

Meteor è un framework JavaScript all-in-one. Differenziandosi dalla filosofia di semplificazione di Express e Koa, va all'altro estremo definendosi un framework full-stack, un pacchetto completo che copre server, dispositivi mobili, desktop e app web.

Pacchetto uno per tutti

Se guardi da vicino sotto il cofano, noterai che Meteor è davvero Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js e MongoDB sono rispettivamente responsabili della logica aziendale lato server e dell'archiviazione dei dati. Uno tra Blaze, AngularJS o React si occupa dell'interfaccia utente front-end. E Cordova, in quanto soluzione HTML più famosa per le app ibride mobili, collega le pagine Web alle visualizzazioni mobili.

Sincronizzazione dei dati

Il processo principale per il back-end e il front-end per condividere i dati è il seguente:

  • Il cliente richiede dati o determinate viste HTML
  • Il server recupera i dati dal database, mescola i dati con la visualizzazione HTML utilizzando un motore di creazione di modelli e li invia di nuovo al front-end
  • Il cliente esegue il rendering e mostra i dati/la visualizzazione in modo intuitivo

Una moderna applicazione Web a pagina singola modifica leggermente il processo sopra. Prendi AngularJS come esempio, mette i modelli HTML come file statici insieme ad altre risorse come file JavaScript front-end, fogli di stile e immagini. AngularJS inserisce quindi i dati nei modelli HTML chiedendo i dati al back-end utilizzando l'API RESTful Ajax. In entrambi i casi, gli sviluppatori back-end sono pienamente responsabili della gestione delle richieste di modifica dei dati dal front-end e del salvataggio delle modifiche nel database.

sincronizzazione dei dati bidirezionale eseguita automaticamente

Una delle caratteristiche che distingue Meteor da altri framework è il suo meccanismo di sincronizzazione dei dati tra server e app front-end/mobile. In Meteor, il client contiene una copia shadow del mini-database che è una piccola parte della replica dal database del server, una parte che è stata precedentemente richiesta dal client ed è autorizzata dal server. Quando il client desidera apportare modifiche ai dati, utilizza l'API del database coerente come lato server per eseguire qualsiasi istruzione CRUD, quindi le modifiche ai dati verranno automaticamente inviate al server e salvate nel database effettivo. Ogni volta che il server rileva modifiche ai dati, invia i dati aggiornati a client specifici che si abbonano a tali dati. Questa sincronizzazione dei dati bidirezionale viene eseguita automaticamente senza alcun intervento manuale. Per creare questa magia, Meteor utilizza WebSocket per connettere client e server sotto il cofano in modo che qualsiasi modifica dei dati su un'estremità si rifletta istantaneamente su un'altra.

Strumento di automazione della creazione

Meteor non si occupa solo di applicazioni per server e app Web, utilizzando lo strumento di creazione di Meteor chiamato Isobuild con l'aiuto di Cordova, una libreria che raggruppa HTML/JavaScript/CSS con funzionalità mobili native, Meteor rende la creazione di app iOS e Android un gioco da ragazzi. Le app mobili generate sono app ibride che eseguono JavaScript o mostrano pagine HTML all'interno di una visualizzazione Web. Questa soluzione alternativa potrebbe compromettere l'esperienza dell'utente rispetto alle app mobili native, ma per molti essere in grado di gestirle tutte con la stessa base di codice con le app Web è un grande punto di forza e consente di risparmiare un sacco di costi di sviluppo.

Nel complesso, Meteor è un framework altamente automatizzato. Questa automazione di alto livello rende la vita degli sviluppatori molto più semplice, ma comporta un costo di prestazioni compromesse e restrizioni di scalabilità. Man mano che la base di utenti cresce, la tecnica di sincronizzazione automatizzata dei dati diventa il punto di arresto della scalabilità. Per ottenere la stessa capacità e prestazioni di altre tecnologie back-end ottimizzate manualmente, Meteor di solito consuma molto più hardware del server e risorse di larghezza di banda. Quindi Meteor potrebbe essere un ottimo punto di partenza e una cassetta degli attrezzi perfetta se si vuole prototipare un progetto per tutte le principali piattaforme, ma alla fine a un certo punto l'architettura del sistema deve essere riprogettata in modo più professionale se il prototipo diventa un progetto di produzione con abbastanza base di clienti.

Sails.js: Framework MVC superiore per Node.js

Sails.js condivide molte somiglianze con Express. È un generatore di progetti, un middleware e un motore di modelli. È infatti costruito su Express più alcune funzionalità di livello superiore per accelerare lo sviluppo.

MVC

Controller vista modello

Sails.js adotta il modello di progettazione Model-View-Controller dal suo nucleo. Per chi proviene da Ruby on Rails o Laravel, troverà la struttura per un'app Sails.js fin troppo familiare. Il modello rappresenta il modello di dati che riflette lo schema della tabella/raccolta del database, la vista è una vista HTML con i dati inseriti, il controller è il punto in cui si inserisce tutta la logica aziendale lato server e funge da collante tra i dati e la vista.

Comunicazione in tempo reale

Non come una richiesta HTTP in cui il client deve interrogare i dati del server ogni volta, o una lunga connessione di polling che mette il server in modalità inattiva, Socket.io stabilisce una comunicazione bidirezionale basata su eventi tra client e server. Sails.js integra Socket.io e lo racchiude con alcune API di livello di astrazione più elevato per fornire maggiore praticità, rendendo così Sails.js particolarmente adatto per la creazione di app di chat o giochi multiplayer.

Database ORM

Database ORM

Tra la logica di back-end e l'effettiva manipolazione del database, c'è un livello ORM intermedio chiamato Waterline. In poche parole, questo strumento ORM fornisce una sintassi coerente per accedere a database diversi senza che gli sviluppatori debbano preoccuparsi di vari linguaggi di query del database, come SQL vs NoSQL, schema vs schema-less e così via.

Sails.js ha un grado di automazione intermedio. Si concentra sulla logica lato server ed è pronto per la produzione e fornisce un ritmo di sviluppo più rapido rispetto a Express senza sacrificare prestazioni o scalabilità futura. In particolare per la grande quantità di devoti del pattern MVC, Sails.js ha una curva di apprendimento abbastanza regolare.

Incartare

Questo articolo non classifica diversi framework Node.js, piuttosto elenca i punti salienti di ciascun framework per distinguersi dalla massa in modo da aiutare gli sviluppatori Node.js a raccogliere la cassetta degli attrezzi più adatta durante la creazione di un progetto da zero.

Quindi qual è il tuo framework Node.js preferito per lo sviluppo web? Preferisci un framework diverso da quelli di cui abbiamo discusso sopra? Fatecelo sapere nella sezione commenti qui sotto.

Imparentato:
  • Perché diavolo dovrei usare Node.js? Un tutorial caso per caso
  • Codifica della febbre da cabina: un tutorial sul back-end di Node.js
  • Creazione di un'API REST Node.js/TypeScript, parte 1: Express.js