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, 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 in Termux on my phone because of the issue with
$PREFIX. Others have had issues using
nvm on MacOS when also using
brew for the same reason.
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 causes the compilation to fail, but I'm hopeful that issue can get resolved and I'll be able to use
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
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
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
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
nave installed now, to avoid clashes, I modified my
.bashrc so that it doesn't use
nvm if I'm in a
Here's my code:
# 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