Node.js, la differenza tra sviluppo e produzione
Non c'è differenza tra sviluppo e produzione in Node.js, ovvero, non ci sono impostazioni specifiche che devi applicare per far funzionare Node.js in una configurazione di produzione. Tuttavia, alcune librerie nel registro npm riconoscono l'utilizzo della variabile NODE_ENV e la impostano di default su development. Esegui sempre il tuo Node.js con NODE_ENV=production impostato.
Un modo popolare per configurare la tua applicazione è utilizzare la metodologia dei dodici fattori.
NODE_ENV in Express
Nel popolarissimo framework express, impostare NODE_ENV su production generalmente garantisce che:
- la registrazione (logging) sia mantenuta al livello minimo ed essenziale
- vengano eseguiti più livelli di caching per ottimizzare le prestazioni
Questo di solito viene fatto eseguendo il comando
export NODE_ENV=productionnella shell, ma è meglio metterlo nel file di configurazione della shell (ad es. .bash_profile con la shell Bash) perché altrimenti l'impostazione non persiste in caso di riavvio del sistema.
Puoi anche applicare la variabile d'ambiente anteponendola al comando di inizializzazione dell'applicazione:
NODE_ENV=production node app.jsAd esempio, in un'app Express, puoi usarlo per impostare diversi gestori di errori per ambiente:
if (process.env.NODE_ENV === 'development') {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
app.use(express.errorHandler());
}Ad esempio Pug, la libreria di templating utilizzata da Express.js, compila in modalità debug se NODE_ENV non è impostato su production. Le viste Express vengono compilate in ogni richiesta in modalità di sviluppo, mentre in produzione vengono memorizzate nella cache. Ci sono molti altri esempi.
Questa variabile d'ambiente è una convenzione ampiamente utilizzata nelle librerie esterne, ma non all'interno di Node.js stesso.
Perché NODE_ENV è considerato un antipattern?
Un ambiente è una piattaforma digitale o un sistema in cui gli ingegneri possono costruire, testare, distribuire e gestire prodotti software. Convenzionalmente, ci sono quattro fasi o tipi di ambienti in cui viene eseguita la nostra applicazione:
- Sviluppo
- Staging
- Produzione
- Test
Il problema fondamentale di NODE_ENV deriva dal fatto che gli sviluppatori combinano ottimizzazioni e comportamento del software con l'ambiente in cui il loro software è in esecuzione. Il risultato è codice come il seguente:
if (process.env.NODE_ENV === 'development') {
// ...
}
if (process.env.NODE_ENV === 'staging') {
// ...
}
if (process.env.NODE_ENV === 'production') {
// ...
}
if (process.env.NODE_ENV === 'testing') {
// ...
}Sebbene possa sembrare innocuo, rende gli ambienti di produzione e staging diversi, rendendo quindi impossibile un test affidabile. Ad esempio, un test e quindi una funzionalità del tuo prodotto potrebbero passare quando NODE_ENV è impostato su development ma fallire quando si imposta NODE_ENV su production. Pertanto, impostare NODE_ENV su qualcosa di diverso da production è considerato un antipattern.