NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:
* 允許用戶從NPM服務器下載別人編寫的三方包到本地使用。
* 允許用戶從NPM服務器下載并安裝別人編寫的命令行程序到本地使用。
* 允許用戶將自己編寫的包或命令行程序上傳到NPM服務器供別人使用。
可以看到,NPM建立了一個NodeJS生態圈,NodeJS開發者和用戶可以在里邊互通有無。以下分別介紹這三種場景下怎樣使用NPM。
## 下載三方包
需要使用三方包時,首先得知道有哪些包可用。雖然[npmjs.org](https://npmjs.org/)提供了個搜索框可以根據包名來搜索,但如果連想使用的三方包的名字都不確定的話,就請百度一下吧。知道了包名后,比如上邊例子中的`argv`,就可以在工程目錄下打開終端,使用以下命令來下載三方包。
~~~
$ npm install argv
...
argv@0.0.2 node_modules\argv
~~~
下載好之后,`argv`包就放在了工程目錄下的`node_modules`目錄中,因此在代碼中只需要通過`require('argv')`的方式就好,無需指定三方包路徑。
以上命令默認下載最新版三方包,如果想要下載指定版本的話,可以在包名后邊加上`@`,例如通過以下命令可下載0.0.1版的`argv`。
~~~
$ npm install argv@0.0.1
...
argv@0.0.1 node_modules\argv
~~~
如果使用到的三方包比較多,在終端下一個包一條命令地安裝未免太人肉了。因此NPM對`package.json`的字段做了擴展,允許在其中申明三方包依賴。因此,上邊例子中的`package.json`可以改寫如下:
~~~
{
"name": "node-echo",
"main": "./lib/echo.js",
"dependencies": {
"argv": "0.0.2"
}
}
~~~
這樣處理后,在工程目錄下就可以使用`npm install`命令批量安裝三方包了。更重要的是,當以后`node-echo`也上傳到了NPM服務器,別人下載這個包時,NPM會根據包中申明的三方包依賴自動下載進一步依賴的三方包。例如,使用`npm install node-echo`命令時,NPM會自動創建以下目錄結構。
~~~
- project/
- node_modules/
- node-echo/
- node_modules/
+ argv/
...
...
~~~
如此一來,用戶只需關心自己直接使用的三方包,不需要自己去解決所有包的依賴關系。
## 安裝命令行程序
從NPM服務上下載安裝一個命令行程序的方法與三方包類似。例如上例中的`node-echo`提供了命令行使用方式,只要`node-echo`自己配置好了相關的`package.json`字段,對于用戶而言,只需要使用以下命令安裝程序。
~~~
$ npm install node-echo -g
~~~
參數中的`-g`表示全局安裝,因此`node-echo`會默認安裝到以下位置,并且NPM會自動創建好Linux系統下需要的軟鏈文件或Windows系統下需要的`.cmd`文件。
~~~
- /usr/local/ # Linux系統下
- lib/node_modules/
+ node-echo/
...
- bin/
node-echo
...
...
- %APPDATA%\npm\ # Windows系統下
- node_modules\
+ node-echo\
...
node-echo.cmd
...
~~~
## 發布代碼
第一次使用NPM發布代碼前需要注冊一個賬號。終端下運行`npm adduser`,之后按照提示做即可。賬號搞定后,接著我們需要編輯`package.json`文件,加入NPM必需的字段。接著上邊`node-echo`的例子,`package.json`里必要的字段如下。
~~~
{
"name": "node-echo", # 包名,在NPM服務器上須要保持唯一
"version": "1.0.0", # 當前版本號
"dependencies": { # 三方包依賴,需要指定包名和版本號
"argv": "0.0.2"
},
"main": "./lib/echo.js", # 入口模塊位置
"bin" : {
"node-echo": "./bin/node-echo" # 命令行程序名和主模塊位置
}
}
~~~
之后,我們就可以在`package.json`所在目錄下運行`npm publish`發布代碼了。
## 版本號
使用NPM下載和發布代碼時都會接觸到版本號。NPM使用語義版本號來管理代碼,這里簡單介紹一下。
語義版本號分為`X.Y.Z`三位,分別代表主版本號、次版本號和補丁版本號。當代碼變更時,版本號按以下原則更新。
~~~
+ 如果只是修復bug,需要更新Z位。
+ 如果是新增了功能,但是向下兼容,需要更新Y位。
+ 如果有大變動,向下不兼容,需要更新X位。
~~~
版本號有了這個保證后,在申明三方包依賴時,除了可依賴于一個固定版本號外,還可依賴于某個范圍的版本號。例如`"argv": "0.0.x"`表示依賴于`0.0.x`系列的最新版`argv`。NPM支持的所有版本號范圍指定方式可以查看[官方文檔](https://npmjs.org/doc/files/package.json.html#dependencies)。
## 靈機一點
除了本章介紹的部分外,NPM還提供了很多功能,`package.json`里也有很多其它有用的字段。除了可以在[npmjs.org/doc/](https://npmjs.org/doc/)查看官方文檔外,這里再介紹一些NPM常用命令。
* NPM提供了很多命令,例如`install`和`publish`,使用`npm help`可查看所有命令。
* 使用`npm help `可查看某條命令的詳細幫助,例如`npm help install`。
* 在`package.json`所在目錄下使用`npm install . -g`可先在本地安裝當前命令行程序,可用于發布前的本地測試。
* 使用`npm update `可以把當前目錄下`node_modules`子目錄里邊的對應模塊更新至最新版本。
* 使用`npm update -g`可以把全局安裝的對應命令行程序更新至最新版。
* 使用`npm cache clear`可以清空NPM本地緩存,用于對付使用相同版本號發布新版本代碼的人。
* 使用`npm unpublish @`可以撤銷發布自己發布過的某個版本代碼。