npm在默认情况下会从http://npmjs.org搜索或下载包,
将包安装到当前目录的node_modules
子目录下。
如果你熟悉 Ruby 的 gem 或者 Python 的 pip,你会发现 npm 与它们的
行为不同,gem 或 pip 总是以全局模式安装,使包可以供所有的程序使用,
而 npm 默认会把包安装到当前目录下。这反映了 npm 不同的设计哲学。如
果把包安装到全局,可以提高程序的重复利用程度,避免同样的内容的多
份副本,但坏处是难以处理不同的版本依赖。如果把包安装到当前目录,
或者说本地,则不会有不同程序依赖不同版本的包的冲突问题,同时还减
轻了包作者的 API 兼容性压力,

但缺陷则是同一个包可能会被安装许多次。

在使用 npm 安装包的时候,
有两种模式:
本地模式和全局模式。
默认情况下我们使用 npm
即把包安装到当前目录的 node_modules 子目录下。
Node.js
install命令就是采用本地模式,
的 require 在加载模块时会尝试搜寻 node_modules 子目录,因此使用 npm 本地模式安装
的包可以直接被引用。
npm 还有另一种不同的安装模式被成为全局模式,使用方法为:
npm [install/i] -g [package_name]
与本地模式的不同之处就在于多了一个参数 -g。
我们在 介绍 supervisor那个小节中使用
了 npm install -g supervisor 命令,就是以全局模式安装 supervisor。
为什么要使用全局模式呢?多数时候并不是因为许多程序都有可能用到它,
为了减少多
重副本而使用全局模式,而是因为本地模式不会注册 PATH 环境变量。举例说明,我们安装
supervisor 是为了在命令行中运行它,譬如直接运行 supervisor script.js,这时就需要在 PATH
环境变量中注册 supervisor。npm 本地模式仅仅是把包安装到 node_modules 子目录下,其中
的 bin 目录没有包含在 PATH 环境变量中,不能直接在命令行中调用。而当我们使用全局模
式安装时,
npm 会将包安装到系统目录,
譬如 /usr/local/lib/node_modules/,
同时 package.json 文
件中 bin 字段包含的文件会被链接到 /usr/local/bin/。/usr/local/bin/ 是在PATH 环境变量中默认
定义的,因此就可以直接在命令行中运行 supervisor script.js命令了。
使用全局模式安装的包并不能直接在 JavaScript 文件中用 require 获
得,因为 require 不会搜索 /usr/local/lib/node_modules/。


总而言之,当我们要把某个包作为工程运行时的一部分时,通过本地模式获取,如果要
在命令行下使用,则使用全局模式安装。