6

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

然而,卸载和安装node的麻烦程度虽然还能接受,但想在其他项目,依然使用高版本node的语法支持,要么使用webpack或gulp这种构建编译工具,要么就还是需要使用高版本node。

这时候,nvm出现了。

nvm就是node版本管理器,使用它可以安装多个版本的node,然后可以通过一行命令,轻松切换当前使用的node版本。

也就是说,不用再卸载、安装了,想用哪个版本,就用nvm安装,安完一个指令切换就可以了!

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

安装

nvm 官方教程

卸载全局安装的node包

既然使用nvm‘托管’,那么自己之前安装的全局node包,就需要先卸载了,防止出问题。

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

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

下面,是卸载步骤

也可以用 type -a node 查看一下路径,不同机器和不通安装方式,位置可能不一样。
  1. 删除全局 node_modules 目录,里面其实只有几个文件夹,是npm和使用npm全局安装的比如yarn、cnpm等
    sudo rm -rf /usr/local/lib/node_modules
  2. 删除 node,其实就是卸载node环境了
    sudo rm /usr/local/bin/node
  3. 删除全局 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

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

curl方式:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

wget方式:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/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指令了。

v0.35.3版本的指令如下,可以直接在官网安装最新版本的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

这里推荐创建~/.bash_profile,如果有,则直接在里面的最后面加上上面的代码即,然后执行source ~/.bash_profile,重载此文件,nvm就可以正常使用了。

安装失败

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

此时可以进入 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.38.0

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

. ./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

最后的最后,让系统重新读取一下这个文件,比如这个放进了 ~/.bashrc 文件中,那么执行:

source ~/.bashrc

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

nvm使用

主要为如下一些指令:

功能指令
列出当前已安装的node,和可安装的lts(长期支持稳定版)版本nvm ls
列出所有远程服务器的版本nvm ls-remote
安装指定版本,可模糊安装,建议先查询后安装,比如 nvm install v11.11.0nvm install <版本号>
安装最新稳定版 nodenvm install stable
删除已安装的指定版本,语法与install类似nvm uninstall <版本号>
设置一个默认版本,新打开的终端使用的版本nvm alias default <版本号>
给不同的版本号添加别名nvm alias <别名> <版本号>
取消一个别名nvm unalias <别名>
切换当前终端使用的版本,但只针对当前终端生效,不影响其他nvm use <版本号 或 别名>
显示当前的版本nvm current
删除已定义的别名nvm unalias <别名>
在当前版本 node 环境下,重新全局安装指定版本号的 npm 包nvm reinstall-packages <版本号>

使用终端进入不同目录,avn 自动切换node版本

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

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

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

网上找了找,找到了这个工具: avn

首先新打开一个终端,保证现在使用的是默认版本的 node,这是因为 nvm 中,在不同的 node 版本下安装的全局依赖,是互不相通的。

这个工具是基于 node 的,我们只需要默认 node 下全局安装,当每次使用终端进入不同目录时,node 默认都是版本,然后它会自动执行,切换到接下来你要指定的 node 版本。

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

npm install -g avn avn-nvm avn-n

然后启动这个工具:

avn setup

注意:不知道为什么,我使用node^11.11.0 安装的依赖们,就可以启动,而是用 node^12.21.0,它还是个长期支持版,使用这个版本安装的依赖,启动时却会报错 if (cb) cb.apply(this, arguments) 很奇怪,不过,你可以在 v11.11.0 下,安装依赖并启动,之后切换node版本也不会影响了,如果有影响,就在其他版本下也安装依赖。

接下来,就是去到你需要自定义 node 版本的项目,创建文件 .node-version ,内容直接写你需要的 node 版本,比如:

这个 node 版本,需要是你已经用 nvm 安装过了的,否则会报错 avn could not activate node v14.15.0
v14.16.0

然后,在这个项目下重启终端,就会出现提示:

avn activated v14.16.0 via ../.node-version (avn-nvm v14.16.0)

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

优化: 但上面这个方法,需要在每个自定义 node 版本的项目中,添加这个文件,很不友好。

其实,我们可以在把这个文件,放在这个项目的父级目录中,同样会生效,这样凡是使用同一个 node 版本的项目,都放在这个文件夹下,就很友好了。


千鸟语
609 声望24 粉丝

前端开发多年,正在努力向全栈方向拓展