Skip to content

Node.js: Differenze tra sviluppo e produzione

Non esiste alcuna differenza tra sviluppo e produzione in Node.js, ovvero non è necessario applicare impostazioni specifiche 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. Eseguire sempre Node.js con NODE_ENV=production impostato.

Un modo popolare per configurare la tua applicazione è usare la metodologia twelve-factor.

NODE_ENV in Express

Nel famoso framework express, impostare NODE_ENV su produzione generalmente garantisce che:

  • la registrazione sia ridotta al minimo, livello essenziale
  • vengano implementati più livelli di caching per ottimizzare le prestazioni

Questo si fa solitamente eseguendo il comando

bash
export NODE_ENV=production

nella shell, ma è meglio inserirlo nel file di configurazione della shell (es. .bash_profile con la shell Bash) perché altrimenti l'impostazione non persiste in caso di riavvio del sistema.

È anche possibile applicare la variabile di ambiente anteponendola al comando di inizializzazione dell'applicazione:

bash
NODE_ENV=production node app.js

Ad esempio, in un'app Express, puoi usare questo per impostare diversi gestori di errori per ambiente:

javascript
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 di Express vengono compilate ad ogni richiesta in modalità sviluppo, mentre in produzione vengono memorizzate nella cache. Ci sono molti altri esempi.

Questa variabile di 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 dagli sviluppatori che combinano ottimizzazioni e comportamento del software con l'ambiente in cui viene eseguito il loro software. Il risultato è codice come il seguente:

javascript
if (process.env.NODE_ENV === 'development') {
  // ...
}
if (process.env.NODE_ENV === 'staging') {
  // ...
}
if (process.env.NODE_ENV === 'production') {
  // ...
}
if (process.env.NODE_ENV === 'testing') {
  // ...
}

Anche se questo potrebbe sembrare innocuo, rende diversi gli ambienti di produzione e staging, rendendo impossibile un test affidabile. Ad esempio, un test e quindi una funzionalità del tuo prodotto potrebbero riuscire quando NODE_ENV è impostato su development ma fallire quando si imposta NODE_ENV su production. Pertanto, impostare NODE_ENV su qualsiasi valore diverso da production è considerato un antipattern.