首頁 web前端 js教程 npm的模組安裝機制詳細介紹

npm的模組安裝機制詳細介紹

Jun 26, 2017 am 10:54 AM
安裝 機制 模組 詳解

 
依賴樹表面的邏輯結構與依賴樹真實的物理結構
依賴樹表面的邏輯結構與依賴樹真實的物理結構不一定相同!
這裡要先提到兩個指令:tree -d(linux)和npm ls(npm)
在一個npm專案下:
tree -d指令以樹狀圖的方式列出一個項目下所有依賴的物理結構
#npm ls指令以樹狀圖的方式列出一個項目下所有依賴的邏輯結構
 
以官方文件為範例:
專案example1有兩個依賴模組:mod-a模組和mod-c模組;
mod-a模組有一個依賴模組mod-b@1.0.0模組
#mod-c模組有一個依賴模組mod-b@2.0.0模組
tree -d 和npm ls運行結果如下:(注意npm版本為npm3而非npm2)
 
 
#先看看下面那個紅框的結果,這應該是「最符合我們理解」的依賴樹,首先項目下形成了一級依賴-mod-a模組和mod-b模組,然後以這兩個模組為父模組再追加二級依賴模組mod-b@1.0 .0和mod-b@2.0.0
 
但是! 這並不是物理上真實形成的依賴樹的模樣,物理上真實形成的依賴樹是上面的那個紅色框。 mod-a,mod-c和mod-b竟然同為同一級的依賴。
 
你可能會問,為什麼會形成這樣的依賴樹呢? 下面我就來解釋一番
 
#【注意】:下面的圖示全部為依賴樹的物理結構,而不是邏輯結構
 
#關於npm模組安裝機制的一點猜想
安裝模組時,可能的方式有兩種:平級式的安裝或嵌套式的安裝(這裡只是猜想和假設)

 

#能不能完全採取平階的安裝方式呢? ——不能
 
我們取和上面相似的一個例子:專案APP下有兩個依賴模組A和B;A又有一個依賴模組Cv1.0;而B也有一個依賴模組Cv2.0。顯然,它們並不能同時存在於同一個node_modules下,當安裝的時候,由於npm的作用機制,只能有一個版本的依賴模組被安裝,其中一個將覆蓋另外一個。

 

但如果我們只安裝一個版本的C依賴模組,將可能會導致A模組和B模組不相容
 
基於上述原因,npm2選擇了嵌套的安裝方式-
 
#npm2下的模組安裝機制
npm2安裝多層次的依賴模組採用巢狀的安裝方式: 
##  
優點與缺點
優點:
解決了版本單一時存在的存在的不相容問題,實現多版本相容
#弊端:可能造成相同模組大量冗餘
的問題,如下:
 
以上面例子為例,下面這種情況也是合理存在的:
#憑感覺也知道,這絕不是什麼好現象,那我們如何在實現依賴間多版本相容的前提下,減少這種模組冗餘呢?於是npm3做了改進 
#npm3下的模組安裝機制:
npm3和npm2的不同主要體現在二級模組的安裝上:#npm3會"盡量"##把邏輯上某個層級的模組在物理結構上"全部"放在專案的第一層級裡,具體我概括為以下三種情況:
1.在安裝某個二級模組時,若發現第##等級還沒有相同名稱的模組,便
把這第二層級的模組放在第一層級
2.在安裝某個二級模組時,若發現第層級有相同名稱,相同版本的模組,便
直接重複使用那個模組###############3.在安裝某個二級模組時,若發現第######一#####層級### ###有相同名稱,但版本不同的模組######,便###只能嵌套在自身的父模組下方#########
 
這開始可能有些難理解,所以讓我們看圖片說話吧!
 
#先說1:安裝某個二級模組時,若發現第一層級還沒有相同名稱的模組,便把這第二層級的模組放在第一層級
我們先簡化一下上面的範例:現在專案APP下只有一個一級依賴模組A,它下面有一個二級依賴模組C,但npm install的時候,項目下安裝依賴的

 

npm3中的二級模組(C v1.0),在專案的一級目錄(node_modules)下沒有相同名稱的模組時,會被安裝到一級目錄下,從而跟它的父模組A同級。 這就是本文一開始依賴樹的邏輯結構和物理結構不同的起因
 
