1.npm簡介
npm 是 2009 年開始的一個 javascript模塊管理工具,也是最流行的代碼共享平臺之一狡逢。2013 年 npm 的模塊總數(shù)是 4 萬迹辐,2014 年就升到 8 萬以上,超過所有其他同類平臺甚侣。今年 4 月npm官方發(fā)了一份統(tǒng)計明吩,截止 4 月全球估計有 4 百萬用戶使用 npm,并且這個數(shù)字每年會翻一倍殷费。NPM是隨同NodeJS一起安裝的包管理工具印荔,能解決NodeJS代碼部署上很多問題低葫,
常見的使用場景有以下幾種:
- 允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用。
- 允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用仍律。
- 允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用嘿悬。
2. npm 命令大全
2.1 簡單查詢
// 查看 npm 命令列表
$ npm help
//查看各個命令的簡單用法
$ npm -l
//查看當(dāng)前npm 的版本
$ npm -v
// 查看 npm 的配置
$ npm config list -l
// 以樹型結(jié)構(gòu)列出當(dāng)前項目安裝的所有模塊,以及它們依賴的模塊
$ npm ls
// 列出所有全局安裝的模塊
$ npm ls -g
// 全局和本地的依賴包的安裝路徑
$ npm root - g
$ npm root
// 查看全局或者本地的依賴包
$ npm list -g
$ npm list
// 查看依賴包的package.json 的信息水泉,也可以單獨查找某一個配置項
$ npm view <package name>
$ npm view <package name> dependencies //查看gulp包的依賴關(guān)系
$ npm view <package name> repository.url //查看gulp包的源文件地址
// 搜索遠(yuǎn)程資源庫中的依賴包善涨,當(dāng)在需要發(fā)布一個依賴包的時候,可以用這個命令草则。查找是否已有依賴包
$ npm search <package name>
// 查看某個包的信息
npm info <package name>
2.2 npm init 命令
簡單例子
npm init用來初始化生成一個新的package.json文件,package.json是基于nodejs項目必不可少的配置文件钢拧,它是存放在項目根目錄的普通json文件.它會引導(dǎo)用戶設(shè)置一系列配置,如果你覺得不用修改默認(rèn)配置炕横,一路回車就可以了源内。
[注意:json文件內(nèi)是不能寫注釋的,下面代碼的注釋是方便學(xué)習(xí)的筆記份殿,一個最簡單的例子)]
{
"name": "test", //項目名稱(必須)
"version": "1.0.0", //項目版本(必須)
"description": "This is for study npm project !", //項目描述(必須)
"homepage": "", //項目主頁
"repository": { //項目資源庫
"type": "git",
"url": "https://git.oschina.net/xxxx"
},
"author": { //項目作者信息
"name": "oysun",
"email": "web-oysun@qq.com"
},
"license": "ISC", //項目許可協(xié)議
"devDependencies": { //項目依賴的插件
"gulp": "^3.8.11",
"gulp-less": "^3.0.0"
}
}
Package.json 屬性說明
<strong>name</strong>
- 在package.json中最重要的就是name和version字段膜钓。他們都是必須的,如果沒有就無法install卿嘲。name和version一起組成的標(biāo)識在假設(shè)中是唯一的颂斜。改變包應(yīng)該同時改變version
- 這個名字可能會作為參數(shù)被傳入require(),所以它應(yīng)該比較短拾枣,但也要意義清晰
- name必須小于等于214個字節(jié)沃疮,包括前綴名稱在內(nèi)(如xxx/xxxmodule)
- name不能以”_”或”.”開頭
- 不能含有大寫字母
- name會成為url的一部分,不能含有url非法字符
- 創(chuàng)建一個模塊前可以先到后邊的網(wǎng)址查查name是否已經(jīng)被占用.https://www.npmjs.com/
<strong>version</strong>
- version必須可以被npm依賴的一個node-semver模塊解析.
<strong>description</strong>
- 一個描述放前,方便別人了解你的模塊作用忿磅,搜索的時候也有用
<strong>homepage</strong>
- 這個項目主頁url和url屬性不同,如果你填寫了url屬性凭语,npm注冊工具會認(rèn)為你把項目發(fā)布到其他地方了葱她,獲取模塊的時候不會從npm官方倉庫獲取,而是會重定向到url屬性配置的地址
<strong>keywords</strong>
- 一個字符串?dāng)?shù)組似扔,方便別人搜索到本模塊
<strong>author</strong>
- 包的作者姓名
<strong>bugs</strong>
- 你項目的提交問題的url和(或)郵件地址吨些。這對遇到問題的屌絲很有幫助。例子:
{
"url" :"http://github.com/owner/project/issues",
"email" : "project@hostname.com"
}
- 你可以指定一個或者指定兩個炒辉。如果你只想提供一個url豪墅,那就不用對象了,字符串就行黔寇。
如果提供了url偶器,它會被npm bugs命令使用。
<strong>license</strong>
- 指定一個許可證,讓人知道使用的權(quán)利和限制的屏轰。最簡單的方法是颊郎,假如你用一個像BSD或者M(jìn)IT這樣通用的許可證,就只需要指定一個許可證的名字霎苗,像這樣:{ “l(fā)icense” : “BSD” }如果你有更復(fù)雜的許可條件姆吭,或者想要提供給更多地細(xì)節(jié),可以這樣:
"licenses" :
[
{
"type" : "MyLicense",
"url" :"http://github.com/owner/project/path/to/license"
}
]
- 你可以在https://spdx.org/licenses/ 這個地址查閱協(xié)議列表
<strong>files</strong>
files是一個包含項目中的文件的數(shù)組唁盏。如果命名了一個文件夾内狸,那也會包含文件夾中的文件。(除非被其他條件忽略了)你也可以提供一個.npmignore文件厘擂,讓即使被包含在files字段中得文件被留下昆淡。其實就像.gitignore一樣。
main
-
main字段配置一個文件名指向模塊的入口程序驴党。如果你包的名字叫foo瘪撇,然后用戶require(“foo”)获茬,main配置的模塊的exports對象會被返回港庄。
這應(yīng)該是一個相對于根目錄的文件路徑。對大對數(shù)模塊而言恕曲,這個屬性更多的是讓模塊有一個主入口文件鹏氧,然而很多模塊并不寫這個屬性bin
- 很多包都有一個或多個可執(zhí)行的文件希望被放到PATH中。npm讓媽媽再也不用擔(dān)心了(實際上npm本身也是通過bin屬性安裝為一個可執(zhí)行命令的)佩谣。要用這個功能把还,給package.json中的bin字段一個命令名到文件位置的map。初始化的時候npm會將他鏈接到prefix/bin(全局初始化)或者./node_modules/.bin/(本地初始化)茸俭。
比如吊履,npm有:
``` bash { "bin" : { "npm" : "./cli.js" } } ``` * 所以,當(dāng)你初始化npm调鬓,它會創(chuàng)建一個符號鏈接到cli.js腳本到/usr/local/bin/npm艇炎。如果你只有一個可執(zhí)行文件,并且名字和包名一樣腾窝。那么你可以只用一個字符串缀踪,比如: ```bash { "name": "my-program", "version": "1.2.5", "bin": "./path/to/program" } ``` * 結(jié)果和這個一樣: ```bash { "name": "my-program", "version": "1.2.5", "bin" : { "my-program" : "./path/to/program" } } ```
- 很多包都有一個或多個可執(zhí)行的文件希望被放到PATH中。npm讓媽媽再也不用擔(dān)心了(實際上npm本身也是通過bin屬性安裝為一個可執(zhí)行命令的)佩谣。要用這個功能把还,給package.json中的bin字段一個命令名到文件位置的map。初始化的時候npm會將他鏈接到prefix/bin(全局初始化)或者./node_modules/.bin/(本地初始化)茸俭。
<strong>man</strong>
- 指定一個單一的文件或者一個文件數(shù)組供man程序使用。如果只提供一個單一的文件虹脯,那么它初始化后就是man的結(jié)果驴娃,而不管實際的文件名是神馬,比如:
{
"name" : "foo",
"version" : "1.2.3",
"description" : "A packaged foo fooer for fooing foos",
"main" : "foo.js",
"man" : "./man/doc.1"
}
- 這樣man foo就可以用到./man/doc.1文件了循集。如果文件名不是以包開頭唇敞,那么它會被冠以前綴,下面的:
{
"name" : "foo",
"version" : "1.2.3",
"description" : "A packaged foo fooer for fooing foos",
"main" : "foo.js",
"man" : [ "./man/foo.1", "./man/bar.1" ]
}
- 會為man foo和man foo-bar創(chuàng)建文件。man文件需要以數(shù)字結(jié)束疆柔,然后可選地壓縮后以.gz為后綴蕉世。The number dictates which man section the file is installed into.
{
"name" : "foo",
"version" : "1.2.3",
"description" : "A packaged foo fooer for fooing foos",
"main" : "foo.js",
"man" : [ "./man/foo.1", "./man/foo.2" ]
}
- 會為man foo和man 2 foo創(chuàng)建。
<strong>directories</strong>
- CommonJS Packages規(guī)范說明了幾種方式讓你可以用directorieshash標(biāo)示出包得結(jié)構(gòu)婆硬。如果看一下npm’s package.json狠轻,你會看到有directories標(biāo)示出doc, lib, and man。
在未來彬犯,這個信息可能會被用到向楼。
<strong>repository</strong>
- 指定你的代碼存放的地方。這個對希望貢獻(xiàn)的人有幫助谐区。如果git倉庫在github上湖蜕,那么npm docs命令能找到你。這樣做:
"repository" :
{
"type" : "git",
"url" : "http://github.com/isaacs/npm.git"
}
"repository" :
{
"type" : "svn",
"url" : "http://v8.googlecode.com/svn/trunk/"
}
<strong>scripts</strong>
- scripts屬性是一個對象宋列,里邊指定了項目的生命周期個各個環(huán)節(jié)需要執(zhí)行的命令昭抒。key是生命周期中的事件,value是要執(zhí)行的命令炼杖。具體的內(nèi)容有 install start stop 等灭返,詳見: https://docs.npmjs.com/misc/scripts
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build": "node build/build.js",
"lint": "eslint --ext .js,.vue src"
}
<strong>config</strong>
- 用來設(shè)置一些項目不怎么變化的項目配置,例如port等坤邪。用戶用的時候可以使用如下用法:
http.createServer(...).listen(process.env.npm_package_config_port)
- 可以通過npm config set foo:port 80來修改config熙含。
<strong>dependencies</strong>
- dependencies屬性是一個對象,配置模塊依賴的模塊列表艇纺,key是模塊名稱怎静,value是版本范圍,版本范圍是一個字符黔衡,可以被一個或多個空格分割蚓聘。dependencies也可以被指定為一個git地址或者一個壓縮包地址。不要把測試工具或transpilers寫到dependencies中盟劫。
<strong>devDependencies</strong>
- 如果有人想要下載并使用你的模塊夜牡,也許他們并不希望或需要下載一些你在開發(fā)過程中使用的額外的測試或者文檔框架。在這種情況下捞高,最好的方法是把這些依賴添加到devDependencies屬性的對象中氯材。這些模塊會在npm link或者npm install的時候被安裝,也可以像其他npm配置一樣被管理硝岗,詳見npm的config文檔氢哮。對于一些跨平臺的構(gòu)建任務(wù),例如把CoffeeScript編譯成JavaScript型檀,就可以通過在package.json的script屬性里邊配置prepublish腳本來完成這個任務(wù)冗尤,然后需要依賴的coffee-script模塊就寫在devDependencies屬性種。例如:
{
"name": "ethopia-waza",
"description": "a delightfully fruity coffee varietal",
"version": "1.2.3",
"devDependencies": {
"coffee-script": "~1.6.3"
},
"scripts": {
"prepublish": "coffee -o lib/ -c src/waza.coffee"
},
"main": "lib/waza.js"
}
2.3 包安裝命令
npm的包安裝分為本地安裝(local)、全局安裝(global)兩種裂七,從敲的命令行來看皆看,差別只是有沒有-g而已.
- 但是代碼中,直接通過require()的方式是沒有辦法調(diào)用全局安裝的包的背零。全局的安裝是供命令行使用的腰吟。
- 每個模塊可以“全局安裝”,也可以“本地安裝”徙瓶∶停“全局安裝”指的是將一個模塊安裝到系統(tǒng)目錄中,各個項目都可以調(diào)用侦镇。一般來說灵疮,全局安裝只適用于工具模塊,比如eslint和gulp壳繁≌鸬罚“本地安裝”指的是將一個模塊下載到當(dāng)前項目的node_modules子目錄,然后只有在項目目錄之中闹炉,才能調(diào)用這個模塊
// 本地安裝
$ npm install <package name>
// 全局安裝
$ npm install <package name> -global
$ npm install <package name> -g
// npm install也支持直接輸入Github代碼庫地址
$ npm install git://github.com/package/path.git
$ npm install git://github.com/package/path.git#0.1.0
// install命令總是安裝模塊的最新版本蒿赢,如果要安裝模塊的特定版本,可以在模塊名后面加上@和版本號剩胁。
$ npm install <package name>@latest
$ npm install <package name>@0.1.1
$ npm install <package name>@">=1.9.0 <3.1.0"
// 如果使用–save-exact參數(shù)诉植,會在package.json文件指定安裝模塊的確切版本
$ npm install <package name> --save-exact
$ npm install <package name> -E
// 安裝包信息將加入到dependencies(生產(chǎn)階段的依賴)
$ npm install <package name> --save
$ npm install <package name> -S
// 安裝包信息將加入到devDependencies(開發(fā)階段的依賴)祥国,所以開發(fā)階段一般使用它
$ npm install <package name> --save-dev
$ npm install <package name> -D
install命令可以使用不同參數(shù)昵观,指定所安裝的模塊屬于哪一種性質(zhì)的依賴關(guān)系,即出現(xiàn)在packages.json文件的哪一項中
–save:模塊名將被添加到dependencies舌稀,可以簡化為參數(shù)-S啊犬。
–save-dev: 模塊名將被添加到devDependencies,可以簡化為參數(shù)-D
一旦安裝了某個模塊壁查,就可以在代碼中用require命令加載這個模塊觉至。另外,模塊的依賴都被寫入了package.json文件后睡腿,他人打開項目的根目錄(項目開源语御、內(nèi)部團(tuán)隊合作),使用npm install命令可以根據(jù)dependencies配置安裝所有的依賴包
2.4 包移除席怪,更新插件命令
// 卸載已安裝的模塊
$ npm uninstall <package name>
// 檢查本地有哪些本地包,列出需要更新的包的信息应闯,需要更新的包的名稱、當(dāng)前版本號挂捻、最新的版本號等
$ npm outdated
// 更新本地安裝的某個模塊和全局模塊
$ npm update <package name>
$ npm update <package name> -g
// 全部更新
$ npm update
$ npm update -g
3. npm使用技巧
- 國內(nèi)訪問外網(wǎng)都很慢碉纺,甚至不能訪問!大家都懂,都很無奈骨田!
使用淘寶的npm國內(nèi)鏡像可以極大的提高包下載的速度
$ npm config set strict-ssl false //取消ssl驗證
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
- windows下無法直接刪除node_modules耿导,因為node_modules內(nèi)部嵌套的子目錄太多使用rimraf插件可以很好的解決問題
$ npm install rimraf -g
$ rimraf node_modules
- npm默認(rèn)將全局包和緩存文件放在C盤。如果想更改路勁可以這樣設(shè)置:
$ npm config set prefix "d:x\node"http://修改nodejs全局包的安裝路徑
$ npm config set cache "D:\nodejs\npm-cache" //修改緩存路徑
注意:由于改變了module的默認(rèn)地址态贤,所以上面的用戶變量都要跟著改變一下“用戶變量”PATH”修改為你重新設(shè)置的路徑舱呻,要不,使用module的時候會導(dǎo)致輸入命令出現(xiàn)“xxx不是內(nèi)部或外部命令悠汽,也不是可運行的程序或批處理文件”這個錯誤狮荔。