Dans cet article, nous allons voir comment gérer des variables d’environnement dans un projet Node.js.

Admettons que vous souhaitez démarrer votre projet avec deux modes :

  • Mode développement
  • Mode production

Ces deux modes ne vont pas avoir les mêmes paramètres. Ils utiliseront les mêmes variables d’environnement, mais avec des valeurs différentes.

Par exemple, le mode de développement pourrait utiliser une variable d’environnement API_URL avec comme valeur 127.0.0.1, tandis qu’avec le mode de production cette même variable d’environnement API_URL serait égale à une autre valeur (par exemple, 8.8.8.8).

Alors, comment initialiser une nouvelle variable d’environnement et lui attribuer une valeur en fonction de notre mode ?

Nous allons voir tout ça. 😎

Initialiser un projet

Commencez par créer un nouveau projet :

npm init -y

Puis créez un nouveau fichier index.js :

touch index.js

Dans ce fichier, insérez un simple console.log :

console.log("Hello World!");

Modifiez le fichier package.json afin de lancer le projet avec un raccourci :

"scripts": {
  "start": "node index.js"
},

Vous pouvez maintenant exécuter votre projet, avec la commande suivante :

npm run start

Vous devriez avoir « Hello World! » dans votre console. Parfait ! 🎉

Les variables d’environnement

Avec Node.js vous pouvez accéder et utiliser la propriété process.env qui contient les variables d’environnement de l’utilisateur.

Dans le fichier index.js, ajoutez la ligne suivante et relancez le serveur :

console.log(process.env);

Vous avez tout de suite plus de choses dans votre console ! 😊

Gérer les variables d’environnement

Pour gérer les variables d’environnement, vous avez plusieurs packages qui permettent de les manipuler, comme dotenv. Ici nous allons utiliser le package env-cmd. 😉

env-cmd

Commencez par installer env-cmd et ajoutez le package dans les devDependencies :

npm install env-cmd --save-dev

Ce qui est intéressant avec env-cmd, c’est qu’au lancement de votre projet, vous allez pouvoir lui fournir un fichier à utiliser avec vos variables d’environnement déclarées à l’intérieur. 👌

Commencez par créer à la racine de votre projet un dossier env. Puis à l’intérieur, créez trois fichiers :

  • .env
  • .env.dev
  • .env.prod

Le .env servira de template, de référence. Les autres développeurs pourront voir par la suite les variables d’environnement déclarées dans votre projet.

Sur un « vrai » projet et non un boilerplate c’est UNIQUEMENT ce fichier qui doit être commité. Les autres fichiers .env.dev et .env.prod ne doivent jamais être commité ! Question de sécurité.

Créez les fichiers :

mkdir env
cd env
touch .env
touch .env.dev
touch .env.prod

Vous pouvez maintenant définir les variables d’environnement dans ces fichiers.

.env :

NODE_ENV=template
APP_NAME=My App
API_URL=127.0.0.1

.env.dev :

NODE_ENV=development
APP_NAME=My App
API_URL=127.0.0.1

.env.prod :

NODE_ENV=production
APP_NAME=My App
API_URL=8.8.8.8

Il ne vous reste plus qu’à charger ces fichiers au démarrage de votre application.

Pour cela, modifiez la section start du package.json :

"scripts": {
  "dev": "env-cmd -f ./env/.env.dev node index.js",
  "prod": "env-cmd -f ./env/.env.prod node index.js"
},

Pour démarrer votre projet, vous utiliserez maintenant les commandes suivantes :

  • pour le mode développement : npm run dev
  • pour le mode production : npm run prod

Faites le test : mettez à jour votre fichier index.js avec ces lignes :

console.log(`${process.env.APP_NAME}`)
console.log(`Ready on ${process.env.NODE_ENV} mode`)
console.log(`API : ${process.env.API_URL}`)

Puis lancez votre projet en mode développement npm run dev. Vous devriez avoir ça :

En mode production npm run prod :

Parfait ! Vous pouvez maintenant gérer vos variables d’environnement avec un fichier.

Attention : je le répète, ne jamais ajouter vos fichiers de variables d’environnement dans un commit !

Le mieux reste de déclarer ces variables d’environnement directement sur le serveur et non dans des fichiers. Question de sécurité, toujours ! 😉

Retrouvez le boilerplate sur Github :