登录
nvm 官方教程:https://github.com/nvm-sh/nvm。
在日常的前端或node后台开发中,使用的部分node依赖,可能不支持当前使用的node版本,这时候如果还想使用这个依赖愉快的开发,那只能切换node版本了。
然而,卸载和安装node的麻烦程度虽然还能接受,但在其他项目,依然使用高版本node的语法支持。
这时候就需要 nvm 了,nvm就是node版本管理器,使用它可以同时安装多个版本的node,然后可以通过一行命令,轻松切换当前系统,或者当前终端使用的node版本。
下面基于mac系统,进行一些步骤的讲解。
nvm下面需要联网的指令,访问的node下载源默认是国外的,可能延迟比较大、甚至直接超时访问失败。
所以可以设置修改node源为国内的淘宝源,可以从此页面查看淘宝提供的node源:https://npmmirror.com/。
修改源可以在安装 nvm 后,修改配置文件,如果想单次使用,则在使用nvm的需要联网的指令时,在前面添加配置:
# 原指令
nvm ls-remote
#在前面添加配置
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ nvm ls-remote
主要为如下一些指令:
功能 | 指令 |
---|---|
列出当前已安装的node,和可安装的lts(长期支持稳定版)版本 | nvm ls |
列出所有远程服务器的版本 | nvm ls-remote |
列出所有远程服务器的版本中的长期支持版 (LTS版本) | nvm ls-remote --lts |
安装指定版本,可模糊安装,建议先查询后安装,比如 nvm install v16.19.1 | nvm install <版本号> |
安装最新稳定版 node | nvm install stable |
删除已安装的指定版本,语法与install类似 | nvm uninstall <版本号> |
设置一个默认版本,新打开的终端使用的版本 | nvm alias default <版本号> |
给不同的版本号添加别名 | nvm alias <别名> <版本号> |
取消一个别名 | nvm unalias <别名> |
切换当前终端使用的版本,但只针对当前终端生效,不影响其他 | nvm use <版本号 或 别名> |
显示当前的版本 | nvm current |
删除已定义的别名 | nvm unalias <别名> |
在当前版本 node 环境下,重新全局安装指定版本号的 npm 包 | nvm reinstall-packages <版本号> |
既然使用nvm‘托管’,那么自己之前安装的全局node包,就需要先卸载了,防止出问题。
npm、cnpm、yarn等都会被一并删掉,稍后需要重新安。
下面的指令,可以查看已经安装在全局的模块node功能模块,以便删除这些全局模块后再按照不同的 node 版本重新进行全局安装。
但注意如果查询出来的某部分目录是在 **.nvm **的子级里面,说明这部分已经是 nvm 安装的node的了,就不用卸载这部分了。
npm ls -g --depth=0
下面,是卸载步骤
也可以用
type -a node
查看一下路径,不同机器和不通安装方式,位置可能不一样。
删除全局 node_modules 目录,里面其实只有几个文件夹,是npm和使用npm全局安装的比如yarn、cnpm等:
sudo rm -rf /usr/local/lib/node_modules
删除 node,其实就是卸载node环境了:
sudo rm /usr/local/bin/node
删除全局 node 模块注册的软链,懂linux指令语法的,大概可以看懂,下面这行的命令,就是先进入到系统的全局指令文件,筛选出其中依赖于 node_modules的所有指令(其实还是步骤1中的那几个指令),然后删除:
cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm
可以使用终端输node -v
,如果提示node: command not found
,就说明卸载完成了
安装nvm有多种方式,下面是两种方式,建议在官网查看最新的安装语句(由于外网问题,很可能会安装失败,后面有其他安装方式):
curl方式:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
wget方式:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
上面两个语句,都会都会执行nvm的安装脚本,安装完成后,会有类似下面的打印:
=> Profile not found. Tried (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.
=> Create one of them and run this script again
=> Create it (touch ) and run this script again
OR
=> Append the following lines to the correct file yourself:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
=> Close and reopen your terminal to start using nvm or run the following to use it now:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
意思是,我们需要在~/.bashrc
、~/.bash_profile
、~/.zshrc
、~/.profile
这四个文件的任意一个,加入nvm的这行指令,保存关闭,然后重启终端,就可以使用nvm指令了。
实际如果安装正常,nvm会自行在 ~/.zshrc
中插入。
v0.39.7
版本的指令如下,可以直接在官网安装最新版本的nvm,粘贴最新版的指令(下面是官网提供的指令,也可以使用安装完成后,上面打印出来的指令):
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
当添加完成后,比如是把指令写在了~/.zshrc
文件中,那保存后记得要手动执行一下执行:
source ~/.zshrc
重载此文件后,nvm就可以正常使用了。
nvm的node源使用的是国外地址,导致一些nvm指令会网速慢、超时等。
如果想解决,就需要换用国内的源,可以使用淘宝提供的node源:https://npmmirror.com/mirrors/node/
。
有了国内源地址,后面就是使用了,一个简单的临时使用方式,是使用 nvm 指令时,在指令前配置本次指令使用的源,比如:
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ nvm ls-remote
一劳永逸的方法就是,直接在上面提到的文件中(建议就在粘贴了nvm版本指令的文件中),添加以下指令:
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
最后再:
source ~/.zshrc
重载此文件,使配置生效。
上面的语句有可能会由于网络问题,而安装失败。
此时可以进入 nvm 官方教程(实际就是一个 github 页面),这里会提供多种安装方式(但最终貌似都需要克隆 nvm 的仓库,我们可以手动克隆仓库了)。
但是, github 同样有无法打开的可能,那我们也打开国产 「githup」- 码云搜索 nvm-sh,找到热血网友从 github 克隆至此的项目,一样的使用。
下面大致讲解其中比较简单的一种:
Git Install:
进入到 ~ 目录,使用 git 克隆 nvm 仓库:
cd ~/
git clone https://github.com/nvm-sh/nvm.git .nvm
进入,切换到最新版本分支(实际最新分支,可再去官网看一下):
cd .nvm
git checkout v0.39.7
执行一下安装指令,这个指令瞬间执行完成:
. ./nvm.sh
最后,再一下几个文件中的任意一个,~/.bashrc
、 ~/.profile
,或 ~/.zshrc
,粘贴入一下代码:
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
最后的最后,让系统重新读取一下这个文件,比如这个放进了 ~/.zshrc
文件中,那么执行:
source ~/.zshrc
完成,此时可以使用 nvm 了。
这个功能本来不需要,但近几年发现,业务和项目太多时,可能真的就很需要了。
比如,接收过来项目,使用的 node 版本可能五花八门;自己公司开发的项目,使用固定某个 node 版本;偶尔自己研究些新技术,又可能会使用最新版的。
本来是进入某个项目,就使用 nvm use 来切换一下,但总的来说很麻烦,每次打开终端都要来这么一下。
所以还是犯懒,在网上找了找解决办法。
后面两个解决办法,都有一个前提条件,需要在启动终端的文件夹下,或者父级文件夹,或者父父级文件夹...添加一个文件。
文件名:.nvmrc。
文件内容:你已安装、能够使用 nvm use 指令切换过去的node版本号,可以是版本全路径,也可以是省略小版本,比如:
v16.19.0
或者
v16
或者使用当前已安装的最新版本
lts/*
放置好文件,后面两项的功能才能生效。
切换node的本质,就是在打开终端时,使用 nvm use [版本号] 切换一下。
如果对 mac 或者 linux 系统稍微有些了解的程序员,都知道 ~/.zshrc 或 ~/.bashrc 这么个文件(如果使用的shell是 zsh,那是 ~/.zshrc 文件,如果是 bash,那就是 ~/.bashrc 文件)。
这个文件会在用户每次打开一个新终端时,都自动执行一下。
所以我们把下面这段 shell 脚本代码,粘贴到 ~/.zshrc 或 ~/.bashrc 文件中,保存。
# 启动shell时,从当前目录向顶层目录逐层寻找 .nvmrc 文件,如果找到,就自动切换 node 版本至文件中标注的版本
local nvmrc_path="$(nvm_find_nvmrc)";
if [ -n "$nvmrc_path" ]
then
local first_line=$(head -n 1 $nvmrc_path);
echo "\033[44;33m 找到版本文件,即将切换node版本至:$first_line \033[0m";
nvm use $first_line;
fi
如果已经按照上面的前置条件创建好了 .nvmrc 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:
找到版本文件,即将切换node版本至:v16.19.0
Now using node v16.19.0 (npm v9.4.1)
此时这个终端使用的 node,就是 v16.19.0 了。
网上找了找,找到了这个工具: avn 。
这个工具已不再更新了,所以安装时有点限制,不过使用没有限制。
在安装时,node版本最高只能是 node10(node@v10.24.1) ,否则会报错安装失败,不过安装完启动后,就可以随意切换 node 版本了,也就只是在安装时需要在指定 node 版本下安装。
首先新打开一个终端,保证现在使用的 node 版本是10或者10以下,否则会安装失败。
打开终端后,先全局安装:
npm install -g avn avn-nvm avn-n
然后启动这个工具:
avn setup
如果已经按照上面的前置条件创建好了 .nvmrc 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:
avn activated v14.16.0 via ../.node-version (avn-nvm v14.16.0)
此时这个终端使用的 node,就是 v14.16.0 了。
最近遇到糟心事儿,家里的nvm安装node一直失败,看报错是网络问题。
当我执行以下指令:
nvm install v16.14.2
# 发现会先下载,下载速度奇慢
# https://nodejs.org/dist/v16.14.2/node-v16.14.2.tar.xz
# 下载出错后,会自动去下载,仍是下载速度奇慢
# https://nodejs.org/dist/v16.14.2/node-v16.14.2-darwin-x64.tar.xz
于是我把两个链接都复制到浏览器,结果很快下载完成了上面两个文件。
接着把两个文件夹都解压,得到两个文件夹,里面应该都是nodev16.14.2的包内容,但里面的内容又不一样。
于是把使用终端执行以下指令:
type -p node
# 得到以下输出,下面这个地址,是我当前的node的所在文件夹
# 可以发现,实际就是在 ~/.nvm/versions/node/ 文件夹中
# 这个文件夹就是 nvm 放置所有 node 版本的文件夹了
# /Users/majun/.nvm/versions/node/v16.14.2/bin/node
对比后,发现下载并解压后的两个node中,第二个链接解压出来的 node-v16.14.2-darwin-x64
文件夹中的内容,是和现有的node中的东西是一样的。
于是,我就把文件夹 node-v16.14.2-darwin-x64
按照这文件夹的命名规则,更名为 v16.14.2
后,放入这个文件夹中,最后在终端输入:
nvm ls
发现刚进去的v16.14.2
出现在「已安装」的node版本列表中。
最终解决方案
所以我们可以自己下载需要的node版本,解压、更名后,放入nvm对应的文件夹中(默认为 ~/.nvm/versions/node/
)即可,下载链接如下:
https://nodejs.org/dist/[版本]/node-[版本]-darwin-x64.tar.xz
# eg:
https://nodejs.org/dist/v16.14.2/node-v16.14.2-darwin-x64.tar.xz