npm、cnpm和nvm
使用NodeJS做开发时第一次难免要接触npm、cnpm和nvm这几个概念,很容易被搞的晕头转向,在此对这几个概念做一下区分.
npm
依赖管理
每种编程语言都有自己的生态,这个生态就是与这门语言一起存在的开发者社区和很多开发者共享的开源库(library).但是库会越来越多,并且库与库之间产生依赖,并且同一个库会存在多个版本.现在随便一个项目都要引用很多库,如果认为管理这些库并解决它们之间的依赖关系将会很费时费力.基于此,很多编程语言都建立了开源库管理工具,用于帮我们自动下载需要的库及它们需要的依赖库.比如iOS生态的cocoa,Java生态的maven和gradle等.
npm
当然,对于NodeJS,开源库就是module(library),对应的库管理工具叫做包管理工具(package management),简称npm,对应的官网是https://www.npmjs.com/. 注意:这个网站和NodeJS的官网https://nodejs.org/en/ 不是同一个网站.
npm安装
npm官网Get npm有以下说明:
npm is distributed with Node.js- which means that when you download Node.js, you automatically get npm installed on your computer.
Download Node.js and npm
也就是从node官网下砸安装文件时,除了会安装NodeJS,还会自动安装对应版本的npm.
cnpm
众所周知,我国访问国外网站速度很慢,从npm下载module很慢,因此淘宝为npm开发了一个镜像站并将镜像站相关操作封装进cnpm.比如以前使用$ npm install xxx
,现在只需换成$ cnpm install xxx
即可.按照cnpm官网http://npm.taobao.org/ 说明,cnpm支持 npm 除了 publish 之外的所有命令.
nvm
nvm简介
mac平台上专门用于管理node.js和npm版本的工具.使用它可以下载指定版本的node.并且使用nvm可以在同一个电脑上安装多个版本的node,并且可以很容易切换版本. windows平台可以使用nvm-windows.默认每个node版本中的module是相互隔离的.
nvm安装
根据nvm官方说明,安装或者更新nvm使用同一个命令:
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
nvm升级
查看本机上已经安装的nvm版本:
$ nvm --version
终端输出
0.31.0
nvm安装和升级使用相同的命令,因此使用下面命令升级nvm:
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
终端输出
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12540 100 12540 0 0 17411 0 --:--:-- --:--:-- --:--:-- 17416
=> nvm is already installed in /Users/chenxin/.nvm, trying to update using git
=> => Compressing and cleaning up git repository
=> nvm source string already in /Users/chenxin/.bash_profile
=> Appending bash_completion source string to /Users/chenxin/.bash_profile
=> You currently have modules installed globally with `npm`. These will no
=> longer be linked to the active version of Node when you install a new node
=> with `nvm`; and they may (depending on how you construct your `$PATH`)
=> override the binaries of modules installed with `nvm`:
/Users/chenxin/.nvm/versions/node/v5.11.0/lib
├── [email protected]
=> If you wish to uninstall them at a later point (or re-install them under your
=> `nvm` Nodes), you can remove them from the system Node as follows:
$ nvm use system
$ npm uninstall -g a_module
=> Close and reopen your terminal to start using nvm or run the following to use it now:
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_completion
安装新的node
使用下面2个等价的命令之一查看本机已安装的node:
$ nvm ls
或者$ nvm list
终端输出
v0.8.14
-> v5.11.0
default -> 5.11.0 (-> v5.11.0)
node -> stable (-> v5.11.0) (default)
stable -> 5.11 (-> v5.11.0) (default)
iojs -> N/A (default)
使用以下命令查看远程可安装的node:
$ nvm ls-remote
终端输出
v0.1.14
v0.1.15
......
v0.12.17
v0.12.18
iojs-v1.0.0
iojs-v1.0.1
......
iojs-v3.3.0
iojs-v3.3.1
v4.0.0
v4.1.0
......
v9.4.0
v9.5.0
可选版本太长,这里用......省略了大部分.
现在安装6.x的最新版本:
$ nvm install 6
使用nvm install 6会安装6.x.x的最新版本,使用nvm install 6.1会安装6.1.x的最新版本,更多说明用法参考How to install NodeJS and NPM using NVM and Zsh-NVM?. 终端输出
Downloading https://nodejs.org/dist/v6.13.0/node-v6.13.0-darwin-x64.tar.gz...
######################################################################## 100.0%
Now using node v6.13.0 (npm v3.10.10)
可以看到自动安装了npm.
查看node版本:
$ node -v
终端输出
v6.13.0
查看npm版本:
$ npm -v
终端输出
3.10.10
可以看到node和npm都切换到了刚刚安装的版本.
安装新的node默认不会安装之前node中的module.如果需要之前版本node中安装的module,需要重新安装一遍,可以使用--reinstall-packages-from
参数一键安装,比如nvm install 6.13.0 --reinstall-packages-from=5.11.0
就会把之前5.11.0中安装的module全部安装到6.13.0中.
安装之前node版本中的module
如果没有在安装新node时使用--reinstall-packages-from
参数,还可以在安装以后使用nvm reinstall-packages 5.11.0
把5.11.0中的module安装到6.13.0中.
切换node版本
切换回之前的版本:
$ nvm use 5.11.0
终端输出
Now using node v5.11.0 (npm v3.8.6)
再次查看node版本:
$ node -v
终端输出
v5.11.0
再次查看npm版本:
$ npm -v
终端输出
3.8.6
可见node从v6.13.0切换到了v5.11.0,与之对应的npm从3.10.10切换回了3.8.6.注意,此时再用npm全局安装modules时,会安装到新的node文件夹中.之前安装在/Users/chenxin/.nvm/versions/node/v6.13.0/lib/node_modules
中,此时就会安装在
/Users/chenxin/.nvm/versions/node/v5.11.0/lib/node_modules
中.
改变alias值
执行
$ nvm ls
终端输出
v0.8.14
-> v5.11.0
v6.13.0
default -> 5.11.0 (-> v5.11.0)
node -> stable (-> v6.13.0) (default)
stable -> 6.13 (-> v6.13.0) (default)
iojs -> N/A (default)
可以看到default、node、stable、iojs共4个别名.可以看到default,它是版本号5.11.0的别名.现在要改变它的值为6.13.0.注意:出现在行首的default和括号中的default不是同一个东西,括号中default指的是当前默认版本号.
使用以下命令更新alias值:
$ nvm alias default 6.13.0
终端输出
default -> 6.13.0 (-> v6.13.0)
使用alias切换node版本:
$ nvm use default
终端输出
Now using node v6.13.0 (npm v3.10.10)
删除alias
执行删除alias命令:
$ nvm unalias default
终端输出
`Deleted alias default - restore it with nvm alias default 6.13.0
`
提示可以使用nvm alias default 6.13.0
恢复这个alias,实际就是新建一个alias.
查看是否删除:
$ nvm ls
终端输出
v0.8.14
v5.11.0
-> v6.13.0
node -> stable (-> v6.13.0) (default)
stable -> 6.13 (-> v6.13.0) (default)
iojs -> N/A (default)
可见确实删除了.
# 后记
今天更新了node之后,使用hexo g
生成博客之后一直报错:
Error: Module version mismatch. Expected 48, got 47.
at Error (native)
at Object.Module._extensions..node (module.js:604:18)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/hexo-log/lib/log.js:3:14)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
{ Error: Cannot find module './build/default/DTraceProviderBindings'
at Function.Module._resolveFilename (module.js:476:15)
at Function.Module._load (module.js:424:25)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/hexo-log/lib/log.js:3:14)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19) code: 'MODULE_NOT_FOUND' }
{ Error: Cannot find module './build/Debug/DTraceProviderBindings'
at Function.Module._resolveFilename (module.js:476:15)
at Function.Module._load (module.js:424:25)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/chenxin/Workspaces/github/blog/node_modules/hexo-log/lib/log.js:3:14)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19) code: 'MODULE_NOT_FOUND' }
INFO Start processing
INFO Files loaded in 1.09 s
INFO Generated: sitemap.xml
......
经过查阅stackover的Module version mismatch. Expected 11, got 1,进入到hexo博客所在的根目录/Users/chenxin/Workspaces/github/blog
执行命令$ npm update
以后错误警告消失.这个命令没有加-g
参数,只会更新/Users/chenxin/Workspaces/github/blog/node_modules
这个本地node module而不会更新/Users/chenxin/.nvm/versions/node/v6.13.0/lib/node_modules
这个全局的node module.不懂npm全局安装和本地安装可以参考 NPM express模块本地安装和全局安装详解.不了解hexo博客可以参考Macbook下安装Hexo博客教程