npm install

refer:??https://cloud.tencent.com/developer/article/1555982

npm install 的結構經(jīng)歷了以下幾個過程,

一, 嵌套結構 -

node_modules 結構和package.json 結構一一對應,層級結構明顯,每次安裝目錄結構都是相同的;

在不同的層級依賴中,可能引用了同一個模塊,導致大量冗余;

在windows系統(tǒng)中,文件路徑最大長度為260個字符,嵌套層級過深可能導致不可預知的問題


二, 扁平結構 -

3.X版本 安裝模塊時,不管是直接依賴還是子依賴的依賴,優(yōu)先將其安裝在node_modules根目錄

相同模塊不同版本的安裝順序未知


三, Lock文件 - 參考yarn(2016)

5.X版本 package-lock.json鎖定依賴結構。每次安裝生成的目錄結構保持一致;緩存了每個包具體版本和下載鏈接,不需要再去遠程倉庫進行查詢,直接進入文件完整性校驗環(huán)節(jié),減少了大量的網(wǎng)絡請求,顯著加速依賴安裝時間

package-lock.json文件基本組成:

version: 包版本? ? resolved: 包具體安裝來源? ? integrity: 包hash值,用來驗證包是否有效? ?requires:對應依賴? ?dependencies:依賴包


四, Lock文件與package文件的共生 -

自npm 5.0版本發(fā)布以來,npm i的規(guī)則發(fā)生了三次變化。

1、npm 5.0.x 版本,不管package.json怎么變,npm i 時都會根據(jù)package-lock文件下載

2、5.1.0版本后 npm install 會無視package-lock文件 去下載最新的npm?

3、5.4.2版本后? 如果改了package.json,且package.json和package-lock文件不同,那么執(zhí)行`npm i`時npm會根據(jù)package中的版本號以及語義含義去下載最新的包,并更新至lock。如果兩者是同一狀態(tài),那么執(zhí)行`npm i `都會根據(jù)lock下載,不會理會package實際包的版本是否有新。


總結 -

1.檢查.npmrc文件:優(yōu)先級為:項目級的.npmrc文件 > 用戶級的.npmrc文件> 全局級的.npmrc文件 > npm 內置的.npmrc文件

2.檢查項目中有無lock文件。



------無lock文件:

3.從npm遠程倉庫獲取包信息

4.根據(jù)package.json構建依賴樹:構建依賴樹時,不管其是直接依賴還是子依賴的依賴,優(yōu)先將其放置在node_modules根目錄。當遇到相同模塊時,判斷已放置在依賴樹的模塊版本是否符合新模塊的版本范圍,如果符合則跳過,不符合則在當前模塊的node_modules下放置該模塊。(只是確定邏輯上的依賴樹,并非真正的安裝,后面會根據(jù)這個依賴結構去下載或拿到緩存中的依賴包)

5.在緩存中依次查找依賴樹中的每個包? ? ?不存在緩存則從npm遠程倉庫下載包;校驗包的完整性;校驗不通過則重新下載,校驗通過則將下載的包復制到npm緩存目錄;將下載的包按照依賴結構解壓到node_modules 。 若存在緩存:將緩存按照依賴結構解壓到?node_modules

6.生成lock文件


--------有l(wèi)ock文件:

3.檢查package.json中的依賴版本是否和package-lock.json中的依賴有沖突。

4.如果沒有沖突,直接跳過獲取包信息、構建依賴樹過程,開始在緩存中查找包信息,后續(xù)過程相同


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容