也就是說:
在npm2中,依賴樹的邏輯結構和它的物理結構相同
#在npm3中,依賴樹的邏輯結構和它的物理結構可能不同
 
#再說2:在安裝某個二級模組時,若發現第一層級有相同名稱,相同版本的模組,便直接重複使用那個模組
在1的基礎上,我們把1的例子還原回之前的複雜一些的場景::專案APP下有兩個依賴模組A和B;A又有一個依賴模組Cv1.0;而B也有一個依賴模組C v1.0(兩個C模組版本相同)

 

#對npm2,兩個C套件是相同的,造成模組冗餘
在npm3中,因為A模組下的C模組被安裝到了第一級,這使得B模組能夠復用處在同一級下;且名稱,版本,均相同的C模組
npm3就是用這種方式,部分地解決了npm2的痛點(部分)
 
【從1,2到3的過渡】我在這一小節的開始說:「npm3會」盡量」把邏輯上某個層級的模組"全部"放在專案的第一層級」,我想你看完1,2後應該多少有些理解了「盡量」的含義了,但我說了「盡量」,也意味著npm3存在著不能把二級依賴放在第一層級的情況。對此,請看3:
 
#最後說3:在安裝某個二級模組時,若發現第一層層級有相同名稱,但版本不同的模組,只能嵌套在自身的父模組下方
在2中,A,B所依賴的兩個C模組是相同的,但如果兩個C模組的版本不同呢? ,項目npm install情況如下:

 

在npm3中,因為B和A所要求的依賴模組不同,(B下要求是v1.0的C,A下要求是v2.0的C )所以B不能像2中那樣複用A下的C v1.0模組
(看到這裡我想應該能解答你對文章開頭那個例子的疑惑了吧,這個例子和那個例子是幾乎完全一樣的哦)
看到這裡,你對npm2和npm3下的模組工作機制,以及npm3針對npm2的優化有個大體的了解了吧,但請思考一個問題:npm3是否已經把npm2的模組冗餘的缺陷優化到極致了呢? ———答案是沒有,請往下看:
 
##實際上:npm3中仍然可能出現模組冗餘的情況,因為一級目錄下已經有v1.0的C模組了,所以所有的v2.0只能作為二級依賴模組被安裝
,這樣你就會看到如下的情況

## 
 
並且在上圖所示的這種特殊情況裡,npm3和npm2表現得似乎並沒什麼區別
【過渡】那麼這有沒有解決的方式呢?當然是有的,當A模組下的C v1.0模組被更新到C v2.0的前提下,我們可以透過npm dedupe把所有C v2.0的二級依賴模組「重定向」到一級目錄下的那個C v1.0
 
#利用npm dedupe去除冗餘模組:
#npm dedupe做了什麼? 它能夠把凡是能夠去除的冗餘的二級依賴模組,「重定向」到名稱/版本相同的一級模組

 
參考資料 npm官方文件第二節(how npm works ): 
##【溫馨提醒】:任何一篇膾炙人口的博客,都比不上一本厚重的書籍和枯燥的文檔
 
【完】
#每天記10個小單字吧,重在累積哦!
memory:記憶體 Dependency:依賴 constraints:約束deploy:部署parameter:參數scope:作用域
#ecosystems:生態系統prefix:前綴Prior:優先/之前 revoke:撤銷
 ####
##

以上是npm的模組安裝機制詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Win11系統無法安裝中文語言套件的解決方法 Win11系統無法安裝中文語言套件的解決方法 Mar 09, 2024 am 09:48 AM

Win11系統無法安裝中文語言包的解決方法隨著Windows11系統的推出,許多用戶開始升級他們的作業系統以體驗新的功能和介面。然而,一些用戶在升級後發現他們無法安裝中文語言包,這給他們的使用體驗帶來了困擾。在本文中,我們將探討Win11系統無法安裝中文語言套件的原因,並提供一些解決方法,幫助使用者解決這個問題。原因分析首先,讓我們來分析一下Win11系統無法

無法在VirtualBox中安裝來賓添加 無法在VirtualBox中安裝來賓添加 Mar 10, 2024 am 09:34 AM

