Skip to main content

nvm 似乎比 n 更优秀一些

wKevin

一直以来都用 n 来管理多个版本的 node,但今天遇到一个问题:我要在不同版本的 node 上安装不同版本的 docsify,n 做不到,因为 n 把多个版本安装到 $N_PREFIX/n/node/versions/xxx/lib/node_modules/ 目录下面,但 npm install 的包并没有分开,都在 $N_PREFIX/lib/node_modules 下,所以多个 node 版本切换后,docsify 仍在那里,并不属于任何一个 n 管理的 node。

简单搜索后,准备试试 nvm,可以解决这个问题。

安装

  1. brew install nvm —— 不推荐,听说很容易出错,懒得折腾就不做小白鼠了
  2. curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.37.0/install.sh | bash —— 推荐,但会被墙,截至 2020.11.8,最新版本是 v0.37.0
  3. 直接 git clone~/.nvm
    • git clone https://github.com/nvm-sh/nvm.git ~/.nvm —— 还是可能被墙,但 github 比 githubusercontent 稍微好点
      • git clone https://gitclone.com/github.com/nvm-sh/nvm.git ~/.nvm —— 使用好心人的镜像
      • git clone https://github.com.cnpmjs.org/nvm-sh/nvm.git ~/.nvm —— 好心人 2
    • cd ~/.nvm then ./install.sh —— 会自动修改 ~/.bashrc~/.bash_profile,比如 NVM_DIR 环境变量等

总结:

一句话搞定安装: git clone https://gitclone.com/github.com/nvm-sh/nvm.git ~/.nvm && ~/.nvm/install.sh

nvm -v 如果有了正确的输出,请继续

使用

  • export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node —— 配置安装 node 的镜像指向淘宝,也请写入 ~/.bashrc
  • nvm install <xxx>,安装到环境变量 NVM_DIR/versions/node/
    • nvm install stable 当前最新稳定版
    • nvm install --lts=xxx 代号为 xxx 的 lts 长期维护版
      • fermium:14.x
      • erbium: 12.x
      • dubnium: 10.x
    • nvm install 10.16.0 手工指定一个版本来安装
  • nvm uninstall xxx
  • nvm ls —— 查看当前已安装的 node,及一些有用的信息(前面 <xxx> 的含义、default 是哪个版本、各个版本的开发代号)
  • nvm ls-remote [--lts] —— 查看可以安装的 node 版本, [--lts] 则仅显示长期维护版
  • nvm use <xxx> —— 使用某个版本的 node
  • nvm current —— 查看当前在使用的 node
  • nvm alias default <xxx> —— use <xxx> 尽在某个 shell 进程中有效,换个 shell 会重新使用 default,此命令修改 default 版本
  • nvm deactivate —— 放弃 nvm 的管理,继续使用系统的 node,其实不过是把 $NVM_DIR/xxx/bin$PATH 中删掉而已,想再次使用 nvm,执行 nvm use <xxx> 即可。
/Users/wangkevin/.nvm/*/bin removed from ${PATH}

技巧

使用 alias 可以帮助我更快的切换:

$ nvm alias 12 --lts=erbium
12 -> --lts=erbium (-> v12.19.0)
$ nvm alias 14 --lts=fermium
14 -> --lts=fermium (-> v14.15.0)
$ nvm alias 10 --lts=dubnium
10 -> --lts=dubnium (-> v10.23.0)

但 default 设置不当会引起 node 无法使用,比如:

nvm alias default 14.15.0

当 v14.15.0 已经被删除,并升级到 v14.17.6,则 default 无法正常使用,每次 shell 会找不到 node 和 npm。此时可以删除已经废弃的 alias,然后把 default 指向能用的。

nvm unalias 14.15.0
nvm alias default 14.17.6

如果删除不成功,直接进入 ~/.nvm/alias 目录下删除相应文件。

npm

捎带记录一下 npm 的重点摘要:

  • npm config ls
    • 如果 registry 不够快,则: npm config set registry http://registry.npm.taobao.org/
  • npm config get prefix
    • 如果不用 n 或 nvm,则可以配置 prefix 到自己制定路径,这样就不必用 sudo 来 npm install 了,建议 npm config set prefix $HOME/.node
    • 如果用 n 或 nvm,则不用管它,因为对 n 会有负面影响,对 nvm 则没影响,nvm 会自动配置 prefix;
$ npm config get prefix
/Users/wangkevin/.nvm/versions/node/v15.1.0
  • npm install [-g] [-S|-D] <xxx>
    • -g:没有 -g 则安装到当前目录下的 node_modules 下,如果当前就在 node_modules 则就安装到当下;如果有 -g 则安装到 prefix 下
    • -S|-D:安装并将依赖关系写入 dependencies|devDependencies 文件中

总结

nvm 类似 python 的 pyenv,是个第三方的程序,所以可以跳出 python 之外来管理 python,那有没有类似 python 虚拟环境的呢?当然,npm install 不加 -g 就是了,安装到当前文件夹下,那多个项目想共用一套 npm 包呢?比 python 的 vnev 来的更简单:在一个共用文件夹下 npm install,该文件夹下所有的项目都可以使用这套包了 —— 因为 node 寻找包的方式是:先在当前目录下的 node_modules 下找,然后向上级目录找,一直找到根目录,然后在 NODE_PATH 环境变量的路径里找。