npm(全稱 Node Package Manager,即“node包管理器”)是Node.js默認(rèn)的、以JavaScript編寫(xiě)的軟件包管理系統(tǒng)。
npm完全用JavaScript寫(xiě)成,最初由艾薩克·施呂特(Isaac Z. Schlueter)開(kāi)發(fā)。艾薩克表示自己意識(shí)到“模塊管理很糟糕”的問(wèn)題,并看到了PHP的PEAR與Perl的CPAN等軟件的缺點(diǎn),于是編寫(xiě)了npm。
2020年3月16 日,GitHub CEO Nat Friedman 宣布 GitHub 已簽署收購(gòu) NPM(npm 背后的公司)的協(xié)議,并表示 npm 加入 GitHub 后會(huì)繼續(xù)免費(fèi)提供公共軟件注冊(cè)中心服務(wù)。
npm會(huì)隨著Node.js自動(dòng)安裝。npm模塊倉(cāng)庫(kù)提供了一個(gè)名為“registry”的查詢服務(wù),用戶可通過(guò)本地的npm命令下載并安裝指定模塊。此外用戶也可以通過(guò)npm把自己設(shè)計(jì)的模塊分發(fā)到registry上面。
registry上面的模塊通常采用CommonJS格式,而且都包含一個(gè)JSON格式的元文件。截止到2016年7月,npm的registry上面已經(jīng)注冊(cè)了超過(guò)280,000個(gè)模塊。
npm的模塊以“先到先得”的原則注冊(cè),各模塊作者不會(huì)發(fā)生混亂。然而一旦有人撤回自己發(fā)布的模塊,那么不僅會(huì)使依賴那個(gè)模塊的項(xiàng)目出現(xiàn)問(wèn)題,還會(huì)帶來(lái)安全風(fēng)險(xiǎn)。例如有一個(gè)模塊叫做“l(fā)eft-pad”,其中只有一個(gè)字符串對(duì)齊的功能。但是,當(dāng)作者把它從registry里面移除之后,許多模塊便無(wú)法正確構(gòu)建。
npm的registry沒(méi)有審核機(jī)制,因此會(huì)存在一些低質(zhì)量、不安全甚至有害的模塊,不過(guò)npm服務(wù)器的管理員也可以刪除有害模塊并阻止不懷好意的用戶。
另外也有人為npm制作了統(tǒng)計(jì)功能,這樣可以讓開(kāi)發(fā)者了解各模塊的使用情況,幫助他們選擇合適的模塊。
NPM 使用
npm可以管理本地項(xiàng)目的所需模塊并自動(dòng)維護(hù)依賴情況,也可以管理全局安裝的JavaScript工具。
如果一個(gè)項(xiàng)目中存在package.json文件,那么用戶可以直接使用npm install命令自動(dòng)安裝和維護(hù)當(dāng)前項(xiàng)目所需的所有模塊。在package.json文件中,開(kāi)發(fā)者可以指定每個(gè)依賴項(xiàng)的版本范圍,這樣既可以保證模塊自動(dòng)更新,又不會(huì)因?yàn)樗枘K功能大幅變化導(dǎo)致項(xiàng)目出現(xiàn)問(wèn)題。開(kāi)發(fā)者也可以選擇將模塊固定在某個(gè)版本之上。
NPM 官網(wǎng)
NPM 英文官方網(wǎng)站:https://www.npmjs.com/