npm包的依賴關系


首先,在一個空目錄下本地安裝express
然后查看當前npm的目錄結構,如下圖所示

這個結構是什么?和express有什么關系呢?

現在,查看位於/node_modules目錄下的expresspackage.json 文件。其中的dependencies依賴如下圖所示。

簡單的對比兩個圖,發現圖一express@4.17.1的子樹對應dependencies

通過一一核對,發現 驗證了 圖一的目錄結構對應expressdependencies

  • 結論1: 通過 npm安裝express包會將express的所有依賴都一起安裝

那么,安裝下來的版本號一致嗎?

npm文檔中,對版本進行了說明

對於一個項目或包而言,在package.jsondependencies 中聲明依賴版本有這樣的規則
~(波浪線)代表當前項目接受補丁版本,也就是如果你的項目依賴為版本為1.0.1的某個npm包(假設包名叫express),當express更新到1.0.3的時候,你運行npm install,會自動將express升級為1.0.3。
^(尖號) 代表當前項目接受 次要版本 ,也就是如果你的項目依賴為版本為1.0.1的某個npm包(假設包名叫express),當express更新到1.3.2的時候,你運行npm install,會自動將express升級為1.3.2。
如果沒有加上版本號前沒有加上修飾符修飾符,則表示指定該版本進行安裝。

我們比較兩者的版本號,再次聲明:圖一為實際安裝的express包依賴結構,圖二為expressdependencies
經過對比發現,版本並不完全相同。其中,proxy-addr包的版本依賴的是"proxy-addr": "~2.0.5"2.0.5版本,而實際安裝的是proxy-addr@2.0.62.0.6版本。

  • 結論2:npm 安裝的包會根據package.json中的dependencies依賴修飾符,自動升級依賴的版本。

現在expressdependencies依賴搞清楚了。那么express依賴的依賴呢?

比如 express的第一個依賴accepts
acceptspackage.json中發現,它自身依賴兩個包。

而通過npm list命令得到express的依賴樹中,子樹也是這兩個依賴包

並且在/node_modules中找到了依賴。

繼續發現,accepts的依賴mime-types的依賴mime-db也遵循這個規則。

  • 結論3:npm會遞歸的安裝一個包的依賴。

假如一個項目中的兩個npm包都依賴express,那么這樣會將express及整個依賴樹安裝兩遍嗎?
觀察樹可以發現,其中有一些多次的被依賴的包。

但是層級更深的依賴后綴有一個deduped(重復數據刪除)的標識。
這意味着npm在安裝包的過程中會檢查當前是否已經安裝過相同的包,如果有,則不再次安裝。

  • 結論4: npm會記錄安裝過的包,安裝過程為廣度優先

參考資料

  1. 關於語義版本控制
  2. npm查看依賴包報錯:npm ERR! extraneous解決!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM