一直以来都用 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
到~/.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>
—— 使用某个版本的 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
环境变量的路径里找。