在日常的前端或node后台开发中,使用的部分node依赖,可能不支持当前使用的node版本,这时候如果还想使用这个依赖愉快的开发,那只能切换node版本了。
然而,卸载和安装node的麻烦程度虽然还能接受,但想在其他项目,依然使用高版本node的语法支持,要么使用webpack或gulp这种构建编译工具,要么就还是需要使用高版本node。
这时候,nvm出现了。
nvm就是node版本管理器,使用它可以安装多个版本的node,然后可以通过一行命令,轻松切换当前使用的node版本。
也就是说,不用再卸载、安装了,想用哪个版本,就用nvm安装,安完一个指令切换就可以了!
下面基于mac系统,进行一些步骤的讲解。
安装
卸载全局安装的node包
既然使用nvm‘托管’,那么自己之前安装的全局node包,就需要先卸载了,防止出问题。
npm、cnpm、yarn等都会被一并删掉,稍后需要重新安。
下面的指令,可以查看已经安装在全局的模块node功能模块,以便删除这些全局模块后再按照不同的 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
安装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.0 | 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 <版本号> |
使用终端进入不同目录,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 版本的项目,都放在这个文件夹下,就很友好了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。