编程崽

登录

一叶在编程苦海沉沦的扁舟之上,我是那只激情自射的崽

nvm版本管理+自动切换node版本

nvm版本管理+自动切换node版本

nvm 官方教程:https://github.com/nvm-sh/nvm

在日常的前端或node后台开发中,使用的部分node依赖,可能不支持当前使用的node版本,这时候如果还想使用这个依赖愉快的开发,那只能切换node版本了。

然而,卸载和安装node的麻烦程度虽然还能接受,但在其他项目,依然使用高版本node的语法支持。

这时候就需要 nvm 了,nvm就是node版本管理器,使用它可以同时安装多个版本的node,然后可以通过一行命令,轻松切换当前系统,或者当前终端使用的node版本。

下面基于mac系统,进行一些步骤的讲解。

nvm使用

nvm下面需要联网的指令,访问的node下载源默认是国外的,可能延迟比较大、甚至直接超时访问失败。

所以可以设置修改node源为国内的淘宝源,可以从此页面查看淘宝提供的node源:https://npmmirror.com/

修改源可以在安装 nvm 后,修改配置文件,如果想单次使用,则在使用nvm的需要联网的指令时,在前面添加配置:

sh 复制代码
# 原指令
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包,就需要先卸载了,防止出问题。

卸载全局安装的node包

npm、cnpm、yarn等都会被一并删掉,稍后需要重新安。

下面的指令,可以查看已经安装在全局的模块node功能模块,以便删除这些全局模块后再按照不同的 node 版本重新进行全局安装。

但注意如果查询出来的某部分目录是在 **.nvm **的子级里面,说明这部分已经是 nvm 安装的node的了,就不用卸载这部分了。

sh 复制代码
npm ls -g --depth=0

下面,是卸载步骤

也可以用 type -a node 查看一下路径,不同机器和不通安装方式,位置可能不一样。

  1. 删除全局 node_modules 目录,里面其实只有几个文件夹,是npm和使用npm全局安装的比如yarn、cnpm等:

    sh 复制代码
    sudo rm -rf /usr/local/lib/node_modules
    
  2. 删除 node,其实就是卸载node环境了:

    sh 复制代码
    sudo rm /usr/local/bin/node
    
  3. 删除全局 node 模块注册的软链,懂linux指令语法的,大概可以看懂,下面这行的命令,就是先进入到系统的全局指令文件,筛选出其中依赖于 node_modules的所有指令(其实还是步骤1中的那几个指令),然后删除:

    sh 复制代码
    cd  /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm
    
    

可以使用终端输node -v,如果提示node: command not found,就说明卸载完成了

安装 nvm

安装nvm有多种方式,下面是两种方式,建议在官网查看最新的安装语句(由于外网问题,很可能会安装失败,后面有其他安装方式):

curl方式:

sh 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

wget方式:

sh 复制代码
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

上面两个语句,都会都会执行nvm的安装脚本,安装完成后,会有类似下面的打印:

sh 复制代码
=> 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,粘贴最新版的指令(下面是官网提供的指令,也可以使用安装完成后,上面打印出来的指令):

sh 复制代码
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文件中,那保存后记得要手动执行一下执行:

sh 复制代码
source ~/.zshrc

重载此文件后,nvm就可以正常使用了。

更换node的下载源

nvm的node源使用的是国外地址,导致一些nvm指令会网速慢、超时等。

如果想解决,就需要换用国内的源,可以使用淘宝提供的node源:https://npmmirror.com/mirrors/node/

有了国内源地址,后面就是使用了,一个简单的临时使用方式,是使用 nvm 指令时,在指令前配置本次指令使用的源,比如:

sh 复制代码
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ nvm ls-remote

一劳永逸的方法就是,直接在上面提到的文件中(建议就在粘贴了nvm版本指令的文件中),添加以下指令:

sh 复制代码
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/

最后再:

sh 复制代码
source ~/.zshrc

重载此文件,使配置生效。

安装失败

