npm使用记录

如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……。当然还有Node.js的npm。

npm本来是Node.js的包管理工具,但随着JS这几年的蓬勃发展,现在的npm已经成了几乎所有跟JS相关的工具和软件包的管理工具了,并且还在不断发展完善中。

要安装npm,直接安装完Nodejs就自带有npm了。 但是npm更新比较快,所以安装完Nodejs后,直接更新npm到最新版:

1
$ sudo npm install npm@latest -g

在本文撰写之时(2016年4月11日)官方最新版是3.8.6

1
2
$ npm -v
3.8.6

关于NPM

npm可以说是Node获得成功的重要原因之一。所以每个写JS的人都应该要懂npm。

package.json

package.json文件描述了一个NPM包的所有相关信息,包括作者、简介、包依赖、构建等信息。格式必须是严格的JSON格式。

通常我们在创建一个NPM程序时,可以使用npm init命令,通过交互式的命令,自动生成一个package.json文件,里面包含了常用的一些字段信息,但远不止这么简单。通过完善package.json文件,我们可以让npm命令更好地为我们服务。

一般我们都在项目下生成一个package.json文件,用来管理npm的包依赖。

使用以下命令来生成package.json文件:

1
2
$ npm init
$ npm init -y

该文件里边的内容就不细说了,可以自行去搜索。这里只记录下包版本的规则说明:

  • version 完全匹配
  • >version 大于这个版本
  • >=version 大于或等于这个版本
  • <version
  • <=version
  • ~version 非常接近这个版本
  • ^version 与当前版本兼容
  • 1.2.x X代表任意数字,因此1.2.1, 1.2.3等都可以
  • http://... Unix系统下使用的tarball的URL。
  • * 任何版本都可以
  • "" 任何版本都可以
  • version1 - version2 等价于 >=version1 <=version2.
  • range1 || range2 满足任意一个即可
  • git... Git地址
  • user/repo

安装模块

npm install命令用来安装模块到node_modules目录。

1
2
3
4
5
$ npm install jquery
$ npm install jquery -f # 强制重新安装
$ npm install jquery --save
$ npm install jquery --save-dev
$ npm install jquery -g

更新已安装模块,就要用到npm update命令。

1
$ npm update jquery

查看模块的信息:

1
$ npm view crypto-js

缓存目录

npm installnpm update命令,从registry下载压缩包之后,都存放在本地的缓存目录。

这个缓存目录,在 Linux 或 Mac 默认是用户主目录下的.npm目录,在 Windows 默认是%AppData%/npm-cache。通过配置命令,可以查看这个目录的具体位置。

1
2
$ npm config get cache
/home/lixiang/.npm

在缓存目录你会看到里面存放着大量的模块,储存结构是{cache}/{name}/{version}

清空缓存目录,可以:

1
2
3
$ rm -rf ~/.npm/*
# 或者
$ npm cache clean

安装过程

总结一下,Node模块的安装过程是这样的。

  1. 发出npm install命令
  2. npm 向 registry 查询模块压缩包的网址
  3. 下载压缩包,存放在~/.npm目录
  4. 解压压缩包到当前项目的node_modules目录

注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。

但是,运行npm install的时候,只会检查node_modules目录,而不会检查~/.npm目录。也就是说,如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm 依然会从远程仓库下载一次新的压缩包。

为了解决这些问题,npm 提供了一个--cache-min参数,用于从缓存目录安装模块。

--cache-min参数指定一个时间(单位为分钟),只有超过这个时间的模块,才会从 registry 下载。

1
2
$ npm install --cache-min 9999999 <package-name>
$ npm install --cache-min Infinity <package-name>

模块关系

通过以下的图可以清晰地看到npm安装的模块的依赖关系。

A/B/C/D/E各个模块根据依赖关系,放到各自的目录下。

具体的依赖关系参考官网: https://docs.npmjs.com/how-npm-works/npm3-nondet

命令总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ npm help install
$ npm config list
$ npm config ls -l
$ npm config get prefix
$ npm config set prefix=$HOME/.node_modules_global
$ npm uninstall underscore
$ npm install underscore@1.8.2
$ npm update underscore
$ npm search mkdir
$ npm view mkdir
$ npm install jquery -g
$ npm install jquery --save
$ npm install jquery --save-dev
$ npm init
$ npm install
$ npm dedupe # 重新计算依赖关系,然后将包结构整理得更合理。

文章目录
  1. 1. 关于NPM
    1. 1.1. package.json
    2. 1.2. 安装模块
    3. 1.3. 缓存目录
    4. 1.4. 安装过程
    5. 1.5. 模块关系
  2. 2. 命令总结
,