玩轉(zhuǎn)npm

作者:TAT.云中飛揚
轉(zhuǎn)載自AlloyTeam:http://www.alloyteam.com/2016/03/master-npm/

npm本來是Node.js的包管理工具糕非,但隨著JS這幾年的蓬勃發(fā)展铸敏,現(xiàn)在的npm已經(jīng)成了幾乎所有跟JS相關(guān)的工具和軟件包的管理工具了,并且還在不斷發(fā)展完善中遵倦。

本文從筆者的經(jīng)驗仁连,總結(jié)了npm安裝/卸載、更新、發(fā)布這幾個最主要功能的正確使用姿勢和一些小技巧,順便從官網(wǎng)搬來了npm3處理依賴的重大變化袭艺。

npm3

npm團(tuán)隊已經(jīng)發(fā)布了npm3,近期有小伙伴吐槽npm3安裝軟件包的時候很慢叨粘,一開始筆者也感覺相比npm2慢了不少匹表,但經(jīng)過了幾個版本的迭代,速度似乎又快起來了宣鄙。

慢的同學(xué)是時候更新你的npm啦,而且之前安裝進(jìn)度條模糊成一坨的問題也已經(jīng)修復(fù)了默蚌。

npm v3.0安裝react的截圖

npm v3.8安裝react的截圖

npm提供了大量的命令冻晤,所有的命令幾乎都可以通過npm cmd [options]的方式使用。

npm -h

學(xué)習(xí)一個命令行工具绸吸,最簡單直接的方式就是查看它的用戶手冊鼻弧,npm提供了并不算很詳細(xì)的命令行手冊,可以通過npm -h查看(unix用戶還可以通過man npm查看锦茁,相對來說比windows詳細(xì)多了)攘轩,需要某個npm命令更詳細(xì)的文檔則需要通過npm help cmdnpm help install來查看,注意不是npm install help 码俩,這樣將會安裝help包度帮。

另外npm cmd -h也是一個快速查看命令可以怎么使用和搭配哪些常用選項的方法。

npm init

說到npm就不得不說package.json稿存,每一個npm包都必須有一個package.json文件笨篷,年輕時候的我還傻乎乎的從其他地方拷貝package.json過來然后修改,為了自動化還寫了個自動生成的腳本瓣履。

后來才發(fā)現(xiàn)原來npm自帶此功能率翅,官方原廠功能更好更強(qiáng)大,只需要執(zhí)行npm init即可袖迎,以交互方式完成package.json的創(chuàng)建冕臭。

如果想生成默認(rèn)package.json腺晾,可以執(zhí)行npm init -y,連交互式界面都不會出現(xiàn)辜贵。

另外需要注意悯蝉,npm init的時候需要輸入用戶字段,如果還沒有設(shè)置npm用戶念颈,需要通過npm addUser設(shè)置泉粉。

事實上,最小單位的npm包就是只包含一個package.json文件的包榴芳,這樣的話npm init就完成了一個npm包的創(chuàng)建嗡靡。

npm install/uninstall

npm install作為npm最重要的功能和最常用的功能,不用過多說明窟感,這里只介紹三個非常有用的選項–global讨彼,–save–save-dev柿祈。

想必讀者肯定知道–global可以簡寫成-g哈误,其實另外兩個選項也有簡寫形式,–save可以簡寫成-S躏嚎,–save-dev可以簡寫成-D蜜自,注意大寫。

另外npm install也可以簡寫成npm i卢佣,相應(yīng)的卸載命令npm uninstall可以簡寫成npm un重荠,事實上npm的很多命令和選項在設(shè)計上都非常類似unix上的命令行功能,這里指的是命令和選項都可以極大化地簡寫虚茶,只要在不混淆的情況下戈鲁。

npm uninstallnpm install接受同樣的選項和參數(shù)。

–save的作用是在packaje.json的dependencies字段增加或者修改一個安裝包和版本號名值對嘹叫,–save-dev則是修改devDependencies婆殿,這樣就不用安裝了某個包之后手動修改package.json,npm已經(jīng)幫我們把包依賴和版本管理做好了罩扇。

以安裝react為例婆芦,npm i react -S將為package.json增加。

"dependencies": {
  "react": "^0.14.7"
}

npm i react -D將增加

"devDependencies": {
  "react": "^0.14.7"
}

npm update

假如react@15(版本號暮蹂,下同)發(fā)布了寞缝,想嘗鮮的小伙伴該怎么更新呢?

