npm 模塊的總結

 

// https://www.jianshu.com/p/818833b2dd5anode

npm的版本號管理
一個版本號分爲三個部分: X, Y, Z. X表示主版本號, X爲主版本號Y爲次版本號Z爲更新補丁號
若是作稍微改動修復功能沒有添加新功能更新Z若是添加新功能更新版本號Y若是有大的功能須要改動更新版本號X
~ 會匹配最近的小版本依賴包好比~ 1.2.3 會匹配全部1.2. x版本可是不包括1. 3.0
^ 會匹配最新的大版本依賴包好比 ^ 1.2.3 會匹配全部1. x. x的包包括1. 3.0可是不包括2. 0.0

使用場景
運行同一個項目補丁的版本更新使用不一樣項目的人npminstall, 二個不一樣的版本運行的結果可能不同
這時候 package - lock. json 爲了解決這個問題,( npm 版本在5以上), 內容處理和安裝依賴他代表了
版本號獲取地址和哈希值是的每次安裝都是相同的結果
//https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/22
// npm 模塊安裝機制:
發送npm install的命令
查詢node_modules目錄是否有指定模塊
若是存在不須要從新安裝
若是不存在
npm向registry查詢壓縮包的網址
下載壓縮包存放在根目錄下的. npm的目錄裏
解壓壓縮包到當前項目node_modules目錄下
// npm 實現的原理
當輸入npm install會經歷以下幾個階段
1執行工程自身preinstall
2, 肯定首層依賴模塊
首先須要作的是肯定工程中的首層依賴也就是 dependencies devDependencies 屬性中直接指定的模塊假設此時沒有添加 npm install 參數)。
工程自己是整棵依賴樹的根節點每一個首層依賴模塊都是根節點下面的一棵子樹npm 會開啓多進程從每一個首層依賴模塊開始逐步尋找更深層級的節點
3, 獲取模塊
獲取模塊的信息
在下載一個模塊以前首先要肯定其版本這是由於 package. json 中每每是 semantic versionsemver語義化版本)。
此時若是版本描述文件npm - shrinkwrap. json package - lock. json中有該模塊信息直接拿便可若是沒有則從倉庫獲取
packaeg. json 中某個包的版本是 ^ 1.1. 0npm 就會去倉庫中獲取符合 1. x. x 形式的最新版本
獲取模塊的實體
上一步會獲取到模塊的壓縮包地址resolved 字段), npm 會用此地址檢查本地緩存緩存中有就直接拿若是沒有則從倉庫下載
查找模塊的依賴
查找該模塊依賴若是有依賴則回到第1步若是沒有則中止
4模塊扁平化dedupe
上一步獲取到的是一棵完整的依賴樹其中可能包含大量重複模塊好比 A 模塊依賴於 loadshB 模塊一樣依賴於 lodash npm3 之前會嚴格按照依賴樹的結構進行安裝所以會形成模塊冗餘
npm3 開始默認加入了一個 dedupe 的過程它會遍歷全部節點逐個將模塊放在根節點下面也就是 node - modules 的第一層當發現有重複模塊時則將其丟棄
這裏須要對重複模塊進行一個定義它指的是模塊名相同且 semver 兼容每一個 semver 都對應一段版本容許範圍若是兩個模塊的版本容許範圍存在交集那麼就能夠獲得一個兼容版本而沒必要版本號徹底一致這能夠使更多冗餘模塊在 dedupe 過程當中被去
5安裝模塊
這一步將會更新工程中的 node_modules並執行模塊中的生命週期函數按照 preinstallinstallpostinstall 的順序)。
6執行工程中自身生命週期
當前 npm 工程若是定義了鉤子此時會被執行按照 installpostinstallprepublishprepare 的順序)。
最後一步是生成或更新版本描述文件npm install 過程完成
相關文章
相關標籤/搜索