使用 nvm 管理不同版本的 nodejs 与 npm

在我们的日常开发中,手上有好几个项目,每个项目的需求不同,如果不同项目必须依赖不同版的 NodeJS 运行环境,这个问题将非常棘手,如果有个 NodeJS 版本管理工具就好了。

nvm 应运而生,nvm 是 Mac 下的 NodeJS 管理工具,有点类似管理 Ruby 的 rvm,如果需要管理 Windows 下的 node,官方推荐使用 nvmw 或 nvm-windows(是使用go语言编写的软件)。不过,nvm-windows 并不是 nvm 的简单移植,他们也没有任何关系。但下面介绍的所有命令,都可以在 nvm-windows 中运行。

NVM 安装

Windows 安装

下载地址:https://github.com/coreybutler/nvm-windows/releases

文件说明:

  • nvm-noinstall.zip: 这个是绿色免安装版本,但是使用之前需要配置
  • nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。
  • Source code(zip):zip压缩的源码
  • Sourc code(tar.gz):tar.gz的源码,一般用于*nix系统

我们直接选择nvm-set.zip文件下载即可。

解压nvm-set.zip,双击运行nvm-setup.exe,根据提示安装即可。

提示:

  1. 如果已经安装过 Nodejs,可以不用卸载,安装nvm的时候会提示让你选择的
  2. 建议关掉电脑上的安全软件,并使用管理员权限运行.exe文件

命令行输入 nvm version, 提示了版本信息说明安装成功了。

1
2
$ nvm version
1.1.6

OS X/Linux 安装

Ubuntu 都可以直接用 build-essential 套件,OS X 的话,可以用 X-Code 的命令行工具。运行这个命令即可:

1
xcode-select --install

在 Linux 中:(如果是 Debian 发行版)

1
sudo apt-get install build-essential

然后我们可以使用

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

或者

1
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash

从远程下载 install.sh 脚本并执行。注意这个版本年数字 v0.33.0 会随着项目开发而变化。随时通过官方最新安装命令来检查最新安装版本是有好处的。

Linux 安装(最新)

1.nvm国内镜像设置

bash中输入:

1
2
export NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node
export NVM_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs

2.下载nvm脚本

1
2
3
cd /opt
git clone https://github.com/nvm-sh/nvm.git /opt/nvm
sh nvm/install.sh

3.给.bashrc 添加自启环境

1
2
3
4
5
6
7
8
sudo vim .bashrc
// .bashrc
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
source ~/.bashrc

4.安装node版本

1
2
nvm install 14
14表示版本是node14的

5.设置npm国内代理

1
npm config set registry https://registry.npm.taobao.org/

安装多版本 node/npm

例如,我们要安装4.2.2版本,可以用如下命令:

1
nvm install 4.2.2

nvm 遵守语义化版本命名规则。例如,你想安装最新的 4.2 系列的最新的一个版本的话,可以运行:

1
nvm install 4.2

nvm 会寻找 4.2.x 中最高的版本来安装。

你可以通过以下命令来列出远程服务器上所有的可用版本:

1
nvm ls-remote

Windows 的话,就是:

1
nvm ls available

在不同版本间切换

每当我们安装了一个新版本 Node 后,全局环境会自动把这个新版本设置为默认。

nvm 提供了 nvm use 命令。这个命令的使用方法和 install 命令类似。

例如,切换到 4.2.2

1
nvm use 4.2.2

切换到最新的 4.2.x

1
nvm use 4.2

切换到 iojs:

1
nvm use iojs-v3.2.0

切换到最新版:

1
nvm use node

每次执行切换的时候,系统都会把 node 的可执行文件链接放到特定版本的文件上。

我们还可以用 nvm 给不同的版本号设置别名:

1
nvm alias awesome-version 4.2.2

我们给 4.2.2 这个版本号起了一个名字叫做 awesome-version,然后我们可以运行:

1
nvm use awesome-version

下面这个命令可以取消别名:

1
nvm unalias awesome-version

另外,你还可以设置 default 这个特殊别名:

1
nvm alias default node

列出已安装实例

1
2
3
4
5
$ nvm ls

* 12.18.0 (Currently using 64-bit executable)
12.0.0
8.11.2

在项目中使用不同版本的 Node

我们可以通过创建项目目录中的 .nvmrc 文件来指定要使用的 Node 版本。之后在项目目录中执行 nvm use 即可。.nvmrc 文件内容只需要遵守上文提到的语义化版本规则即可。另外还有个工具叫做 avn,可以自动化这个过程。

