Mac正确的安装和使用nvm

了解nvm

  目前主流的node版本管理工具有两种,nvm和n。两者差异挺大的。

  总的来说,nvm有点类似于 Python 的 virtualenv 或者 Ruby 的 rvm,每个node版本的模块都会被安装在各自版本的沙箱里面(因此切换版本后模块需重新安装),因此考虑到需要时常对node版本进行切换测试兼容性和一些模块对node版本的限制,我选择了使用nvm作为管理工具,下面就来说说nvm的安装和使用过程。

认识nvm、node、npm

区别

  1. nvm:nodejs 版本管理工具。
  2.   也就是说:一个 nvm 可以管理很多 node 版本和 npm 版本。

      这个技术出现的原因, 是由于不同的项目node版本也不同,有的是5.0.1, 有的是6.3.2。 如果node出现版本不对,运行 某个应用时,很可能就会遇到各种莫名其妙的问题 。

  3. nodejs:在项目开发时的所需要的代码库。
  4. npm:nodejs 包管理工具。
  5.   在安装的 nodejs 的时候,npm 也会跟着一起安装,它是包管理工具。

      npm 管理 nodejs 中的第三方插件。他的作用与Ruby中的 bundler及Java中的maven相同,都是对第三方依赖进行管理的。

关系

  nvm 管理 nodejs 和 npm 的版本

  npm 可以管理 nodejs 的第三方插件

安装

  这里主要介绍mac的安装(linux可以参照),windows系统的话可以参考windows

不推荐的安装方法

  一开始我是使用homebrew来安装的,安装命令如下:

brew install nvm

  安装完后,为了让你可以直接在shell使用nvm指令,必须在你的 .bash_profile 加入以下这行(习惯把设定放在.bashrc的人可以把以下的.bash_profile改成.bashrc)(注:如果没有这个文件,可以touch创建)

source $(brew --prefix nvm)/nvm.sh

  或者直接输入以下这行来加入

$ echo "source $(brew --prefix nvm)/nvm.sh" >> .bash_profile

  记得重新source你的 .bash_profile 来让设定生效

$ . ~/.bash_profile

  OK,以上就完成了nvm的安裝。

  我们来装一下 node v5.12.0

nvm install 5

  安装成功后,使用nvm use 来切换版本

nvm use v5.12.0

  如,出现错误如下:

nvm is not compatible with the npm config “prefix” option: currently set to “/Users/fabian/.nvm/versions/node/v0.12.7”
Run nvm use --delete-prefix v4.6.2 to unset it.

  所以只能安装提示,使用

nvm use --delete-prefix v4.6.2

  成功切换。

  至于为什么用homebrew安装会出现上面的问题,可参考Github上的一个issue

  查看nvm文档发现:文档中Installation 那一小节倒数第二行有一句Homebrew installation is not supported.,由此可见,没事儿还是要多看看文档。

推荐的安装方法

卸载已安装到全局的 node/npm

  如果之前是在官网下载的 node 安装包,运行后会自动安装在全局目录,其中

  node 命令在 /usr/local/bin/node

  npm 命令在全局 node_modules 目录中,具体路径为 /usr/local/lib/node_modules/npm

  安装 nvm 之后最好先删除下已安装的 node 和全局 node 模块:

npm ls -g --depth=0 #查看已经安装在全局的模块,以便删除这些全局模块后再按照不同的 node 版本重新进行全局安装

sudo rm -rf /usr/local/lib/node_modules #删除全局 node_modules 目录
sudo rm /usr/local/bin/node #删除 node
cd  /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm #删除全局 node 模块注册的软链
安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

  如果报错,解决办法:通过修改 hosts 解决此问题。

  查询真实IP,在 https://www.ipaddress.com/ 查询 raw.githubusercontent.com 的真实IP。

#修改hosts
sudo vim /etc/hosts

#添加如下内容:
199.232.28.133 raw.githubusercontent.com

  安装完成后请重新打开终端环境,Mac 下推荐使用 oh-my-zsh 代替默认的 bash shell。 安装完成后,发现使用 nvm install stable 安装node速度很慢 ,原因嘛,大概大家都知道我大天朝的国情。 接下来介绍如何使用国内镜像快速安装node: 把环境变量 NVM_NODEJS_ORG_MIRROR, 那么我建议你加入到 .bash_profile 文件中:

