Skip to content

Node.js, la différence entre développement et production

Il n'y a pas de différence entre le développement et la production dans Node.js, c'est-à-dire qu'il n'y a pas de paramètres spécifiques à appliquer pour que Node.js fonctionne dans une configuration de production. Cependant, quelques bibliothèques du registre npm reconnaissent l'utilisation de la variable NODE_ENV et la définissent par défaut sur un paramètre development. Exécutez toujours votre Node.js avec NODE_ENV=production défini.

Une façon populaire de configurer votre application est d'utiliser la méthodologie douze facteurs.

NODE_ENV dans Express

Dans le framework très populaire express, définir NODE_ENV sur production garantit généralement que :

  • la journalisation est réduite au minimum, niveau essentiel
  • davantage de niveaux de mise en cache ont lieu pour optimiser les performances

Cela se fait généralement en exécutant la commande

bash
export NODE_ENV=production

dans le shell, mais il est préférable de la placer dans votre fichier de configuration du shell (par exemple .bash_profile avec le shell Bash) car sinon le paramètre ne persiste pas en cas de redémarrage du système.

Vous pouvez également appliquer la variable d'environnement en la préfixant à votre commande d'initialisation de l'application :

bash
NODE_ENV=production node app.js

Par exemple, dans une application Express, vous pouvez utiliser ceci pour définir des gestionnaires d'erreurs différents par environnement :

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());
}

Par exemple [Pug](https://pugjs.org], la bibliothèque de modèles utilisée par [Express.js](https://expressjs.com], compile en mode débogage si NODE_ENV n'est pas défini sur production. Les vues Express sont compilées à chaque requête en mode développement, tandis qu'en production elles sont mises en cache. Il existe de nombreux autres exemples.

Cette variable d'environnement est une convention largement utilisée dans les bibliothèques externes, mais pas dans Node.js lui-même.

Pourquoi NODE_ENV est-il considéré comme un anti-pattern ?

Un environnement est une plateforme numérique ou un système où les ingénieurs peuvent construire, tester, déployer et gérer des produits logiciels. Conventionnellement, il existe quatre étapes ou types d'environnements où notre application est exécutée :

  • Développement
  • Mise en scène
  • Production
  • Tests

Le problème fondamental de NODE_ENV provient du fait que les développeurs combinent les optimisations et le comportement du logiciel avec l'environnement sur lequel leur logiciel s'exécute. Le résultat est un code comme celui-ci :

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') {
  // ...
}

Bien que cela puisse sembler inoffensif, cela rend les environnements de production et de mise en scène différents, rendant ainsi les tests fiables impossibles. Par exemple, un test et donc une fonctionnalité de votre produit pourraient réussir lorsque NODE_ENV est défini sur development mais échouer lors de la définition de NODE_ENV sur production. Par conséquent, définir NODE_ENV sur autre chose que production est considéré comme un anti-pattern.