
nodejs的出現(xiàn),可以算是前端里程碑式的一個事件,它讓前端攻城獅們擺脫了瀏覽器的束縛,踏上了一個更加寬廣的舞臺。前端的可能性,從此更加具有想象空間。
隨著一系列基于nodejs的應(yīng)用/工具的出現(xiàn),工作中與nodejs打交道的機會越來越多。無論在node應(yīng)用的開發(fā),還是使用中,包管理都扮演著一個很重要的作用。NPM(node package manager),作為node的包管理工具,極大地便利了我們的開發(fā)工作,很有必要了解一下。
NPM是什么
NPM(node package manager),通常稱為node包管理器。顧名思義,它的主要功能就是管理node包,包括:安裝、卸載、更新、查看、搜索、發(fā)布等。
npm的背后,是基于couchdb的一個數(shù)據(jù)庫,詳細(xì)記錄了每個包的信息,包括作者、版本、依賴、授權(quán)信息等。它的一個很重要的作用就是:將開發(fā)者從繁瑣的包管理工作(版本、依賴等)中解放出來,更加專注于功能的開發(fā)。
npm官網(wǎng):https://npmjs.org/
npm官方文檔:https://npmjs.org/doc/README.html
我們需要了解什么
npm的安裝、卸載、升級、配置
npm的使用:package的安裝、卸載、升級、查看、搜索、發(fā)布
npm包的安裝模式:本地 vs 全局
package.json:包描述信息
package版本:常見版本聲明形式
npm包安裝模式
在具體介紹npm包的管理之前,我們首先得來了解一下npm包的兩種安裝模式。
本地安裝 vs 全局安裝(重要)
node包的安裝分兩種:本地安裝、全局安裝。兩者的區(qū)別如下,后面會通過簡單例子說明
本地安裝:package會被下載到當(dāng)前所在目錄,也只能在當(dāng)前目錄下使用。
全局安裝:package會被下載到到特定的系統(tǒng)目錄下,安裝的package能夠在所有目錄下使用。
npm install pkg - 本地安裝
運行如下命令,就會在當(dāng)前目錄下安裝grunt-cli(grunt命令行工具)
npm install grunt-cli
安裝結(jié)束后,當(dāng)前目錄下回多出一個node_modules
目錄,grunt-cli就安裝在里面。同時注意控制臺輸出的信息:
[grunt-cli@0.1.9](mailto:grunt-cli@0.1.9) node_modules/grunt-cli
├── [resolve@0.3.1](mailto:resolve@0.3.1)
├── [nopt@1.0.10](mailto:nopt@1.0.10) ([abbrev@1.0.4](mailto:abbrev@1.0.4))
└── [findup-sync@0.1.2](mailto:findup-sync@0.1.2) ([lodash@1.0.1](mailto:lodash@1.0.1), [glob@3.1.21](mailto:glob@3.1.21))
簡單說明一下:
grunt-cli@0.1.9:當(dāng)前安裝的package為grunt-cli,版本為0.19
node_modules/grunt-cli:安裝目錄
resolve@0.3.1:依賴的包有resolve、nopt、findup-sync,它們各自的版本、依賴在后面的括號里列出來
npm install -g pkg- 全局安裝
上面已經(jīng)安裝了grunt-cli,然后你跑到其他目錄下面運行如下命令
grunt
果斷提示你grunt命令不存在,為什么呢?因為上面只是進行了本地安裝,grunt命令只能在對應(yīng)安裝目錄下使用。
-bash: grunt: command not found
如果為了使用grunt命令,每到一個目錄下都得重新安裝一次,那不抓狂才怪。腫么辦呢?
很簡單,采用全局安裝就行了,很簡單,加上參數(shù)-g
就可以了
npm install -g grunt-cli
于是,在所有目錄下都可以無壓力使用grunt命令了。這個時候,你會注意到控制臺輸入的信息有點不同。主要的區(qū)別在于安裝目錄,現(xiàn)在變成了
/usr/local/lib/node_modules/grunt-cli
,/usr/local/lib/node_modules/
也就是之前所說的全局安裝目錄啦。
[grunt-cli@0.1.9](mailto:grunt-cli@0.1.9) /usr/local/lib/node_modules/grunt-cli
├── [resolve@0.3.1](mailto:resolve@0.3.1)
├── [nopt@1.0.10](mailto:nopt@1.0.10) ([abbrev@1.0.4](mailto:abbrev@1.0.4))
└── [findup-sync@0.1.2](mailto:findup-sync@0.1.2) ([lodash@1.0.1](mailto:lodash@1.0.1), [glob@3.1.21](mailto:glob@3.1.21))
npm包管理
npm的包管理命令是使用頻率最高的,所以也是我們需要牢牢記住并熟練使用的。其實無非也就是幾個動作:安裝、卸載、更新、查看、搜索、發(fā)布等。
安裝最新版本的grunt-cli
npm install grunt-cli
安裝0.1.9版本的grunt-cli
npm install [grunt-cli@"0.1.9](mailto:grunt-cli@%220.1.9)"
通過package.json進行安裝
如果我們的項目依賴了很多package,一個一個地安裝那將是個體力活。我們可以將項目依賴的包都在package.json這個文件里聲明,然后一行命令搞定
npm install
其他package安裝命令
運行如下命令,列出所有npm install
可能的參數(shù)形式
npm install --help
輸出如下,有興趣的童鞋可以了解下
npm install <tarball file>
npm install <tarball url>
npm install <folder>
npm install <pkg>
npm install <pkg>@<tag>
npm install <pkg>@<version>
npm install <pkg>@<version range>
卸載grunt-cli
比如卸載grunt-cli
npm uninstall grunt-cli
卸載0.1.9版本的grunt-cli
npm uninstall [grunt-cli@"0.1.9](mailto:grunt-cli@%220.1.9)"
npm ls:查看安裝了哪些包
運行如下命令,就可以查看當(dāng)前目錄安裝了哪些package
npm ls
輸出如下
/private/tmp/npm
└─┬ [grunt-cli@0.1.9](mailto:grunt-cli@0.1.9)
├─┬ [findup-sync@0.1.2](mailto:findup-sync@0.1.2)
│ ├─┬ [glob@3.1.21](mailto:glob@3.1.21)
│ │ ├── [graceful-fs@1.2.3](mailto:graceful-fs@1.2.3)
│ │ ├── [inherits@1.0.0](mailto:inherits@1.0.0)
│ │ └─┬ [minimatch@0.2.12](mailto:minimatch@0.2.12)
│ │ ├── [lru-cache@2.3.0](mailto:lru-cache@2.3.0)
│ │ └── [sigmund@1.0.0](mailto:sigmund@1.0.0)
│ └── [lodash@1.0.1](mailto:lodash@1.0.1)
├─┬ [nopt@1.0.10](mailto:nopt@1.0.10)
│ └── [abbrev@1.0.4](mailto:abbrev@1.0.4)
└── [resolve@0.3.1](mailto:resolve@0.3.1)
輸出如下,同樣,如果是要查看package的全局安裝信息,加上-g
就可以
npm ls pkg:查看特定package的信息
運行如下命令,輸出grunt-cli的信息
npm ls grunt-cli
輸出的信息比較有限,只有安裝目錄、版本,如下:
/private/tmp/npm
└── [grunt-cli@0.1.9](mailto:grunt-cli@0.1.9)
如果要查看更詳細(xì)信息,可以通過npm info pkg
,輸出的信息非常詳盡,包括作者、版本、依賴等。
npm info grunt-cli
npm update pkg:package更新
npm update grunt-cli
npm search pgk:搜索
輸入如下命令
npm search grunt-cli
返回結(jié)果如下
npm http GET [http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838](http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838)
npm http 200 [http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838](http://registry.npmjs.org/-/all/since?stale=update_after&startkey=1375519407838)
NAME DESCRIPTION AUTHOR DATE KEYWORDS
grunt-cli The grunt command line interface. =cowboy =tkellen 2013-07-27 02:24
grunt-cli-dev-exitprocess The grunt command line interface. =dnevnik 2013-03-11 16:19
grunt-client-compiler Grunt wrapper for client-compiler. =rubenv 2013-03-26 09:15 gruntplugin
grunt-clientside Generate clientside js code from CommonJS modules =jga 2012-11-07 01:20 gruntplugin
NPM發(fā)布
這個命令我自己也還沒實際用過,不誤導(dǎo)大家,語法如下,也可參考官方對于package發(fā)布的說明https://npmjs.org/doc/developers.html:
npm publish <tarball>
npm publish <folder>
NPM配置
npm的配置工作主要是通過npm config
命令,主要包含增、刪、改、查幾個步驟,下面就以最為常用的proxy配置為例。
設(shè)置proxy
內(nèi)網(wǎng)使用npm很頭痛的一個問題就是代理,假設(shè)我們的代理是 http://proxy.example.com:8080,那么命令如下:
npm config set proxy http://proxy.example.com:8080
由于npm config set
命令比較常用,于是可以如下簡寫
npm set proxy http://proxy.example.com:8080
查看proxy
設(shè)置完,我們查看下當(dāng)前代理設(shè)置
npm config get proxy
輸出如下:
http://proxy.example.com:8080/
同樣可如下簡寫:
npm get proxy
刪除proxy
代理不需要用到了,那刪了吧
npm delete proxy
查看所有配置
npm config list
直接修改配置文件
有時候覺得一條配置一條配置地修改有些麻煩,就直接進配置文件修改了
npm config edit
關(guān)于package.json
這貨在官網(wǎng)似乎沒有詳細(xì)的描述,其實就是包的描述信息啦。假設(shè)當(dāng)我們下載了node應(yīng)用,這個node應(yīng)用依賴于A、B、C三個包,如果沒有package.json,我們需要人肉安裝這個三個包(如果對版本有特定要求就更悲劇了):
npm install A
npm install B
npm install C
有了package.json,一行命令安裝所有依賴。
npm install
package.json字段簡介
字段相當(dāng)多,但最重要的的是下面幾個
name: package的名字(由于他會成為url的一部分,所以 non-url-safe 的字母不會通過,也不允許出現(xiàn)"."、"_"),最好先在http://registry.npmjs.org/上搜下你取的名字是否已經(jīng)存在
version: package的版本,當(dāng)package發(fā)生變化時,version也應(yīng)該跟著一起變化,同時,你聲明的版本需要通過semver的校驗(semver可自行谷歌)
dependencies: package的應(yīng)用依賴模塊,即別人要使用這個package,至少需要安裝哪些東東。應(yīng)用依賴模塊會安裝到當(dāng)前模塊的node_modules目錄下。
devDependencies:package的開發(fā)依賴模塊,即別人要在這個package上進行開發(fā)
其他:參見官網(wǎng)
package版本
在package.json里,你經(jīng)常會在包名后看到類似"~0.1.0"這樣的字符串,這就是包的版本啦。下面會列舉最常見的版本聲明形式,以及版本書寫的要求:
常見版本聲明形式
a、"~1.2.3"是神馬意思呢,看下面領(lǐng)悟
"~1.2.3" = ">=1.2.3 <1.3.0"
"~1.2" = ">=1.2.0 <1.3.0"
"~1" = ">=1.0.0 <1.1.0"
b、"1.x.x"是什么意思呢,繼續(xù)自行領(lǐng)悟
"1.2.x" = ">=1.2.0 <1.3.0"
"1.x.x" = ">=1.0.0 <2.0.0"
"1.2" = "1.2.x"
"1.x" = "1.x.x"
"1" = "1.x.x"
版本書寫要求
版本可以v開頭,比如 v1.0.1(v只是可選)
1.0.1-7,這里的7是所謂的“構(gòu)建版本號”,不理是神馬,反正版本大于1.0.1
1.0.1beta,或者1.0.1-beta,如果1.0.1后面不是 “連字符加數(shù)字” 這種形式,那么它是pre release 版本,即版本小于1.0.1
根據(jù)b、c,有:0.1.2-7 > 0.1.2-7-beta > 0.1.2-6 > 0.1.2 > 0.1.2beta
寫在后面
內(nèi)容只是簡單地把最常見的命令,以及一些需要了解的內(nèi)容列了出來。如要進一步了解,可參考官網(wǎng)說明。此外:
npm help
是我們最好的朋友,如果忘了有哪些命令,命令下有哪些參數(shù),可通過help進行查看。