Node.js安装教程和NPM包管理器使用详解
2009年的JSCOnf大会上,一个叫Ryan Dahl的年轻程序员向人们展示了一个他正在做的项目,一个基于Google V8引擎的JavaScript运行平台,它提供了一套事件循环和低IO的应用程序编程接口(API)。和其他的服务端平台不同, JavaScript天生就是事件驱动IO,而这个项目又大大降低了编写事件驱动应用程序的复杂度,因此它很快就以不可思议的速度的成长流行起来,并应用到实际项目中。(Jack:这段翻译的不太靠谱,原文:This project was not like other server-side JavaScript platforms where all the I/O primitives were event-driven and there was no way around it.)
这个项目被命名为Node.js,开发人员习惯叫它Node,Node提供了一套纯事件驱动非堵塞的工具包,用来构建高并发应用程序。
注意:Node可以让你简单的构建快速可扩展的网络服务。
自从被Ryan Dahl介绍以后,Node受到了业界广泛的关注。他们已经开始用Node来部署快速并且可扩展的网络服务。Node实在太吸引人了。
一方面因为JavaScript,JavaScript是这个星球上应用最广泛的编程语言,大部分Web程序员都在浏览器端使用过JavaScript,服务器端是它一个很自然的扩展。
另一方面因为Node娇小可爱,Node的核心函数集很小,并且现有的API都非常精炼,为开发人员最小化了复杂度。当你想构建一些更加复杂的应用时,你只用挑选,安装一些你喜欢的第三方模块就可以了。
还有一个让Node如此吸引人的原因,它很容易上手,你可以在几分钟内完成下载安装,并运行起来.
通常按照官方网站(http://nodejs.org)上的步骤安装Node就可以了,它支持Windows,Linux,Macintosh以及Solaris。
在Windows上安装Node
Node从0.6.0版本开始支持Windows,要在Windows上安装Node,只用从Http://nodejs.org/#download下载node-v*.msi,然后双击运行即可,然后你可能会遇到类似图1-1的安全对话框。
http://nodejs.org/#download下载node-v*.pkg,下载完以后双击运行,你会看到安装向导的第一个对话框,见图1-5
http://nodejs.org找到对应的tar包,然后复制下载链接,如果你使用的UNIX系统,你的系统可能已经安装了wget,这意味着你用一句shell命令就可以下载了:
这部分内容,包含一些安装,删除包的常用操作,知道这些足以让你开始管理你自己应用程序所依赖的第三方包了,虽然如此,你首先还是需要明白这些命令在“全局”和“本地”模式下的区别,以及他们是如何影响依赖关系和模块查找的。
NPM模块的全局和本地模式
NPM的操作主要有两种模式:全局和本地。这两种模式会影响包存放的目录结构,以及Node加载包时的顺序。
本地模式是NPM的默认操作模式,在这个模式下,NPM只工作在工作目录下,不会造成系统范围的修改,这个模式让你在某个Node程序下尽情地安装,测试模块,而不会影响你电脑上的其他Node程序。
全局模式适合那些将被很多程序使用,而且总是被全局加载的公共模块,比如命令行工具这些公不会被应用程序直接使用的模块。
如果你不知道一个模块该用哪个模式安装,那就应该使用本地模式。如果一个模块的作者需要某个模块被全局的安装,通常他会在安装说明里指出。
全局模式
如果你安装Node时使用的默认目录,在全局模式下面,NPM会把包安装到/usr/local/lib/node_modules。如果你执行下面的命令,NPM会搜索并下载名为sax的最新版并安装到/usr/local/lib/node_modules/sax目录下。
注意:如果你当前shell用户没有足够的权限,你需要使用root用户登录或者使用sudo来执行命令:
$ sudo npm install –g sax
随后在你的Node脚本里需要sax模块的时候,使用下面的语句来加载:
var sax = require(‘sax');
如果你没有在应用程序目录下用本地模式安装过sax,Node将会在前面的安装目录里查找名为sax的模块,否则会优先加载本地版本。
默认模式是本地模式,因此你需要在NPM命令后加上-g标记来启用全局模式。
本地模式
本地模式是Node包依赖机制的默认推荐模式,这个模式下,NPM安装的所有东西都在当前工作目录(根目录也不例外),而不会影响任何全局的设置。这种机制可以让你一个个的设置应用程序的依赖模块以及它们的版本,而不用担心会污染全局的模块空间。这意味着你可以有依赖同一个模块不同版本的两个应用,它们却不会产生冲突。
在这个模式下,NPM使用当前工作目录下的node_modules目录来存放模块,比如你当前工作目录是/home/user/apps/my_app,NPM将会用/home/user/apps/my_app/node_modules来存放所有本地模块。这意味着,如果你在代码里使用模块名来引用模块,Node首先会到这个本地的node_modules目录下查找,如果没找到才会去搜索全局的node_modules目录,本地模块优先级总是高于全局模块。
安装模块
使用下面命令来安装一个模块的最新版本:
$ npm install <package name>
例如,下载和安装名一个名为sax的模块的最新版本,你首先需要把你应用程序的根目录设置为当前目录,然后输入:
$ npm install sax
这个操作,会在当前目录下建立node_modules子目录(如果不存在的话),然后在下面安装sax模块。
你也可以通过下面的命令,来选择安装某个特定的版本:
$ npm install <package name>@<version spec>
使用指定的版本号替换命令里的占位符即可,比如,要下载sax模块的0.2.5版本,你只用运行:
$ npm install sax@0.2.5
占位符也可以用一个版本范围来替换,比如,要安装sax模块0.2分支的最新版,可以运行:
$ npm <a href="http://www.trevorturnbull.com/" rel="external nofollow" >Viagra Canada Online</a> install sax@0.2.x
或者,安装版本号小于0.3的最新版:
$ npm install sax@”<0.3”
甚至可以指定一个版本范围:
$ npm install sax@">=0.1.0 <0.3.1"
卸载模块
使用下面命令可以卸载一个本地模块:
$ npm uninstall <package name>
如果要卸载的是一个全局模块,加上-g标记即可:
$ npm uninstall -g <package name>
更新模块
使用下面命令来更新本地模块:
$ npm update <package name>
这个命令会尝试获取最新版的模块包并更新本地版本,如果本地没有安装,则会安装它,如果需要更新的是全局环境,需要加上-g标记:
$ npm update –g <package name>
使用可执行文件
模块可以包含一个或多个可执行文件,如果你使用默认目录设置来安装一个全局模块,NPM会把可执行文件安装到/usr/local/bin目录下,这个目录通常也被设置为系统PATH环境变量的一部分。如果你局部安装这个模块,NPM会把所有可执行文件放到./node_modules/.bin目录下。
处理依赖关系
NPM不仅安装你需要的模块包,而且会安装这些模块所依赖的其它模块,比如,如果你需要安装模块A,而A又依赖模块B和C,那么在你安装A的时候B和C同时会被安装到./node_modules/A/node_modules目录下。
例如,你用下面的命令本地安装了一个叫nano的模块:
$npm install nano
NPM的输出会类似这样:
这告诉你nano模块依赖underscore和request两个模块,并且还指出了安装的版本。如果你现在去查看./node_modules/nano/node_modules目录,你会发现这两个模块已经被安装了:
$ ls node_modules/nano/node_modules
request underscore
使用package.json文件定义依赖关系
当开始编写一个应用程序时,可以在应用程序根目录创建一个package.json文件来定义应用程序的元数据,比如应用的名字,作者,代码库地址,联系方式等等。程序依赖的外部模块也在这个文件里指定。
如果不打算把程序发布到NPM上,就可以不用建这个文件,不过即使你的程序是私有的,这个文件其实也有用,它可以告诉NPM这个应用程序的依赖关系。(译者注:比如你把项目源码从开发环境复制到生产环境,可以通过调用npm install来一次性安装所有依赖包,npm会通过package.json内指定的依赖关系来自动完成依赖模块的下载安装,不用自己一个个去操作,稍候有详细介绍)
package.json是一个JSON格式的文件,包含了一系列属性,但是如果仅仅是为了说明程序的依赖关系,则只用一个dependencies属性就行。比如,一个叫MyApp的应用程序依赖sax,nano和request模块,只需要建立这样一个package.json:
{
"name" : "MyApp",
"version" : "1.0.0",
"dependencies" : {
"sax" : "0.3.x",
"nano" : "*",
"request" : ">0.2.0"
}
}
你指定了MyApp应用,依赖0.3版本的sax,任意版本的nano,以及版本高于0.2.0的request模块。
注意:你可能发现,如果你指定了name和version字段,NPM会不工作,这只会发生在旧版本的NPM,因为最初NPM是针对公共模块使用的,而不是私有程序。
然后,在应用程序的根目录,执行:
$ npm install
这样,NPM就会分析依赖关系以及你本地的node_modules目录,并自动的下载和安装缺失的模块。
你也可以通过下面的命令把所有本地模块更新到符合你定义的依赖项设置的最新版本:
$npm update
事实上,你仅用update方法就行了,因为它会让NPM自动获取那些缺失的依赖模块。
小结
本章学习了如何安装Node和Node包管理器(NPM),现在你可以使用NPM来安装,卸载,删除任何第三方模块,还学习了如何配合package.json文件来使用NPM管理应用程序依赖项。
现在你安装了Node和NPM,可以去动手试试啦,不过,首先你需要知道一些关于Node和事件驱动的相关知识,下章将会介绍这些内容。