# nvm
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node

  然后你可以继续非常方便地安装各个版本的 node 了.

查看 node 版本

nvm ls-remote     # 远端版本
nvm ls            # 本地已安装的版本

安装 node 版本

nvm install node                            # 安装最新版本
nvm install 6.14.4 # or 10.10.0, 8.9.1, etc # 安装指定版本

使用 node 版本

nvm use node    # 使用最新版本
nvm use 12.13.0 # 使用指定版本

查看 node 版本 安装位置

nvm which 5.0
使用 cnpm 加速 npm

  同理 nvm , npm 默认是从国外的源获取和下载包信息, 不慢才奇怪. 可以通过简单的 —registry 参数, 使用国内的镜像 https://registry.npm.taobao.org :

$ npm --registry=https://registry.npm.taobao.org install koa

  于是屏幕又哗啦哗啦地一大片输出

$ npm –registry=https://registry.npm.taobao.org install koa
npm http GET https://registry.npm.taobao.org/koa
npm http 200 https://registry.npm.taobao.org/koa

npm http 200 https://registry.npm.taobao.org/negotiator
npm http 200 https://registry.npm.taobao.org/keygrip
koa@0.5.2 node_modules/koa
├── koa-compose@2.2.0
├── statuses@1.0.2
├── finished@1.1.1
├── escape-html@1.0.1
├── only@0.0.2
├── debug@0.8.0
├── fresh@0.2.2
├── type-is@1.0.1
├── delegates@0.0.3
├── mime@1.2.11
├── co@3.0.5
├── accepts@1.0.1 (negotiator@0.4.2)
└── cookies@0.4.0 (keygrip@1.0.0)

  但是毕竟镜像跟官方的 npm 源还是会有一个同步时间差异, 目前 cnpm 的默认同步时间间隔是 15 分钟. 如果你是模块发布者, 或者你想马上同步一个模块, 那么推荐你安装 cnpm cli:

$ npm --registry=https://registry.npm.taobao.org install cnpm -g

  通过 cnpm 命令行, 你可以快速同步任意模块:

$ cnpm sync koa connect mocha

  呃, 我就是不想安装 cnpm cli 怎么办? 哈哈, 早就想到你会这么懒了, 于是我们还有一个 web 页面:

  例如我想马上同步 koa, 直接打开浏览器: https://npm.taobao.org/sync/koa

  或者你是命令行控, 通过 open 命令打开:

$ open https://npm.taobao.org/sync/koa

  如果你安装的模块依赖了 C++ 模块, 需要编译, 肯定会通过 node-gyp 来编译, node-gyp 在第一次编译的时候, 需要依赖 node 源代码, 于是又会去 node dist 下载, 于是大家又会吐槽, 怎么 npm 安装这么慢…

  好吧, 于是又要提到 --disturl 参数, 通过七牛的镜像来下载:

$ npm --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node install microtime

  再次要提到 cnpm cli, 它已经默认将 –registry 和 –disturl 都配置好了, 谁用谁知道 如果不想使用cnpm cli,可以

npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

  查看npm的配置

npm config ls # npm的配置

nvm常用命令

  1. nvm install ## 安装指定版本,可模糊安装,如:安装v4.4.0,既可nvm install v4.4.0,又可nvm install 4.4
  2. nvm uninstall ## 删除已安装的指定版本,语法与install类似
  3. nvm use ## 切换使用指定的版本node
  4. nvm ls ## 列出所有安装的版本
  5. nvm ls-remote ## 列出所以远程服务器的版本(官方node version list)
  6. nvm current ## 显示当前的版本
  7. nvm alias ## 给不同的版本号添加别名
  8. nvm unalias ## 删除已定义的别名
  9. nvm reinstall-packages ## 在当前版本node环境下,重新全局安装指定版本号的npm包

附: MAC 的 .bash_profile

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completi    on
 
# nvm 改为国内node镜像
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node