Si comme moi tu bascules régulièrement entre différents projets utilisant des versions différentes de nodeJS et de NPM, cet article va te faire gagner un temps précieux !
Au secours, j'ai besoin d'utiliser deux versions de nodeJS en même temps !
On connait tous ce problème : Sur différents projets nous avons besoin d'une version spécifique de nodejs et de npm qui n'est jamais la même.
Et souvent on s'en rend compte de manière assez peu très explicite quand notre script WebPack plante sournoisement avec un message d'erreur pour le moins incompréhensible :

Le message d'erreur nous en remet même une couche en nous précisant : This is probably not a problem with npm
. Autrement dit "Ca ne marche pas et ça n'est pas ma faute, petit !".
La solution naïve voudrait que l'on ne mette à jour son environnement de travail régulièrement et que l'on ait toujours des versions à jour de nos outils. Cependant, de nombreuses raisons peuvent expliquer que l'on continue à utiliser des anciennes versions de nodeJS, notamment dans le cas d'un projet un peu ancien et/ou sur lequel on collabore avec d'autres équipes.
Choisir sa version de Node : NVM à la rescousse
NVM est un outil en ligne de commande qui va te permettre de switcher d'une version de nodeJS à l'autre facilement.
Installation de NVM
Pour l'installer, il te suffit d'exécuter cette commande :
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
Une fois effectuée, je te conseille de relancer ton terminal, et de tester que tout est bien configuré en tapant nvm -v
. Si tu obtiens autre chose qu'une erreur, c'est que l'installation s'est bien passée.
Bravo, tu peux désormais utiliser NVM pour changer de version de node en tapant simplement nvm use <version>
. Par exemple nvm use 14
ou nvm use 14.7
.
Tu constateras alors (en tapant npm -v
) que ta version de nodeJS a changé. Tu vas de nouveau pouvoir avancer sur ton projet legacy !
Alors attention, la version de nodeJS a changé uniquement pour la session du terminal courante, et c'est là toute la subtilité ! C'est grâce à ça que tu vas pouvoir utiliser deux versions de nodeJS dans deux onglets de ton Terminal. Il va donc falloir que tu réutilises nvm use
à chaque fois que tu relances une instance de ton terminal.
Installer les versions de NodeJS dont tu as besoin
Parfois, la version de nvm n'est pas encore présente sur ton système et tu obtiendras une erreur de ce genre : N/A: version "17 -> N/A" is not yet installed. You need to run "nvm install 17" to install it before using it.
,.
Si tel est le cas il te suffit d'installer la version manquante en tapant nvm install <version>
.
Revenir à la version de nodeJS du système
Si pour une raison ou une autre tu souhaites revenir à la version par défaut de nodeJS, il te suffit de taper nvm use default
ou nvm use system
selon ton système d'exploitation.
Garder en mémoire ma version de nodeJS pour chaque projet
Il n'est pas forcément aisé ni souhaitable de retenir de tête quelle version de nodeJS utiliser pour chaque projet.
L'astuce ici est de rajouter un petit fichier nommé .nvmrc
dans le répertoire de ton projet et qui va contenir le numéro de version de nodeJS que NVM devra utiliser.
v14.19.2
Pour trouver la version exacte de nodeJS actuellement utilisée, il te suffit de taper nvm current
.
Grâce à ce fichier, NVM saura désormais quelle version de nodeJS utiliser, et il nous suffira alors de taper simplement nvm use
dans notre répertoire, sans avoir à spécifier de version.
Créer le fichier .nvmrc
Pour se faciliter la création du fichier, on peut scripter la création de notre fichier .nvmrc
au moyen d'une fonction que nous appellerons nvmdump
:
nvmdump() {
echo $(nvm current) > .nvmrc
}
Nous pouvons désormais créer notre fichier .nvmrc
très rapidement et sans risque d'erreur en tapant la commande nvmdump
dans notre terminal.
Switcher automatiquement de version de node
Nous avons vu comment spécifier au niveau d'un répertoire la version de nodeJS par NVM au moyen d'un fichier .nvmrc
. Seulement nous aimerions maintenant switcher automatiquement sur la version adéquate, sans avoir à faire de nvm use
à chaque changement de dossier.
Cette problématique a été soulevée dans ce topic StackOverflow. La solution la plus élégante apportée suggère l'utilisation de ce script pour ZSH, à placer directement dans votre fichier .zshrc
.
En naviguant dans un dossier au moyen de la commande cd
il checkera systématiquement la présence d'un fichier .nvmrc
et exécutera un nvm use
si besoin.
Pour les utilisateurs de BASH, il suffit certainement d'adapter un petit peu le script. Je ne peux toutefois que t'inciter fortement à remplacer BASH par ZSH.
Résoudre l'erreur "Default -> N/A" is not yet installed
Lors de la première exécution de ce script sur macOS Monterey, j'ai obtenu un message bizarre :
N/A: version "default -> N/A" is not yet installed.
You need to run "nvm install default" to install it before using it.
Pour solutionner ce problème j'ai simplement exécuté cette commande afin de créer un alias pour l'environnement default
:
nvm alias default system
Conclusion
Il n'est donc pas très compliqué de changer de version de nodeJS comme on change de chemise, il suffit juste de disposer du bon outil et NVM fait le boulot à merveille.
J'espère que cette astuce te sera utile et te fera gagner un temps précieux. N'hésites pas à partager cet article à tous ceux à qui il pourrait être utile, cela me fera grand plaisir et m'incitera à proposer à l'avenir davantage d'astuces similaires !