首先得知道npm上是否已經(jīng)更新仰泻,npm info react可以查看到react在npm上發(fā)布過哪些版本以及最新的版本荆陆,但是內(nèi)容太多,讓人眼花繚亂集侯,配合grep會好一些被啼。

其實我們只想知道react最新的版本帜消,使用npm dist-tags ls react直接列出react發(fā)布過哪些tag,

> npm dist-tags ls react
0.10.0-rc1: 0.10.0-rc1
0.11.0-rc1: 0.11.0-rc1
latest: 0.14.7
next: 15.0.0-rc.1

以及這些tag目前最新是哪些版本浓体,比如最常用的latest泡挺,也是默認(rèn)tag。

next tag已經(jīng)發(fā)布了react@15的第一個rc版了命浴,嘗鮮的朋友可以試一試了娄猫。

另外一個命令npm outdated,會檢測當(dāng)前安裝的所有npm包是否有更新生闲,并列出可以更新的包媳溺,如果沒有任何輸出,那么恭喜你碍讯,所有的包都是不需要更新的悬蔽。

如果之前安裝的react版本是0.14.3,同時還安裝了redux@3.2.0捉兴,執(zhí)行npm outdated會輸出

Package  Current  Wanted  Latest  Location
react     0.14.3  0.14.7  0.14.7  example
redux      3.2.0   3.3.1   3.3.1  example

這種情況則說明react和redux該更新了蝎困,更新具體某個包使用npm update package_name即可,npm update則會更新所有可更新的包倍啥。

npm publish

npm作為一個大倉庫禾乘,每天都有大量的新包發(fā)布上來,發(fā)布自己的包非常容易虽缕,而且?guī)缀趿汩T檻盖袭,對應(yīng)的發(fā)布的命令是npm publish,但前提是你需要一個npm賬號彼宠。

假設(shè)已經(jīng)有賬號了,在發(fā)布之前需要使用npm login進(jìn)行登錄弟塞,正式發(fā)布之前請先閱讀以下關(guān)于版本號的介紹凭峡。

npm包的版本號一般都是x.y.z的形式。

其中:

  • x表示主版本號决记,通常有重大改變或者達(dá)到里程碑才改變摧冀;
  • y表示次要版本號,或二級版本號系宫,在保證主體功能基本不變的情況下索昂,如果適當(dāng)增加了新功能可以更新此版本號;
  • z表示尾版本號或者補丁號扩借,一些小范圍的修修補補就可以更新補丁號椒惨。

第一版本通常是0.0.1或者1.0.0,當(dāng)修改了代碼潮罪,需要更新版本號重新發(fā)布到npm康谆,不知道的小伙伴(年輕的我)肯定會手動修改package.json的version字段领斥,而高級的玩法是直接使用npm version <update_type>命令自動搞定。

詳細(xì)用法可通過npm help version查看沃暗,這里只介紹最常用的三種月洛。

npm version patch => z+1
npm version minor => y+1 && z=0
npm version major => x+1 && y=0 && z=0

三個選項分別對應(yīng)三部分的版本號,每次運行命令會導(dǎo)致相應(yīng)的版本號遞增一孽锥,同時子版本號清零嚼黔。

如果npm包同時又是一個git倉庫,在運行了npm version <update_type>npm publish之后惜辑,npm會自動給git倉庫打上一個跟當(dāng)前版本號一樣的tag唬涧,對于掛在github上的npm包很有用。

npm2 & npm3

上面介紹了npm包安裝/卸載韵丑、更新和發(fā)布爵卒,幾乎能滿足日常使用了,另外再搬點干貨過來撵彻。

npm3雖然慢钓株,但解決了windows上npm包目錄太深的問題,相信使用過npm1或者npm2的都知道陌僵,node_modules太多太深了轴合,甚至一不小心就超過windows資源管理器能處理的最長路徑長度了,聽起來有點拗口碗短,說白了這時候復(fù)制粘貼刪除就會報錯了受葛。

已經(jīng)使用過npm3的肯定會發(fā)現(xiàn),npm3將依賴模塊扁平化存放了偎谁,node_modules文件夾里面子文件夾增多了总滩,出現(xiàn)了很多沒有通過npm install安裝過的模塊。

npm3在安裝包的時候巡雨,由于每個包和包的依賴都會去計算是否需要再安裝闰渔,搜索起來確實變慢了,好在至少現(xiàn)在的npm3速度還是可以接受的铐望。

