## npm常用指令
这一小节将介绍我们平时最常用到的几个指令。
[TOC]
### npm init
#### 命令
`$ npm init [-f|--force|-y|--yes]`
`npm init`用来初始化生成一个新的`package.json`文件。它会向用户提问一系列问题,如果你觉得不用修改默认配置,一路回车就可以了。
如果使用了`-f`(代表`force`)、`-y`(代表`yes`),则跳过提问阶段,直接生成一个新的`package.json`文件。
>Tips:
对package.json没有概念的朋友,请查阅[package.json的使用](313176)这一小节
* * * * *
### npm install
#### 命令
~~~
$ npm install (with no args, in package dir)
$ npm install [<@scope>/]<name>
$ npm install [<@scope>/]<name>@<tag>
$ npm install [<@scope>/]<name>@<version>
$ npm install [<@scope>/]<name>@<version range>
$ npm install <tarball file>
$ npm install <tarball url>
$ npm install <folder>
alias: npm i
common options: [-S|--save|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--dry-run]
~~~
>`npm install `这个命令官网的[API](https://docs.npmjs.com/cli/install)写了很多,这里只介绍常用的
* `$ npm install (在模块根目录下,不带参数)`<br/>
将模块的所有第三方依赖模块安装到根目录下的 node_modules 文件夹中,
* `$ npm install -g(在模块根目录下)`<br/>
将当前模块全局安装,这样,你就可以在未发布模块的情况下,在自己的电脑上全局使用当前模块(即在命令行,无论处于哪个目录下,都可以引用当前模块,就像你使用npm命令一样)
>Tips:
上面提到的两种安装方式,都会将package.json中,在dependencies和devDependencies这两个key下罗列的所有模块都进行安装,如果npm install这个命令后面加上参数 --production(或者将NODE_ENV这个环境变量设为 production),npm将只安装罗列在dependencies这个key下的模块
* `$ npm install <folder>`<br/>
安装指定路径下的模块,该路径的根目录下应该包含package.json文件。
* `$ npm install [<@scope>/]<name> [-S|--save|-D|--save-dev|-O|--save-optional]`<br/>
>Tips:
scope是模块的作用域 ,可选参数,一般只在发布私有模块的时候使用,绝大部分情况下,你用不到,这里可以先忽略。有兴趣可参考[npm
私有模块的使用](http://www.cnblogs.com/kelsen/p/4964574.html)
大多数场景下,我们会使用这个这个命令来安装最新发布在npm上的指定`<name>`的模块。
以sax模块为例:
`$ npm install sax`
这个命令就是从npm上拉取最新发布的sax模块,这个命令等价于
`$ npm install sax@latest`
本质上 ,执行的命令是:
* `$ npm install [<@scope>/]<name>@<tag> `
tag是在模块发布的时候给模块打的一个标签,其他开发者可以通过@不同的tag来安装打了相应tag的版本
* `npm install `命令根据安装环境的不同,有3个可选的参数可以加,这几个参数将在`package.json`中相应的`key`下面保存要安装的模块
* ` -S, --save`: 这个模块将作为`dependencies`的成员。
* ` -D, --save-dev`: 这个模块将作为`devDependencies`的成员。
* `-O, --save-optional`: 这个模块将作为`optionalDependencies`的成员
* ` $ npm install [<@scope>/]<name>@<version>`
`<version>`和`<tag>`类似,都是在开发者发布模块时打上的标签,其他开发者可以通过这个标签指定安装某一个版本的模块
* `$ npm install <tarball file>`
>Tips:
tarball是Linux下最方便的打包命令
安装当前文件系统中指定路径的文件
例子:
~~~
$ npm install ./package.tgz
~~~
* `$ npm install <tarball url>`
从指定的URL地址下载并安装模块
例子:
~~~
$ npm install https://github.com/indexzero/forever/tarball/v0.5.6
~~~
* * * * *
### npm uninstall
#### 命令
~~~
$ npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|-D|--save-dev|-O|--save-optional]
aliases: remove, rm, r, un, unlink
~~~
与`npm install `相反,不再赘述
* * * * *
### npm update
#### 命令
~~~
#升级当前项目的指定模块(在项目根目录下使用)
$ npm update [package name]
#升级全局安装的模块
$ npm update -g [package name]
~~~
`npm update`命令会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
使用-`S`或`--save`参数,可以在安装的时候更新`package.json`里面模块的版本号。
>注意,从npm v2.6.1 开始,npm update只更新顶层模块,而不更新依赖的模块,以前版本是递归更新的。如果想取到老版本的效果,要使用下面的命令:
>`$ npm --depth 9999 update`
* * * * *
### npm link
#### 命令
~~~
$ npm link (in package dir)
$ npm link [<@scope>/]<pkg>[@<version>]
alias: npm ln
~~~
我们假设这样一个场景,你刚开发完一个模块A(模块的名称暂定为aaa),你准备做发布前的最后测试。
一种实现的方式是:
1. cd到模块A的根目录下,执行 `npm install -g`,模块A就全局的安装到了你电脑上。
2. 切换一个新的目录,使用`npm init`构建一个新的工程B,这时,你就可以用IDE打开index.js,通过require('aaa')来使用模块A了。
上面的实现方式有一个问题,当你在测试过程中发现模块A有bug或接口不合理的地方,你需要在模块A的源码上做对应的修改,但是,这个改动只有重新执行`npm install -g`之后才会生效(模块A的修改无法实时的更新到全局)。这就稍显麻烦了,是否有办法让模块A的改动及时反馈的全局呢?有的!
我们来介绍满足这个需求的另外一种实现方式:
1. cd到模块A的根目录下,执行`npm link`,这时,在全局的npm模块仓库(node_modules)中,会创建一个指向模块A根目录的符号链接(symlink)
2. 切换到工程B,执行` npm link aaa`(Tip:aaa是模块A的名称,不是根目录的名称),这时,在工程B的根目录的node_modules文件夹下面会引入模块A。
使用`npm link`就能实现模块A的修改实时生效。
>Tips:
当你不再需要在工程里面使用“aaa”模块时,应该使用`npm unlink aaa` 删除符号链接
* * * * *
### npm login
登录npm账号,你只要在[npm官网](https://www.npmjs.com)注册一个账号,然后根据提示输入用户名和密码登录即可,只有登录了npm的账号才能发布npm模块。
* * * * *
### npm publish
#### 命令
~~~
$ npm publish [<tarball>|<folder>] [--tag <tag>] [--access <public|restricted>]
Publishes '.' if no argument supplied
Sets tag 'latest' if no --tag specified
~~~
`npm publish`用于发布你自己开发的模块。
最常用的场景是:
1. 使用`npm login`登录npm账号;
2. cd到要发布模块的根目录下(包含`package.json`的文件夹);
3. 执行`npm publish`。
这样,一个模块就发布到npm上去了,你可以登录[npm官网](https://www.npmjs.com)去查看你发布的模块。
> 上面提到的这种场景,会自动为你发布的模块打上两个标签,一个是版本号,由`package.json`文件的`version`字段决定,用于版本管理;另一个是`latest`标签,npm publish后面的可选参数 `--tag <tag>` 的默认值就是**`latest`**,`tag`可以理解为辨识度更高的版本标记。
Note:
如果你npm设置了其他镜像作为源地址,在版本发布的时候要先设置为官网的地址!
`$ npm config set registry=http://registry.npmjs.org`
* * * * *
### npm unpublish
#### 命令
~~~
$ npm unpublish [<@scope>/]<pkg>[@<version>]
~~~
当你发布的某一个版本的module有较大的问题,你就可以用 npm unpublish这个命令的删除之前发布的版本。
npm官网不建议使用该命令来取消某一个版本的发布,并且你只能在发布该版本的24小时之内取消发布,超过了这个24小时,你需要联系npm的技术支持( support@npmjs.com)来解决。