npm的那些事

npm2和npm3安裝機(jī)制的差異

npm install后馁害,npm會(huì)依賴dependencies和devDependencies中指定的包來(lái)確定第一層依賴,執(zhí)行完畢后蹂匹,我們會(huì)看到 ./node_modules 這層目錄中包含有我們 package.json 文件中所有的依賴包碘菜。

  • npm 2 會(huì)根據(jù)第一層依賴的子依賴,遞歸安裝各個(gè)包到子依賴的 node_modules 中,直到子依賴不再依賴其他模塊炉媒。

層級(jí)結(jié)構(gòu)明顯;在知道自己所需包的名字和版本號(hào)時(shí)昆烁,可以復(fù)制粘貼相應(yīng)的文件到 node_modules 中吊骤,然后手動(dòng)更改 package.json 中的配置;刪除某個(gè)包時(shí)静尼,可直接刪除 package.json 中對(duì)應(yīng)的某一行白粉,然后刪除 node_modules 中的文件。
當(dāng)ABC三個(gè)包都依賴D時(shí)鼠渺,執(zhí)行npm install鸭巴,D會(huì)被下載三次,造成大量冗余

  • npm3 為了解決這種問(wèn)題拦盹,目錄改成了扁平狀的層級(jí)結(jié)構(gòu)鹃祖,盡量把依賴以及依賴的依賴平鋪在 node_modules 文件夾下共享使用

會(huì)遍歷所有節(jié)點(diǎn),將模塊都放在node_modules第一層普舆,當(dāng)重復(fù)時(shí)恬口,丟棄,如果遇到依賴版本不兼容時(shí)沼侣,采用npm2處理方式祖能,前面的放在 node_modules 目錄中,后面的放在依賴樹中蛾洛。

但在執(zhí)行 npm install 的時(shí)候养铸,按照 package.json 里依賴的順序依次解析,如果A轧膘,B钞螟,依賴 D(v 0.0.1),C 依賴 D(v 0.0.2)扶供,但c在在 A筛圆,B 的前邊.


package.json

npm 無(wú)法固定依賴的版本
在 npm 5.0 版本后,npm install 后都會(huì)自動(dòng)生成一個(gè) package-lock.json 文件 椿浓。如果package.json 和 package-lock.json 中的版本兼容太援,會(huì)根據(jù) package-lock.json 中的版本下載,如果不兼容扳碍,將會(huì)根據(jù) package.json 的版本提岔,更新 package-lock.json 中的版本。使 package-lock.json 中的版本兼容 package.json笋敞。

package-lock.json 文件的結(jié)構(gòu)

version:版本碱蒙,即包安裝在 node_modules 中的版本。
resolved:安裝來(lái)源。
integrity:對(duì)應(yīng)子依賴的依賴赛惩,與子依賴的 package.json 中 dependencies 的依賴項(xiàng)相同
dependencies:結(jié)構(gòu)和外層的 dependencies 結(jié)構(gòu)相同

并不是所有的子依賴都有 dependencies 屬性哀墓,只有子依賴的依賴和當(dāng)前已安裝在根目錄的 node_modules 中的依賴沖突之后,才會(huì)有這個(gè)屬性喷兼。

package-lock.json 可以提交到代碼庫(kù),當(dāng)想回溯到某一天的目錄狀態(tài)時(shí)篮绰,只需將package.json和package-lock.json這兩個(gè)文件回退到某一天就好

npm 會(huì)比較 node_modules 已有的包,和 package-lock.json 進(jìn)行比較季惯,如果重復(fù)的話吠各,就跳過(guò)安裝 ,從而優(yōu)化了安裝的過(guò)程勉抓。

依賴的區(qū)別與使用場(chǎng)景

dependencies

無(wú)論在開發(fā)環(huán)境還是生產(chǎn)環(huán)境都需使用的依賴贾漏,通過(guò) npm install XXX 下載的包都會(huì)默認(rèn)安裝在 dependencies 對(duì)象中,或者通過(guò)npm install XXX --save 下載

devDependencies

在開發(fā)環(huán)境使用的依賴藕筋,例如 eslint纵散,debug 等,通過(guò) npm install packageName --save-dev 下載

區(qū)別

在打包運(yùn)行時(shí)念逞,執(zhí)行npm install 時(shí)默認(rèn)會(huì)把所有依賴全部安裝困食,但使用 npm install --production 時(shí)就只會(huì)安裝 dependencies 中的依賴。
node項(xiàng)目可以采用這種服務(wù)運(yùn)行時(shí)安裝和打包翎承,減少包大小

optionalDependencies

可以選擇的依賴硕盹,當(dāng)某些依賴下載失敗或者沒有找到時(shí),項(xiàng)目依然可以正常運(yùn)行或者 npm 繼續(xù)運(yùn)行的時(shí)叨咖,可以把依賴放在optionalDependencies中瘩例,但optionalDependencies 會(huì)覆蓋 dependencies 中的同名依賴包

類似保護(hù)機(jī)制,如果包存在的話就走存在的邏輯甸各,不存在的就走不存在的邏輯垛贤。

peerDependencies

指定當(dāng)前的插件兼容的宿主必須要安裝的包的版本,例如:我們創(chuàng)建了項(xiàng)目趣倾,在此項(xiàng)目中我們要使用 ant-design@3.x 這個(gè)插件聘惦,此時(shí)我們的項(xiàng)目就必須先安裝 React >= 16.9.0 和 React-dom >= 16.9.0 的版本

回滾

git log
git revert 81720a380331ea14bfcb7d3eec7aff4ccd716376
或
git reset --hard 81720a380331ea14bfcb7d3eec7aff4ccd716376
git push -f
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市儒恋,隨后出現(xiàn)的幾起案子善绎,更是在濱河造成了極大的恐慌,老刑警劉巖诫尽,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禀酱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牧嫉,警方通過(guò)查閱死者的電腦和手機(jī)剂跟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門减途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人曹洽,你說(shuō)我怎么就攤上這事鳍置。” “怎么了送淆?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵墓捻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坊夫,道長(zhǎng),這世上最難降的妖魔是什么撤卢? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任褥实,我火速辦了婚禮繁调,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己忧饭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布乔外。 她就那樣靜靜地躺著凤粗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惕澎。 梳的紋絲不亂的頭發(fā)上莉测,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音唧喉,去河邊找鬼捣卤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛八孝,可吹牛的內(nèi)容都是我干的董朝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼干跛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼子姜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起楼入,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哥捕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浅辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扭弧,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年记舆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸽捻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖御蒲,靈堂內(nèi)的尸體忽然破棺而出衣赶,到底是詐尸還是另有隱情,我是刑警寧澤厚满,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布府瞄,位于F島的核電站,受9級(jí)特大地震影響碘箍,放射性物質(zhì)發(fā)生泄漏遵馆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一丰榴、第九天 我趴在偏房一處隱蔽的房頂上張望货邓。 院中可真熱鬧,春花似錦四濒、人聲如沸换况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戈二。三九已至,卻和暖如春喳资,著一層夾襖步出監(jiān)牢的瞬間觉吭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仆邓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亏栈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓宏赘,卻偏偏與公主長(zhǎng)得像绒北,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子察署,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354