How to install Node.js, npm and modules
1.Download git
git for windows
http://code.google.com/p/msysgit/
2.Download node.js
https://github.com/joyent/node
or
cmd>git clone -recursive git://github.com/joyent/node.git
3.build node.js
cmd>vcbuild.bat release
4.copy release\node.exe to c:\node
5.Get npm and install
cmd>git clone --recursive git://github.com/isaacs/npm.git
cmd>cd npm
cmd>node cli.js install npm -gf
6.Install node.js modules
cmd>npm install websocket-server
cmd>npm install coffee-script
7.List all installed modules
cmd>npm ls
c:\node
├─┬ npm@1.0.106
│ ├── abbrev@1.0.3
│ ├── graceful-fs@1.0.1
│ ├── ini@1.0.1
│ ├─┬ minimatch@0.0.4
│ │ └── lru-cache@1.0.4
│ ├── node-uuid@1.2.0
│ ├── nopt@1.0.10
│ ├── proto-list@1.0.0
│ ├── request@2.1.1
│ ├── rimraf@1.0.8
│ ├── semver@1.0.11
│ ├── slide@1.1.3
│ └── which@1.0.2
npm install MODULE_NAME方法安装时,npm会根据这个module根目录下的package.json文件描述的dependency自动把这个module依赖的所有module下载下来放到本module自己的node_modules目录下。这样会有一个问题,就是产生的很多重复的module,例如connect和express都依赖qs,mime包,这些包在connect和express的node_modules目录都会存在。这样做的好处是可以依赖不同的版本,例如,以后qs的某个版本做了重大升级,和以前不兼容了,connect和express仍然可以继续在自己私有的node_modules目录放置旧版本的qs模块。
但是在公司的电脑里,由于设置了代理和防火墙,git, npm install 执行都会失败,无法从github或npmjs.org取到任何数据。如果遇到这样情况,可以从npmjs.org下载tar包,在调用npm install XX.tar进行安装。
但是这种安装方法需要注意module包的dependency问题,被依赖的module就不会自动下载到module自己的node_modules目录了,我的做法是先npm install这些依赖的module,使这些被依赖的module和你要安装的module处于同一级别的node_modules下,再安装你的module时就不会有问题了。还是以express和connect为例:
从http://search.npmjs.org可以查询到模块的依赖关系,connect依赖qs,mime,formidable,而express依赖connect,mime,qs,mkdirp。依次下载qs,mime,formidable,mkdirp的tar包安装,最后下载connect,express的tar包安装。在安装express时仍然提示错误:
npm http GET https://registry.npmjs.org/mkdirp/0.0.7
npm ERR! error installing express@2.5.2
原来express依赖的是mkdirp0.07版,需要从npmjs.org下载对应版本的mkdirp的tar包先安装。每个module依赖的其它module的版本号也可以从这个module的package.json中查到。
这里对node使用时查找module的方法进行一个简要的说明:
在使用requeire(XXX)时,有三种方式:
1.相对路径,例如require('../_util')
2.绝对路径,例如require('/util'),这种尽量不要使用
3.外部module,例如:require('events')
前两种很好理解,通过文件系统查找,
第三种,events是外部的module,并不是当前目录下的某个文件。node把module都是存放在node_modules目录下的,可以有很多级别的node_modules目录,每个module都可以有自己的node_modules目录用于存放自己依赖的module,node会查找node_modules目录是否存在,如果不存在继续向上一次目录查找,直到根目录。如果找到了,就在这个目录下找需要的模块是否存在,这里就会查找events.js是否存在。一个文件就可以是一个module,但是对于复杂的module都会是一批文件,放入一个文件夹中(大部分module都是这种类型的),由package.json对这个module进行描述,包括版本,依赖,main模块等信息。这里就会找到events目录,然后根据package.json的描述找到主模块。