在多环境中,npm该如何使用呢?

每个版本的 Node 都会自带一个不同版本的 npm,可以用 npm -v 来查看 npm 的版本。全局安装的 npm 包并不会在不同的 Node 环境中共享,因为这会引起兼容问题。它们被放在了不同版本的目录下,例如 ~/.nvm/versions/node/<version>/lib/node_modules</version> 这样的目录。这刚好也省去我们在 Linux 中使用 sudo 的功夫了。因为这是用户的主文件夹,并不会引起权限问题。

但问题来了,我们安装过的 npm 包,都要重新再装一次?幸运的是,我们有个办法来解决我们的问题,运行下面这个命令,可以从特定版本导入到我们将要安装的新版本 Node:

1
nvm install v5.0.0 --reinstall-packages-from=4.2

其他命令

直接运行特定版本的 Node

1
nvm run 4.2.2 --version

在当前终端的子进程中运行特定版本的 Node

1
nvm exec 4.2.2 node --version

确认某个版本Node的路径

1
nvm which 4.2.2

安装 Node 的其他实现,例如 iojs(一个基于 ES6 的 Node 实现,现在已经和 Node 合并)

1
nvm install iojs-v3.2.0

快捷命令:

  • nvm install node 安装最新版 Node
  • nvm install iojs 安装最新版 iojs
  • nvm install unstable 安装最新不稳定版本的 Node

nvm 使用命令

  • nvm arch [32|64] : 显示node是运行在32位还是64位模式。指定32或64来覆盖默认体系结构。
  • nvm install <version> [arch]: 该可以是node.js版本或最新稳定版本latest。(可选[arch])指定安装32位或64位版本(默认为系统arch)。设置[arch]为all以安装32和64位版本。在命令后面添加–insecure ,可以绕过远端下载服务器的SSL验证。
  • nvm list [available]: 列出已经安装的node.js版本。可选的available,显示可下载版本的部分列表。这个命令可以简写为nvm ls [available]。
  • nvm on: 启用node.js版本管理。
  • nvm off: 禁用node.js版本管理(不卸载任何东西)
  • nvm proxy [url]: 设置用于下载的代理。留[url]空白,以查看当前的代理。设置[url]为none删除代理。
  • nvm node_mirror [url]:设置node镜像,默认为https://nodejs.org/dist/.。我建议设置为淘宝的镜像https://npm.taobao.org/mirrors/node/
  • nvm npm_mirror [url]:设置npm镜像,默认为https://github.com/npm/npm/archive/。我建议设置为淘宝的镜像https://npm.taobao.org/mirrors/npm/
  • nvm uninstall <version>: 卸载指定版本的nodejs。
  • nvm use [version] [arch]: 切换到使用指定的nodejs版本。可以指定32/64位[arch]。nvm use 将继续使用所选版本,但根据提供的值切换到32/64位模式的
  • nvm root [path]: 设置 nvm 存储node.js不同版本的目录 ,如果未设置,将使用当前目录。
  • nvm version: 显示当前运行的nvm版本,可以简写为nvm v

解决 npm command not found 问题

经过一系列的研究,发现8.11以上版本的node版本对应的npm都没法自动安装,对应的版本目录下没有npm运行文件,这里需要我们手动下载。

  1. 查看nodejs版本对应的npm版本https://nodejs.org/zh-cn/download/releases/
  2. 登录npm淘宝官网https://npm.taobao.org/mirrors/npm/
  3. 下载对应的npm版本
  4. 解压后的文件夹重命名为 npm 并复制到 node_modules 目录下
  5. 将 npm 中 bin 目录下的 npm、和npm.cmd 复制到 node_modules 目录同级目录下(如果有npx、和npx.cmd一块复制)

最终的目录结构为

1
2
3
4
5
6
7
8
9
10
11
─nvm
├─vxx.xx.xx
│ ├─node_modules
│ │ ├─npm
│ │ │ ├─bin
│ │ │ ├─...其他文件
│ ├─node.exe
│ ├─npm
│ ├─npm.cmd
│ ├─npx(如果有的话)
│ ├─npx.cmd(如果有的话)

选择node版本执行npm -v试试看

1
2
nvm use xx.xx.xx
npm -v
坚持原创技术分享,您的支持将鼓励我继续创作!
0%