## 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)來解決。