npm 是 Node 的模块管理器,功能极其强大。它是 Node 获得成功的重要原因之一。
正因为有了npm,我们只要一行命令,就能安装别人写好的模块 。
$ npm install
本文介绍 npm 模块安装机制的细节,以及如何解决安装速度慢的问题。
从 npm install 说起
npm install 命令用来安装模块到node_modules目录。
$ npm install
安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f或--force参数。
$ npm install --force
npm update
如果想更新已安装模块,就要用到npm update命令。
$ npm update
它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
registry
npm update命令怎么知道每个模块的最新版本呢?
答案是 npm 模块仓库提供了一个查询服务,叫做 registry 。以 npmjs.org 为例,它的查询服务网址是 https://registry.npmjs.org/ 。
这个网址后面跟上模块名,就会得到一个 JSON 对象,里面是该模块所有版本的信息。比如,访问 https://registry.npmjs.org/react,就会看到 react 模块所有版本的信息。
它跟下面命令的效果是一样的。
$ npm view react# npm view 的别名$ npm info react$ npm show react$ npm v react
registry 网址的模块名后面,还可以跟上版本号或者标签,用来查询某个具体版本的信息。比如, 访问 https://registry.npmjs.org/react/v0.14.6 ,就可以看到 React 的 0.14.6 版。
返回的 JSON 对象里面,有一个dist.tarball属性,是该版本压缩包的网址。
dist: { shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a', tarball: 'http://registry.npmjs.org/react/-/react-0.14.6.tgz' },
到这个网址下载压缩包,在本地解压,就得到了模块的源码。npm install和npm update命令,都是通过这种方式安装模块的。
缓存目录
npm install或npm update命令,从 registry 下载压缩包之后,都存放在本地的缓存目录。
这个缓存目录,在 Linux 或 Mac 默认是用户主目录下的.npm目录,在 Windows 默认是%AppData%/npm-cache。通过配置命令,可以查看这个目录的具体位置。
$ npm config get cache$HOME/.npm
你最好浏览一下这个目录。
$ ls ~/.npm # 或者$ npm cache ls
你会看到里面存放着大量的模块,储存结构是{cache}/{name}/{version}。
$ npm cache ls react~/.npm/react/react/0.14.6/~/.npm/react/react/0.14.6/package.tgz~/.npm/react/react/0.14.6/package/~/.npm/react/react/0.14.6/package/package.json
每个模块的每个版本,都有一个自己的子目录,里面是代码的压缩包package.tgz文件,以及一个描述文件package/package.json。
除此之外,还会生成一个{cache}/{hostname}/{path}/.cache.json文件。比如,从 npm 官方仓库下载 react 模块的时候,就会生成registry.npmjs.org/react/.cache.json文件。
这个文件保存的是,所有版本的信息,以及该模块最近修改的时间和最新一次请求时服务器返回的 ETag 。
{ "time":{ "modified":"2016-01-06T23:52:45.571Z