按照官方文檔介紹冈涧,npm3處理模塊依賴的方式跟npm2很不一樣。

以下是從官網(wǎng)搬的磚

npm的依賴

假如我們寫了個模塊App正蛙,需要安裝兩個包A@1C@1督弓,其中A@1依賴另一個包B@1C@1依賴B@2乒验,用npm2和npm3安裝之后的依賴圖分別是這樣的:

npm3按照安裝順序存放依賴模塊愚隧,先安裝A@1,發(fā)現(xiàn)依賴模塊B@1沒有安裝過也沒有其他版本的B模塊沖突锻全,所以B@1存放在第一級目錄奸攻,B@2為了避免和B@1的沖突蒜危,還是繼續(xù)放在C@1之下。

npm2沒什么好說的睹耐,來什么安裝什么辐赞,根本不用理會公共依賴關(guān)系,依賴模塊一層一層往下存放就是了硝训,下面重點講解npm3在這方面的改進(jìn)响委。

現(xiàn)在App又需要安裝一個包D@1D@1依賴B@2窖梁,使用npm3安裝之后赘风,包結(jié)構(gòu)將變成下面這樣:

雖然C@1D@1都依賴B@2,但是由于A@1先安裝纵刘,A@1依賴的B@1已經(jīng)安裝到第一級目錄了邀窃,后續(xù)需要安裝的所有包B,只要版本不是1假哎,都需要避免和B@1的沖突瞬捕,所以只能像npm2一樣,安裝在相應(yīng)包下面舵抹。

接著又安裝了一個E@1肪虎,依賴B@1,因為B@1已經(jīng)安裝過惧蛹,且不會有版本沖突扇救,這時候就不用重復(fù)安裝B@1了,包結(jié)構(gòu)會變成這樣 :

隨著App升級了香嗓,需要把A@1升級到A@2迅腔,而A@2依賴B@2,把E@1升級到E@2靠娱,E@2也依賴B@2钾挟,那么B@1將不會再被誰依賴,npm將卸載B@1饱岸,新的包結(jié)構(gòu)將變成這樣:

可以看到出現(xiàn)了冗余,結(jié)果跟預(yù)期的不一樣徽千,既然所有對B的依賴都是B@2苫费,那么只安裝一次就夠了。

npm dedupe

npm在安裝包的時候沒有這么“智能”双抽,不過npm dedupe命令做的事就是重新計算依賴關(guān)系百框,然后將包結(jié)構(gòu)整理得更合理。

執(zhí)行一遍npm dedupe將得到:

這才是最優(yōu)且符合預(yù)期的結(jié)構(gòu)牍汹,看來在每次安裝/卸載了包之后最好重新執(zhí)行npm dedupe铐维,以保證包結(jié)構(gòu)是最優(yōu)的柬泽。

npm3通過將依賴模塊扁平化安裝,避免了冗余又解決了windows上一大頭疼問題嫁蛇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锨并,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子睬棚,更是在濱河造成了極大的恐慌第煮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抑党,死亡現(xiàn)場離奇詭異包警,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)底靠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門害晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暑中,你說我怎么就攤上這事壹瘟。” “怎么了痒芝?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵俐筋,是天一觀的道長。 經(jīng)常有香客問我严衬,道長澄者,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任请琳,我火速辦了婚禮粱挡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俄精。我一直安慰自己询筏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布竖慧。 她就那樣靜靜地躺著嫌套,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圾旨。 梳的紋絲不亂的頭發(fā)上踱讨,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音砍的,去河邊找鬼痹筛。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帚稠。 我是一名探鬼主播谣旁,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滋早!你這毒婦竟也來了榄审?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤馆衔,失蹤者是張志新(化名)和其女友劉穎瘟判,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體角溃,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拷获,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了减细。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匆瓜。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖未蝌,靈堂內(nèi)的尸體忽然破棺而出驮吱,到底是詐尸還是另有隱情,我是刑警寧澤萧吠,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布左冬,位于F島的核電站,受9級特大地震影響纸型,放射性物質(zhì)發(fā)生泄漏拇砰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一狰腌、第九天 我趴在偏房一處隱蔽的房頂上張望除破。 院中可真熱鬧,春花似錦琼腔、人聲如沸瑰枫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽光坝。三九已至,卻和暖如春甥材,著一層夾襖步出監(jiān)牢的瞬間盯另,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工擂达, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓板鬓,卻偏偏與公主長得像悲敷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俭令,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容