Automate Your Node.js Version Switching
Tags: node, javascript, webdev, programming
Published: 2024-03-13 12:45:50

Imagine you're working on a project using Node.js. But suddenly, your project doesn't work. After some time spent figuring out the problem, you discover you were using the wrong version of Node.js for your project. You switch to the correct version, and everything starts working again.

Now, think about someone who works on many different projects, each needing a different version of Node.js. Every time they move to a different project, they have to remember to switch to the right version. This can be really annoying and slow them down.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xtqi6owsm76vwtg44m5a.png)

This article is like a magic trick for fixing that problem. It shows how to set up your terminal to automatically change to the right version of Node.js for whatever project you're working on. If you use Bash or Zsh, you can make it so that every time you open a project, your terminal checks to see which version of Node.js that project needs. If you don't have it yet, your computer will even download it for you. This means you can jump from one project to another without having to stop and think about which version of Node.js you need. It's all taken care of for you, making everything much smoother and letting you focus on the fun part: creating stuff.


If the node version you need isn't found and has to be installed, here's what it will look like: 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2rp7fa25zk7wbd4b4s6.png)


To get started, the first step is installing `nvm`. It's a simple command:

```bash
npm i -g nvm
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o33nk00c5txaxstgvaph.png)


With nvm installed, I will guides you through the process of adding specific scripts to your `.bashrc` or `.zshrc` file. These scripts enable your shell to automatically find the `.nvmrc` file in your project directory and switch to or install the Node.js version it specifies. This automation simplifies the workflow for developers, making it easier to manage multiple projects with different Node.js version requirements.

Note: This trick works on my Ubuntu setup. Not sure how to make it happen on Windows, though!


## BASH 

Pop open your .bashrc file with `vi ~/.bashrc`, and then add this script to the end of your file... wait, how do you escape this text-editing black hole? Ah, just type `:wq` to wave goodbye. But hey, if you're not into memorizing escape spells, maybe give `nano` a try for editing files `sudo apt-get install nano` then `nano ~/.bashrc`. It's like the friendly neighbor of text editors —always there to lend a hand without the cryptic commands.

```bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion


nvm_auto_use() {
  local node_version="$(nvm version)"
  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" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
export -f nvm_auto_use
PROMPT_COMMAND="nvm_auto_use; $PROMPT_COMMAND"
```
Then run `source ~/.bashrc`. Done.

## ZSH
For those rocking the Zsh terminal, setting things up is a similar, just swapping out for another script. And you probably don't need the whole "how to escape from vim" saga. To get started, just add this to the end of your `~/.zshrc` file:

```sh
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  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" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

```

Then run `source ~/.zshrc`. Done.



Thanks for sticking around till the end! I hope you found this guide useful.