您可能無法在OracleVirtualBox中將來賓新增安裝到虛擬機器。當我們點擊Devices>InstallGuestAdditionsCDImage時,它只會拋出一個錯誤,如下所示:VirtualBox-錯誤:無法插入虛擬光碟C:將FilesOracleVirtualBoxVBoxGuestAdditions.iso編程到ubuntu機器中在這篇文章中,我們將了解當您無法在VirtualBox中安裝來賓新增元件時該怎麼辦。無法在VirtualBox中安裝來賓添加如果您無法在Virtua

百度網盤下載成功但是安裝不了怎麼辦? 百度網盤下載成功但是安裝不了怎麼辦? Mar 13, 2024 pm 10:22 PM

如果你已經成功下載了百度網盤的安裝文件,但是無法正常安裝,可能是軟體文件的完整性發生了錯誤或者​​是殘留文件和註冊表項的問題,下面就讓本站來為用戶們來仔細的介紹一下百度網盤下載成功但是安裝不了問題解析吧。  百度網盤下載成功但是安裝不了問題解析  1、檢查安裝檔完整性:確保下載的安裝檔完整且沒有損壞。你可以重新下載一次,或者嘗試使用其他可信任的來源下載安裝檔。  2、關閉防毒軟體和防火牆:某些防毒軟體或防火牆程式可能會阻止安裝程式的正常運作。嘗試將防毒軟體和防火牆停用或退出,然後重新執行安裝

如何在Linux上安裝安卓應用程式? 如何在Linux上安裝安卓應用程式? Mar 19, 2024 am 11:15 AM

在Linux上安裝安卓應用程式一直是許多用戶所關心的問題,尤其是對於喜歡使用安卓應用程式的Linux用戶來說,掌握如何在Linux系統上安裝安卓應用程式是非常重要的。雖然在Linux系統上直接運行安卓應用程式並不像在Android平台上那麼簡單,但是透過使用模擬器或第三方工具,我們依然可以在Linux上愉快地享受安卓應用程式的樂趣。以下將為大家介紹在Linux系統上安裝安卓應

如何在Ubuntu 24.04上安裝Podman 如何在Ubuntu 24.04上安裝Podman Mar 22, 2024 am 11:26 AM

如果您使用過Docker,則必須了解守護程式、容器及其功能。守護程序是在容器已在任何系統中使用時在背景執行的服務。 Podman是一個免費的管理工具,用於管理和建立容器,而不依賴任何守護程序,例如Docker。因此,它在管理貨櫃方面具有優勢,而不需要長期的後台服務。此外,Podman不需要使用根級別的權限。本指南詳細討論如何在Ubuntu24上安裝Podman。更新系統我們先進行系統更新,開啟Ubuntu24的Terminalshell。在安裝和升級過程中,我們都需要使用命令列。一種簡單的

Oracle SQL中的除法運算詳解 Oracle SQL中的除法運算詳解 Mar 10, 2024 am 09:51 AM

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

在Ubuntu 24.04上安裝和執行Ubuntu筆記應用程式的方法 在Ubuntu 24.04上安裝和執行Ubuntu筆記應用程式的方法 Mar 22, 2024 pm 04:40 PM

在高中學習的時候,有些學生做的筆記非常清晰準確,比同一個班級的其他人都做得更多。對某些人來說,記筆記是一種愛好,而對其他人來說,當他們很容易忘記任何重要事情的小資訊時,則是一種必需品。 Microsoft的NTFS應用程式對於那些希望保存常規講座以外的重要筆記的學生特別有用。在這篇文章中,我們將描述Ubuntu24上的Ubuntu應用程式的安裝。更新Ubuntu系統在安裝Ubuntu安裝程式之前,在Ubuntu24上我們需要確保新設定的系統已經更新。我們可以使用Ubuntu系統中最著名的「a

Win7電腦上安裝Go語言的詳細步驟 Win7電腦上安裝Go語言的詳細步驟 Mar 27, 2024 pm 02:00 PM

在 Win7電腦上安裝Go語言的詳細步驟Go(又稱Golang)是一種由Google開發的開源程式語言,其簡潔、高效和並發效能優秀,適合用於開發雲端服務、網路應用和後端系統等領域。在Win7電腦上安裝Go語言,可以讓您快速入門這門語言並開始編寫Go程式。以下將會詳細介紹在Win7電腦上安裝Go語言的步驟,並附上具體的程式碼範例。步驟一:下載Go語言安裝套件訪問Go官

See all articles