上面的语句有可能会由于网络问题,而安装失败。

此时可以进入 nvm 官方教程(实际就是一个 github 页面),这里会提供多种安装方式(但最终貌似都需要克隆 nvm 的仓库,我们可以手动克隆仓库了)。

但是, github 同样有无法打开的可能,那我们也打开国产 「githup」- 码云搜索 nvm-sh,找到热血网友从 github 克隆至此的项目,一样的使用。

下面大致讲解其中比较简单的一种:

Git Install:

进入到 ~ 目录,使用 git 克隆 nvm 仓库:

sh 复制代码
cd ~/

git clone https://github.com/nvm-sh/nvm.git .nvm

进入,切换到最新版本分支(实际最新分支,可再去官网看一下):

sh 复制代码
cd .nvm

git checkout v0.39.7

执行一下安装指令,这个指令瞬间执行完成:

sh 复制代码
. ./nvm.sh

最后,再一下几个文件中的任意一个,~/.bashrc~/.profile ,或 ~/.zshrc,粘贴入一下代码:

sh 复制代码
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 文件中,那么执行:

sh 复制代码
source ~/.zshrc

完成,此时可以使用 nvm 了。

nvm自动切换node版本功能

这个功能本来不需要,但近几年发现,业务和项目太多时,可能真的就很需要了。

比如,接收过来项目,使用的 node 版本可能五花八门;自己公司开发的项目,使用固定某个 node 版本;偶尔自己研究些新技术,又可能会使用最新版的。

本来是进入某个项目,就使用 nvm use 来切换一下,但总的来说很麻烦,每次打开终端都要来这么一下。

所以还是犯懒,在网上找了找解决办法。

前置条件

后面两个解决办法,都有一个前提条件,需要在启动终端的文件夹下,或者父级文件夹,或者父父级文件夹...添加一个文件。

文件名:.nvmrc

文件内容:你已安装、能够使用 nvm use 指令切换过去的node版本号,可以是版本全路径,也可以是省略小版本,比如:

sh 复制代码
v16.19.0

或者

sh 复制代码
v16

或者使用当前已安装的最新版本

sh 复制代码
lts/*

放置好文件,后面两项的功能才能生效。

方案一:使用指令去查找切换(推荐)

切换node的本质,就是在打开终端时,使用 nvm use [版本号] 切换一下。

如果对 mac 或者 linux 系统稍微有些了解的程序员,都知道 ~/.zshrc~/.bashrc 这么个文件(如果使用的shell是 zsh,那是 ~/.zshrc 文件,如果是 bash,那就是 ~/.bashrc 文件)。

这个文件会在用户每次打开一个新终端时,都自动执行一下。

所以我们把下面这段 shell 脚本代码,粘贴到 ~/.zshrc~/.bashrc 文件中,保存。

sh 复制代码
# 启动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 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:

sh 复制代码
找到版本文件,即将切换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以下,否则会安装失败。

打开终端后,先全局安装:

sh 复制代码
npm install -g avn avn-nvm avn-n

然后启动这个工具:

sh 复制代码
avn setup

如果已经按照上面的前置条件创建好了 .nvmrc 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:

sh 复制代码
avn activated v14.16.0 via ../.node-version (avn-nvm v14.16.0)

此时这个终端使用的 node,就是 v14.16.0 了。

nvm安装node失败的解决方法

最近遇到糟心事儿,家里的nvm安装node一直失败,看报错是网络问题。

当我执行以下指令:

sh 复制代码
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的包内容,但里面的内容又不一样。

于是把使用终端执行以下指令:

sh 复制代码
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 后,放入这个文件夹中,最后在终端输入:

sh 复制代码
nvm ls

发现刚进去的v16.14.2出现在「已安装」的node版本列表中。

最终解决方案

所以我们可以自己下载需要的node版本,解压、更名后,放入nvm对应的文件夹中(默认为 ~/.nvm/versions/node/ )即可,下载链接如下:

sh 复制代码
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