来源:http://taobaofed.org/blog/2015/11/17/nvm-or-n/node
我本机安装着 nvm,而 node 原本一直运行在 0.x 的老版本上。后来为了跑 ES6,我将 node 切换到 4.x 的版本,而且把老版本给删掉了。git
而后我就碰到了两个问题。一是 WebStorm 报错说找不到 node 解释器了。我只好去设置里面从新设置一番解释器的路径:github
在个人记忆中,WebStorm 默认不须要设置 node 路径,它会去找 /usr/local/bin
,即一般的 node 命令位置。而一旦使用 nvm 来安装和管理 node,甚至频繁切换的话,咱们就得 手动地 指定 node 路径。shell
并且是如此硬编码的路径(硬编码了版本号),真不优雅……npm
第二个问题是,我曾经在全局安装的各类 node 模块们全都须要从新安装,由于全局模块被安装在每一个 node 版本本身的沙箱中,所以它们和老版本的 node 一块儿被埋葬了。bash
事实上,这就是 nvm 的特性,然而喜不喜欢它则是另外一回事儿了。curl
无论如何,因为发生了这些个问题,我决定稍微深刻了解一下状况。工具
在 node 的版本管理工具中,nvm 天然声名远扬,然而咱们也不能忘了来自 TJ 的 n。这两种,是目前最主流的方案。测试
关于这两个工具如何安装和使用,这里再也不赘言,请见它们各自的主页:编码
接下来咱们着重关注一下 nvm 和 n 的运做机制和特性。
n 是一个须要全局安装的 npm package。
npm install -g n |
这意味着,咱们在使用 n 管理 node 版本前,首先须要一个 node 环境。咱们或者用 Homebrew 来安装一个 node,或者从官网下载 pkg 来安装,总之咱们得先本身装一个 node —— n 自己是无法给你装的。
而后咱们可使用 n 来安装不一样版本的 node。
在安装的时候,n 会先将指定版本的 node 存储下来,而后将其复制到咱们熟知的路径 /usr/local/bin
,很是简单明了。固然因为 n 会操做到非用户目录,因此须要加 sudo
来执行命令。
因此这样看来,n 在其实现上是一个很是易理解的方案。
咱们再来看 nvm。不一样于 n,nvm 不是一个 npm package,而是一个独立软件包。这意味着咱们须要单独使用它的安装逻辑:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash |
或者使用 Homebrew 来安装。安装完后,还须要修改一下 shell 配置(~/.zshrc
or whatever),具体参见官方文档。
而后咱们可使用 nvm 来安装不一样版本的 node。
在安装的时候,nvm 将不一样的 node 版本存储到 ~/.nvm/<version>/
下,而后修改 $PATH
,将指定版本的 node 路径加入,这样咱们调用的 node
命令便是使用指定版本的 node。
nvm 显然比 n 要复杂一些,可是另外一方面,因为它是一个独立软件包,所以它和 node 之间的关系看上去更合乎逻辑:nvm 不依赖 node 环境,是 node 依赖 nvm;而不像 n 那样产生相似循环依赖的问题。
这样看下来,nvm 和 n 的差别仍是比较大的,具体体如今:
/usr/local/bin
;nvm 须要手动指定路径。因此,如何选择?真心见仁见智了,不过这里能够给出大致的建议:
你若是要问,楼主最终选用了谁?我会说,我选择了更流行的那一个。