Fil d'Ariane
Jongler entre plusieurs version de Node.js
Ce court article présente les utilitaires nvm et n qui permettent de simplifier la gestion des différentes versions de Node.js entre divers projets.
Depuis quelques année, les personnes chargées de l'intégration graphique de la grande majorité des projets web utilisent des outils basés sur Node.js, comme gulp
ou webpack
, pour construire les fichiers CSS et JS qui sont finalement servis aux navigateurs. Avec le temps et du fait que nous construisions des sites qui durent, les versions différentes s'accumulent d'un projet à l'autre et il devient parfois compliqué de jongler de l'une à l'autre lors de missions de maintenance corrective ou évolutive. En effet, Node.js étant un utilitaire installé sur le serveur, sa version est généralement fixée au moment de la création du site et peut être contrainte dans le cas où un même serveur hébergerait plusieurs projets.
Pour répondre à cette problématique, il y a plusieurs possibilités dont la favorite de l'industrie à ce jour est l'isolation de chaque service dans des conteneurs (Docker ou autre) pour que chaque projet puisse disposer de ses propres versions de chaque utilitaire de façon totalement indépendante. Cette solution impliquant de profondes transformations dans le cycle de vie complet des projets, elle n'est pas nécessairement adaptée à toutes les situations mais je n'entrerai pas dans le détail. Pour les personnes n'ayant pas la volonté ou la possibilité de travailler de façon isolée, deux utilitaires existent : nvm
et n
.
nvm versus n
Pour faire très bref, et parce que je ne suis pas du tout un expert de ces outils, j'ai testé les deux et il me semble que n
est plus simple à installer et utiliser que nvm
mais tous deux ont des fonctionnalités très proches. Côté code, je trouve ça rassurant que n
ait déjà plusieurs versions majeures à son actif alors que nvm
n'a pas encore publié sa 1.0.0. Les deux projets semblent cependant maintenus et nvm
a aujourd'hui plus de "stars" sur github que n
. Je vais brièvement présenter l'installation et l'utilisation des deux et je vous laisserai vous faire votre opinion par vous même !
Installation et utilisation de n
Si on suit la documentation et qu'on dispose déjà d'une version de Node.js installée sur la machine, l'installation de n
est un vrai jeu d'enfant :
$ npm install -g n
Ensuite, à moins de vouloir faire des manipulations compliquées avec les répertoires dans lesquels les diverses version de Node.js seront installées, je vous recommande le simple ajout de cette ligne dans votre fichier .bashrc
ou équivalent :
export N_PREFIX="$HOME/.config"
Cela indiquera à n
d'installer ses versions dans votre répertoire personnel ~/.config/n/versions/node
au lieu du répertoire global /usr/local/n/versions
qui nécessite des droits root par défaut.
Une fois n
installé, il va falloir spécifier quelle version de Node.js vous voulez utiliser pour votre projet. Il y a plusieurs façons de faire mais celle que je vous recommande c'est d'ajouter une entrée "engines
" à votre fichier package.json
comme ceci par exemple :
{
"name": "...",
"engines": {
"node": "^14"
},
[...]
}
Une fois ceci fait tout est prêt pour vous lancer ! Dans toutes les commandes de cet utilitaire où vous devez spécifier une version, il vous suffira d'indiquer "auto
". Voici donc comment nous pouvons faire évoluer notre script de construction des fichiers JS et CSS pour utiliser n
:
Avant
# Installation des dépendances
npm install
# Exécution du script de build
npm run build
Après
# Téléchargement de la version de node demandée si nécessaire
n auto
# Installation des dépendances
n exec auto npm install
# Exécution du script de build
n exec auto npm run build
Installation et utilisation de nvm
La documentation de nvm
ne propose pas à ce jour d'installation à partir d'une version de npm
existante, il faut donc passer par curl
ou wget
.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# ou
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
Comme pour n
, nvm
nécessite de modifier votre fichier .bashrc
ou équivalent pour éviter que nvm
tente de deviner où stocker ses fichiers.
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
Et voilà pour l'installation ! Maintenant il ne reste plus qu'à spécifier quelle version de Node.js vous voulez utiliser pour votre projet. Cette fois-ci la seule option disponible est de créer un fichier .nvmrc, à la racine de votre projet ou dans votre répertoire de travail (voir nvm --help
pour le format) :
$ echo "14" > .nvmrc
Vous voilà parés pour lancer vos commandes ! Contrairement à l'utilitaire n
, pas besoin ici de spécifier "auto". Voici donc le même script qu'au chapitre précédent réécrit avec nvm
:
# Téléchargement de la version de node demandée si nécessaire
nvm install
# Installation des dépendances
nvm exec npm install
# Exécution du script de build
nvm exec npm run build
Conclusion
Comme vous pouvez le constater, ces deux outils sont très proches du point de vue de l'installation et de l'utilisation. Ce qui fait le plus pencher la balance du côté de n
pour ma part, c'est le fait que l'on puisse l'installer depuis un Node.js existant. Cela nous permettrait notamment de gérer une montée de version de Node.js pour chaque projet sans avoir à inquiéter la personne en charge de gérer le serveur de production. En effet, à partir du moment où Node.js est installé, l'ajout de n
et d'autres versions, même postérieures, de Node.js se fait dans le répertoire personnel de l'utilisateur et n'a donc pas d'impact sur la version installée globalement.
Et vous, connaissez-vous et utilisez-vous ces outils ?
Votre commentaire
À propos de Edouard
Expert technique
Après un premier contact douloureux avec Drupal en 2009 en autodidacte, j'ai suivi une formation qui m'a convaincu de mon choix technologique et m'a vraiment mis en selle. Durant plusieurs années suite à cela j'ai accompagné des entreprises locales dans le développement de leurs projets de toutes sortes, de la simple vitrine à l'intranet social en passant par le projet e-commerce.