首先,在一個空目錄下本地安裝express
然后查看當前npm的目錄結構,如下圖所示
這個結構是什么?和express有什么關系呢?
現在,查看位於/node_modules
目錄下的express
的 package.json
文件。其中的dependencies
依賴如下圖所示。
簡單的對比兩個圖,發現圖一express@4.17.1
的子樹對應dependencies
。
通過一一核對,發現 驗證了 圖一的目錄結構對應express
的 dependencies
。
- 結論1: 通過 npm安裝
express
包會將express
的所有依賴都一起安裝
那么,安裝下來的版本號一致嗎?
在npm文檔中,對版本進行了說明
對於一個項目或包而言,在package.json
的dependencies
中聲明依賴版本有這樣的規則
~(波浪線)代表當前項目接受補丁版本,也就是如果你的項目依賴為版本為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
包依賴結構,圖二為express
的 dependencies
。
經過對比發現,版本並不完全相同。其中,proxy-addr
包的版本依賴的是"proxy-addr": "~2.0.5"
2.0.5版本,而實際安裝的是proxy-addr@2.0.6
2.0.6版本。
- 結論2:npm 安裝的包會根據
package.json
中的dependencies
依賴修飾符,自動升級依賴的版本。
現在express
的dependencies
依賴搞清楚了。那么express
依賴的依賴呢?
比如 express
的第一個依賴accepts
在accepts
的package.json
中發現,它自身依賴兩個包。
而通過npm list
命令得到express的依賴樹中,子樹也是這兩個依賴包
並且在/node_modules
中找到了依賴。
繼續發現,accepts
的依賴mime-types
的依賴mime-db
也遵循這個規則。
- 結論3:npm會遞歸的安裝一個包的依賴。
假如一個項目中的兩個npm包都依賴express,那么這樣會將express及整個依賴樹安裝兩遍嗎?
觀察樹可以發現,其中有一些多次的被依賴的包。
但是層級更深的依賴后綴有一個deduped
(重復數據刪除)的標識。
這意味着npm在安裝包的過程中會檢查當前是否已經安裝過相同的包,如果有,則不再次安裝。
- 結論4: npm會記錄安裝過的包,安裝過程為廣度優先