npm
(全称 Node Package Manager,即“node包管理器”)是Node.js
默认的、以JavaScript编写的软件包管理系统
npm
完全用JavaScript
写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕
”的问题,并看到了PHP
的PEAR
与Perl
的CPAN
等软件的缺点,于是编写了npm
。
npm
会随着Node.js
自动安装。npm
模块仓库提供了一个名为“registry
”的查询服务,用户可通过本地的npm
命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry
上面。
registry
上面的模块通常采用CommonJS
格式,而且都包含一个JSON格式的元文件。
npm 由三个独立的部分组成:
- 网站:是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径
- 注册表(registry):是一个巨大的数据库,保存了每个包(package)的信息
- 命令行工具 (CLI):通过命令行或终端运行。开发者通过 CLI 与 npm 打交道
安装或更新 npm
新版的nodejs
已经集成了npm
,如果安装好nodejs
后npm
也就自动安装好了。
- 查看当前的版本:
npm -v
- 更新npm到最新版本:
npm install npm@latest -g
- 更新到下一个将发布的版本:
npm install npm@next -g
初始化项目(创建node.js模块)
npm init [-f|--force|-y|--yes]
创建模块,package.json
文件是必不可少的。我们可以使用 NPM
生成 package.json
文件,生成的 package.json
文件包含了项目安装包的信息。
注意的是,npm init
命令后,npm
会询问你一系列问题,当你填入答案后才会正式结束初始化,如果不太想自定义一些关于项目的描述,可以直接敲 npm init --yes
或npm init -y
。
npm init
命令要输入的信息如下 (web)
为我本地文件夹名,可以忽略:
package name: (web)
:模块的名称version: (1.0.0)
:模块的版本description:
:模块的描述entry point: (index.js)
:模块的入口test command:
:项目启动时脚本命令git repository:
:如果有 Git 地址,可以将这个项目放到你的 Git 仓库里keywords
:关键词author
:作者license: (ISC)
:项目要发行的时候需要的证书
如上所述,我们输入或忽略(忽略就是什么都不填,直接回车)后命令行展示以下信息
About to write to D:\vue\web\package.json:
{
"name": "blog",
"version": "1.0.1",
"description": "这是我的博客",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this OK? (yes)
就这样,没错,输入yes
回车,然后在web文件夹里就生成了一个package.json
文件,基内容如下:
{
"name": "blog",
"version": "1.0.1",
"description": "这是我的博客",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
关于package.json
的更多内容,请查看 package.json 文件详解
如何安装本地包
npm install <package_name>
上述命令执行之后将会在当前的目录下创建一个 node_modules
的目录(如果不存在的话),然后将下载的包保存到这个目录下
有两种方式用来安装 npm 包:本地安装
和全局安装
。至于选择哪种方式来安装,取决于我们如何使用这个包。
npm install <package_name> -g
:安装一个本地包,如果加上-g选项则是安装全局包
- 如果你自己的模块依赖于某个包,并通过
Node.js
的require
加载,那么你应该选择本地安装,这种方式也是npm install
命令的默认行为。 - 如果你想将包作为一个命令行工具,(比如
grunt CLI
),那么你应该选择全局安装。
本地安装和全局安装区别
本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link
,同样在安装模块的时候,可以通过指定参数来修改package.json文件,如
$ npm install <package_name> --save
:会把安装的包写到dependencies
,表示的是正式环境的包
$ npm install <package_name> --save-dev
:会把安装的包写到devDependencies,表示的是测试环境的包
查看模块的新版本
npm outdated
如何卸载模块
我们可以使用以下命令来卸载 Node.js 模块。
$ npm uninstall express
卸载后,你可以到 /node_modules/
目录下查看包是否还存在,或者使用以下命令查看:
$ npm ls
npm uninstall
是卸载包的命令,不过很多人安装包的时候知道加--save
或者--save-dev
命令,而卸载的时候就会忘了加,如果这个包是确定不需要使用的,就可以直接加--save
或者--save-dev
从package.json中删掉它。卸载全局的包只需要加个-g
参数。
更新模块
我们可以使用以下命令更新模块:
$ npm update express
npm update
命令可以更新本地package.json里面列举的包,当然,更新也会遵循package.json里面包的版本规则;不过更新全局的包不是用的update,而是直接重新npm install -g
,如果是更新所有全局的包,直接用npm update -g
。
搜索模块
使用以下来搜索模块:
$ npm search express
模块版本号
使用NPM
下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。
语义版本号分为X.Y.Z三位,分别代表主版本号
、次版本号
和补丁版本号
。当代码变更时,版本号按以下原则更新。
- 如果只是修复bug,需要更新Z位。
- 如果是新增了功能,但是向下兼容,需要更新Y位。
- 如果有大变动,向下不兼容,需要更新X位。
- 版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。
使用淘宝 NPM 镜像
大家都知道国内直接使用 npm
的官方镜像是非常慢的,这里推荐使用淘宝 NPM
镜像。
淘宝 NPM
镜像是一个完整 npmjs.org
镜像,可以用此代替官方版本(只读),同步频率目前为 10分钟一次,以保证尽量与官方服务同步。
使用淘宝定制的 cnpm
(gzip 压缩支持) 命令行工具代替默认的 npm
:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
$ cnpm install [name]