nave vs nvm for node version management
Tags: node, versions, nave, nvm
Published: 2019-08-09 16:46:08

---
title: nave vs nvm for node version management
published: true
description: In which I compare two node version managers
tags:
  - node
  - versions
  - nave
  - nvm
---

I recently discovered [`nave`](https://github.com/isaacs/nave). I found it on [`npm`'s installation page](https://www.npmjs.com/get-npm).

It's a node version manager, which means that it allows you to install and use multiple versions of node on your machine.

It's similar to [`nvm`](https://github.com/nvm-sh/nvm), which I've been using for quite a while, and I imagine many of you have as well.

The main difference is that `nvm` generally requires you to modify your current shell. You have to modify your `.bashrc` file to ensure that it loads properly. `nave` doesn't require you to add anything to your shell. You just download the script and put it anywhere in your current `$PATH` and it's ready to use.

To use it, you do `nave use <version>`, and it opens a new shell with the path for `<version>` added to `$PATH`. When you're done, you just `exit`, and you're back to your regular shell without that node version.

If you'd like, `nave` can work more like `nvm`, and you can add it to your `.bashrc` and it can be used to modify your current shell, but it's not required.

`nvm` also has issues when used when `$PREFIX` is set. However `nave` creates a subshell which adds the node version you need to your `$PATH`. I've been [unable to use `nvm`](https://github.com/nvm-sh/nvm/issues/1645) in [Termux](https://termux.com/) on my phone because of the issue with `$PREFIX`. Others have had issues using `nvm` on MacOS when also using [`brew`](https://brew.sh/) for the same reason.

I installed `nave` on my desktop, and manually set a `PREFIX` in my shell, and `nave` still worked with no problems.

I've still been unable to use `nave` on my phone, because, due to the fact that `Termux` is based on Busybox, the precompiled binaries can't be used in Termux, so node must be compiled. Unfortunately, [another dependency issue](https://github.com/termux/termux-packages/issues/1020) causes the compilation to fail, but I'm hopeful that issue can get resolved and I'll be able to use `nave` for `node` development on my phone.

Speaking of Busybox, `nvm` states that on Alpine Linux, which is based on Busybox, you have to specify `nvm install -s version` to tell it to compile from source, since, as I mentioned, the precompiled binaries won't work.

On my phone under Termux,`nave` automatically saw that it needed to download the source and compile, so I just did `nave install latest` and it fetched the source for the latest version and attempted to compile, while on my desktop, it fetched the binaries. So, `nave` seems a bit smarter than `nvm` in that regard.

However, with regards to Alpine, I did try to use `nave` under Alpine. I spun up an Alpine `docker` container. It took a while to install the necessary packages for it to work. I needed `bash`, `curl`, and `perl-utils`, and maybe a couple more. I also had to change my shell to `bash`. After that, I did `nave install latest`, thinking that it would download the source and compile, like it did under Termux. It didn't. It downloaded the binary. And after that, doing `nave use latest` opened a new shell, but `node --version` wouldn't work, because of the aforementioned reasons. `nave` doesn't provide a flag to force source install like `nvm`, so I had to run `env NAVE_SRC_ONLY=1 nave install latest`. I then had to install a few more packages so that compilation would work, like `g++`, `make`, `linux-headers`, and `python`(?). After (*finally*) compiling, it worked as expected.

However, it would be nice for it to detect that the precompiled binaries didn't actually work. This leads me to believe that it was something other than `nave` being smarter that it compiled on Android under Termux. It could just be that it just didn't realize that an `aarch64` architecture is the same as `arm64`.

In any case, on the desktop in a traditional Linux distro, I'm finding `nave` really nice so far, and I'll be using it for a little while to see if I like it better than nvm.

---

P.S. Since I have both `nvm` and `nave` installed now, to avoid clashes, I modified my `.bashrc` so that it doesn't use `nvm` if I'm in a `nave`-launched subshell.

Here's my code:

```bash
# No point using two different node installers
if [[ -z "$NAVE" ]]; then
    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
fi
```