Gestionar versiones de Node.js con NVM

Al trabajar en varios proyectos al mismo tiempo, es muy común que necesitemos distintas versiones del mismo lenguaje de programación, ya sea Python, Node.js o PHP, entre otros.

A veces necesitamos saber cómo instalar la versión 18 de Node.js, o cómo instalar la versión 16 de Node.js. Y lo que está claro es que no podemos usar la misma versión de Node.js para todos los proyectos porque lo más seguro es que rompamos algo. Para solucionar esto, vamos a ver una solución muy útil y sencilla con NVM para trabajar con diferentes versiones de Node.js dependiendo del proyecto en el que estemos.

Cómo instalar múltiples versiones de Node.js

NVM (Node Version Manager) nos permite instalar y utilizar diferentes versiones de Node.js a través de la línea de comandos.

Es posible cambiar la versión de Node.js ejecutando un simple comando de NVM
$ nvm use 16
Now using node v16.9.1 (npm v7.21.1)
$ node -v
v16.9.1
$ nvm use 14
Now using node v14.18.0 (npm v6.14.15)
$ node -v
v14.18.0
$ nvm install 12
Now using node v12.22.6 (npm v6.14.5)
$ node -v
v12.22.6

Cómo instalar NVM

👉 Este repositorio de NVM sólo funciona en Linux o Mac. Para Windows hay una alternativa más abajo.
GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions - GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active nod…

Lo más sencillo es ir al repositorio de NVM y ejecutes el comando curl o wget que se indica para la instalación:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

Cómo instalar NVM en Windows

En Windows hay un repositorio alternativo que podemos usar, aunque en mi caso particular, siempre utilizo el subsistema de Linux en Windows, así que el repositorio oficial de NVM serviría.

GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go.
A node.js version management utility for Windows. Ironically written in Go. - GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go.

Cómo usar NVM

Utilizar NVM es realmente sencillo y se puede usar para instalar la última versión de Node o versiones específicas.

Instalar la última versión de Node.js

Si solo espedificamos la palabra node, instalará la última versión.

nvm install node

Instalar una versión específica de Node.js

Podemos especificar el número de versión a instalar. Es importante recordar que la versión por defecto en nuestro ordenador va a ser la primera que hayamos instalado, pero no hay problema porque podemos cambiar la versión de Node.js.

nvm install 19.7.0
nvm install 19 # Para instalar la última de la 19

Listar las versiones de Node.js instaladas

nvm ls-remote

Utilizar una versión específica de Node.js

Con nvm use podemos especificar el número de versión que necesitemos usar.

nvm use 19.7.0

Desinstalar una versión de Node.js

Con el comando nvm uninstall desinstalaremos una versión específica.

nvm uninstall 19.7.0

Usar NVM en múltiples proyectos

Aquí es donde viene la magia. ✨✨✨

Está muy bien poder cambiar la versión de Node.js en función del proyecto, pero sería más sencillo hacerlo de manera automática y que no tengamos que saber qué versión de Node.js está utilizando cada proyecto.

Para hacer esto, podemos empezar por crear un archivo llamado .nvmrc en la raíz de nuestro proyecto que simplemente contendrá la versión de Node.js que utiliza este proyecto. Este sería el contenido de .nvmrc:

19.7.0

Cuando entremos al proyecto, simplemente habría que ejecutar un comando para que lea este archivo y utilice esa versión específica de Node.js:

nvm use # Sin especificar la versión utilizará el .nvmrc

Cómo cambiar la versión de Node.js automáticamente

Por ahora estamos simplificando mucho el proceso. Con un simple archivo y un comando somos capaces de cambiar la versión de Node.js, pero se puede hacer más sencillo todavía.

Añadiendo un poco de código en nuestro fichero .bashrc o .zshrc, nuestra consola va a detectar automáticamente si existe un archivo .nvmrc y cambiará la versión de Node.js automáticamente al entrar a la raíz del proyecto.

Cómo instalar Oh My ZSH en Ubuntu
Tutorial para instalar y configurar Oh My ZSH en Ubuntu Linux, una terminal de uso interactivo para mejorar la productividad en la línea de comandos.

En el caso de zsh, para ejecutar nvm use en un directorio con un archivo nvmrc tendremos que añadir lo siguiente a nuestro archivo $HOME/.zshrc:

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
      nvm use
    fi
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

En el caso de bash, puedes ver el snippet aquí.

Y con esto, ¡ya no tendremos que acordarnos de cambiar la versión de Node.js manualmente en ningún proyecto! 🥳🥳🥳