為什么您可能想要使用不止一個(gè)Node軟件包管理器?
譯文譯者 | 布加迪
審校 | 孫淑娟?
Node最好的特性之一是軟件包管理器。有許多不同的方法來安裝和管理Node軟件包,本文介紹使用一個(gè)或多個(gè)軟件包管理器各自的優(yōu)缺點(diǎn),以及結(jié)合使用軟件包管理器的幾個(gè)最佳方法。?
軟件包管理器簡(jiǎn)介
在軟件開發(fā)領(lǐng)域,依賴項(xiàng)是運(yùn)行項(xiàng)目所必需的,它們如同食譜配料一樣不可或缺。
假設(shè)您在編寫一個(gè)使用JavaScript的應(yīng)用程序,它想要訪問來自jQuery庫(kù)(許多網(wǎng)站曾經(jīng)使用jQuery庫(kù))的一些函數(shù),那么jQuery將是您的依賴項(xiàng)之一。您需要安裝jQuery,這樣有人訪問您的網(wǎng)站時(shí),可以看到您用它創(chuàng)建的那些很酷的動(dòng)畫或交互元素!
軟件包管理器通過為我們管理依賴項(xiàng)來幫助管理這些項(xiàng)目之間的關(guān)系,所以每當(dāng)我們想要添加或更新內(nèi)容時(shí),不必為自己手動(dòng)下載而操心,它們還確保在安裝后一切都能正常工作、順暢運(yùn)行(這有時(shí)說起來容易做起來難)。?
Node預(yù)裝軟件包管理器NPM
NPM是默認(rèn)的軟件包管理器,因此它被內(nèi)置到Node運(yùn)行時(shí)環(huán)境中。您可以使用NPM直接從GitHub網(wǎng)站或NPM安裝軟件包,也可以將您的軟件包發(fā)布到這個(gè)網(wǎng)站,這樣其他人就可以使用自己版本的NPM來安裝它們。?
NPM不僅僅用于安裝軟件,還可以處理應(yīng)用程序代碼庫(kù)中兩個(gè)或多個(gè)所需庫(kù)或模塊之間的依賴項(xiàng)解析和版本沖突。?
這意味著,如果在您的服務(wù)器上隨時(shí)有Express之類的多個(gè)版本在運(yùn)行,NPM將確保每個(gè)實(shí)例得到它所需的東西,不會(huì)與從事類似任務(wù)的其他實(shí)例發(fā)生沖突,而且根本不需要您采取任何特殊的操作,只需要在需要時(shí)對(duì)對(duì)象調(diào)用require() !?
NPM是一種功能很強(qiáng)大的工具,很容易上手。但是如果您剛接觸Node和JavaScript,了解哪些工具可供使用以及哪些工具最適合某個(gè)項(xiàng)目可能具有挑戰(zhàn)性。?
NPM的主要問題是,軟件包安裝起來很慢。如果您只是運(yùn)行一兩個(gè)偶爾的腳本,這不是大問題,但如果您試圖構(gòu)建一個(gè)使用數(shù)十個(gè)不同庫(kù)和工具的完整應(yīng)用程序,這可能會(huì)讓人備感沮喪。?
Yarn和PNPM比NPM更快
Yarn是可以替代NPM的一種安全可靠的方案,它使用鎖文件來防止意外覆蓋,并確保在安裝軟件包時(shí)正確解析依賴項(xiàng)。?
安裝起來也比NPM快,如果您處理的大型項(xiàng)目涉及擁有眾多依賴項(xiàng)的許多模塊,這點(diǎn)尤其有用。?
PNPM是Yarn和NPM的替代者,但它的人氣還不是很旺,因?yàn)樗鼪]有其中任何一個(gè)的一些功能(比如鎖文件)。然而其開發(fā)人員聲稱,由于具有輕量級(jí)特性,PNPM安裝軟件包的速度比Yarn或NPM快四倍,這也意味著您的計(jì)算機(jī)上少占用磁盤空間!?
如果您在構(gòu)建的項(xiàng)目只需要少量依賴項(xiàng),那么Yarn或NPM可能就足夠了。但是如果您在處理的大型項(xiàng)目涉及許多模塊和依賴項(xiàng),那么PNPM可能是更好的選擇。?
使用多個(gè)軟件包管理器的優(yōu)點(diǎn)
一個(gè)軟件包管理器一次只能處理任何某個(gè)庫(kù)的一個(gè)版本。如果您希望為其他項(xiàng)目或不同的環(huán)境(比如生產(chǎn)環(huán)境與開發(fā)環(huán)境)使用同一個(gè)庫(kù)的兩個(gè)不同版本,那么需要在系統(tǒng)上安裝兩個(gè)單獨(dú)的軟件包。
如果兩個(gè)軟件包同時(shí)試圖更新相同依賴項(xiàng)的版本,可能導(dǎo)致沖突。使用多個(gè)軟件包管理器意味著您可以更好地控制安裝哪些依賴項(xiàng)以及安裝位置,這有助于避免此類沖突。?
另一個(gè)好處是,使用多個(gè)軟件包管理器時(shí),每個(gè)軟件包管理器都將提供各自獨(dú)特的功能特性。一些軟件包管理器可能更快,一些可能擁有更好的依賴項(xiàng)管理功能,另一些則可能更適合使用某些框架(比如ReactJS或VueJS)開發(fā)應(yīng)用程序。?
最后,使用多個(gè)軟件包管理器可以減少搜索和安裝依賴項(xiàng)所花費(fèi)的時(shí)間,從而幫助提高開發(fā)人員的工作效率,這是由于每個(gè)軟件包管理器在設(shè)計(jì)時(shí)都考慮到針對(duì)一組特定的用例(比如側(cè)重速度、安全或依賴項(xiàng)管理等方面)。?
通過全局安裝,使用多個(gè)軟件包管理器
使用命令行,您可以指定要為特定項(xiàng)目使用哪個(gè)軟件包管理器。在系統(tǒng)上安裝多個(gè)軟件包管理器:?
- Node預(yù)裝有NPM。這將允許您從命令行安裝其他軟件包及軟件包管理器,并使用NPM管理所有項(xiàng)目的依賴項(xiàng)。如果您想在Webpack等瀏覽器中運(yùn)行NPM腳本,它也很有幫助,因?yàn)闉g覽器并不預(yù)裝NPM !?
- 使用NPM全局安裝Yarn。這是管理JavaScript項(xiàng)目中依賴項(xiàng)的另一個(gè)常見方法,它較之NPM具有幾個(gè)優(yōu)點(diǎn),可能使它更適合某些類型的項(xiàng)目或團(tuán)隊(duì)。?
- 最后,安裝PNPM。該軟件包管理器是NPM的分支,旨在更快速、更穩(wěn)定。它還有一些額外的功能,可能對(duì)某些類型的項(xiàng)目很有用,比如支持來自GitHub的依賴項(xiàng)。?
注意,全局安裝意味著所選擇的軟件包可供整個(gè)系統(tǒng)使用(您可以通過命令行在任何地方訪問程序),而本地安裝只能由當(dāng)前工作目錄訪問。?
使用多個(gè)軟件包管理器的實(shí)例
不妨看看這些用法:?
1. Yarn和NPM可以一起使用(比如create-react-app)?
如果您想要充分利用Yarn的速度和效率,同時(shí)仍與NPM軟件包保持兼容性,這種方法非常有用。如果您需要一個(gè)還沒有更新的庫(kù)的最新版本與Yarn兼容,或者如果您的團(tuán)隊(duì)因其他原因而寧愿堅(jiān)持使用NPM,盡管速度較慢或功能有限,那么這可能很適合您的項(xiàng)目。這種方法還有助于避免您的單一代碼庫(kù)(mono repo)環(huán)境中有兩棵獨(dú)立的依賴樹!?
2. 將Yarn用于全局軟件包,將PNPM用于本地安裝?
雖然PNPM是最快的軟件包管理器,但用于全局安裝的軟件包可能有些棘手。這是由于它使用不同的文件結(jié)構(gòu),可能會(huì)導(dǎo)致與Visual Studio Code等程序之間的兼容問題,這時(shí)候Yarn就有了用武之地。可以將Yarn用于全局安裝的軟件包,將PNPM用于本地安裝。這個(gè)解決方案是集兩個(gè)軟件包管理器的優(yōu)點(diǎn)于一體的好方法,不必大幅改動(dòng)工作流程。有了這種方案,您可以從系統(tǒng)中完全刪除NPM(擁有NPM這個(gè)備份始終是好主意)。?
3.使用PNPM和NPM作為后備?
如果您想使用PNPM,又不想讓所有開發(fā)人員都得學(xué)習(xí)一種新工具,這是一種值得考慮的好選擇。它允許開發(fā)人員繼續(xù)使用NPM,直到他們熟悉PNPM、需要它來完成工作。?
使用多個(gè)軟件包管理器讓事情變得更簡(jiǎn)單
您可以使用多個(gè)軟件包管理器;可以在全局或本地安裝,如果您想指定哪個(gè)軟件包管理器應(yīng)該用于某個(gè)項(xiàng)目,只需使用命令行!?
如果您想在系統(tǒng)上安裝多個(gè)軟件包管理器,確保使用的是同一版本的Node.js。?
總之,我們認(rèn)為您應(yīng)該使用多個(gè)軟件包管理器。如果您已經(jīng)熟悉NPM,這是開始上手Node和學(xué)習(xí)一些新工具的好方法。如果您還沒有安裝Node,在Windows上安裝其實(shí)很簡(jiǎn)單。?
原文標(biāo)題:??Why You’ll Probably Want To Use More Than One Node Package Manager??,作者:Brian Walker