## 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)来解决。