使用NVM管理多版本Node

本篇内容是在Mac OS X环境下实践的。

NVM的安装和使用

卸载原有的Node.js

之前没有在电脑里安装过Node.js且没有强迫症的可以跳过

  1. node 命令在 /usr/local/bin/node ,npm 命令在全局 node_modules 目录中,具体路径为 /usr/local/lib/node_modules/npm
  2. 先通过npm ls -g --depth=0查看已经安装在全局的npm包(之后才知道要装哪些回去)
  3. sudo rm -rf /usr/local/lib/node_modules 删除全局 node_modules 目录
  4. sudo rm /usr/local/bin/node 删除 node
  5. cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm 删除全局 node 模块注册的软链

安装NVM

  1. 官网是最好的安装教程,包括什么command not found上面都写的清楚了
  2. ~/.bash_profile文件中中添加代码来指定nvm源(天朝特色)

    1
    2
    # nvm
    export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
  3. node也可以修改源

    1
    2
    3
    4
    # registry是npm依赖包的url
    npm config set registry https://registry.npm.taobao.org --global
    # disturl(很多人不知道这是什么)是node版本的地址——通过nvm去下载node版本的时候需要的
    npm config set disturl https://npm.taobao.org/dist --global

使用NVM

  1. nvm --help可以很直观的看到命令,另外,在输入命令的时候多用tab也可以很容易的从补全提示中得到答案。
  2. 第一个安装的node版本会先被设为default。通过命令npm alias default <version>就可以修改default版本。
  3. 更可以通过nvm alias default node来确保所有的Shell都优先使用default版本
  4. 设置default的意义:你新开的窗口将会是default指定版本的Node.js环境,所以有必要将之设置为lts的版本,额外需要切的特殊情况手动切。
  5. nvm install --lts会自动安装官网上的lts版本,否则就是nvm install <version>version是如:”v8.10.0“这样的写法,但其实是支持模糊输入的
  6. nvm install stable也可以直接安装稳定版本
  7. 在IDE或者编辑器里的Shell窗口,有时候需要你“关闭”或者“删除”他们之后,重新打开,NVM的配置才会生效。
  8. 常用命令:nvm use x.y.z,可以尝试简写nvm use x,如果你本地某个大版本只有一个,就能直接切过去。

.nvmrc文件的使用

  1. 一般我们通过nvm use x.y.z来切换版本,但是对版本有要求的项目,并不需要特别去记。只需要在项目根目录下新建.nvmrc文件,写上版本号——只需要写版本号x.y.z即可,在项目目录下运行nvm use即会自动切换版本。当然,前提是你事先配置过环境,nvm管理下有那个版本。
  2. .nvmrc文件可以手动创建,也可以很简单的一行命令搞定:node -v > .nvmrc
  3. 配合一些其他手段,甚至可以做到进入目录之后自动根据nvmrc文件切换node版本

NRM

管理npm源

  1. 有的时候,镜像可能有同步问题、访问速度问题,所以会有切换的需求,和ruby的gem一样,有时候需要切到国内的淘宝镜像。
  2. 值得一提的是还可以用它来切官方源和公司的私有npm源。

安装并且使用NRM

  1. npm i nrm -g他是通过npm来安装的…
  2. nrm ls列出可以切换的源,目前nrm支持在npm、cnpm、strongloop、european、australia、nodejitsu、taobao来回切。
  3. nrm use <registry>根据上面列出的源,可以通过名字进行切换。
  4. nrm add <registry> <url> [home]可以增加定制的源——特别适用于企业内部私有源。
  5. nrm del <registry>删除某个源
  6. nrm test [registry]测速

NVM和N的对比

本节大量参考了该文章

  1. 二者都是node的版本管理工具,但是原理和特点不太一样
  2. NVM
    • git官网
    • nvm 不是一个 npm package,而是一个独立软件包。这意味着我们需要单独使用它的安装逻辑。
    • nvm 将不同的 node 版本存储到 ~/.nvm/<version>/ 下,然后修改$PATH,将指定版本的 node 路径加入,我们调用的 node 命令才是使用指定版本的 node
    • nvm 不依赖 node 环境,是 node 依赖 nvm
    • nvm 的全局模块存在于各自版本的沙箱中,切换版本后需要重新安装,不同版本间也不存在任何冲突
    • 对于一些IDE,比如webstorm,有时需要用户手动地指定 node 路径,略尴尬
    • 如果需要频繁切换 node 版本(比如本地经常测试最新版的特性,同时又要兼顾代码在生产环境的兼容性),那么从全局模块兼容性的角度考虑,只能使用 nvm
  3. N
    • git官网
    • 非常小巧,非常简单,适合已经有node环境的、用来当临时的解决方案,或者轻量级的node版本切换的需求
    • 一个需要全局安装的 npm package!由于 n 会操作到非用户目录,所以需要加 sudo 来执行命令,另外,着看起来仿佛会产生类似循环依赖的问题
    • 安装的时候,n 会先将指定版本的 node 存储下来,然后将其复制到我们熟知的路径 /usr/local/bin,非常简单明了
    • 对全局模块的管理。n 对全局模块毫无作为,当使用 n 切换不同的 node 版本时,实际上会共用全局的 node/npm 目录。因此有可能在切换了 node 版本后发生全局模块执行出错的问题
    • 关于 node 路径。n 是万年不变的 /usr/local/bin
    • 很久没更新了。我用NVM。