nvm 似乎比 n 更优秀一些
一直以来都用 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,可以解决这个问题。
安装
brew install nvm—— 不推荐,听说很容易出错,懒得折腾就不做小白鼠了curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.37.0/install.sh | bash—— 推荐,但会被墙,截至 2020.11.8,最新版本是 v0.37.0- 直接
git clone到~/.nvmgit 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 ~/.nvmthen./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 的镜像指向淘宝,也请写入~/.bashrcnvm 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 xxxnvm ls—— 查看当前已安装的 node,及一些有用的信息(前面<xxx>的含义、default 是哪个版本、各个版本的开发代号)nvm ls-remote [--lts]—— 查看可以安装的 node 版本,[--lts]则仅显示长期维护版nvm use <xxx>—— 使用某个版本的 nodenvm current—— 查看当前在使用的 nodenvm 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/
- 如果 registry 不够快,则:
npm config get prefix- 如果不用 n 或 nvm,则可以配置 prefix 到自己制定路径,这样就不必用 sudo 来
npm install了,建议npm config set prefix $HOME/.node; - 如果用 n 或 nvm,则不用管它,因为对 n 会有负面影响,对 nvm 则没影响,nvm 会自动配置 prefix;
- 如果不用 n 或 nvm,则可以配置 prefix 到自己制定路径,这样就不必用 sudo 来
$ 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 环境变量的路径里找。
