npm install的整體流程:
檢查 .npmrc 文件:優先級為:項目級的 .npmrc 文件 > 用戶級的 .npmrc 文件> 全局級的 .npmrc 文件 > npm 內置的 .npmrc 文件
檢查項目中有無 lock 文件:
-
無 lock 文件:
- 從 npm 遠程倉庫獲取包信息
- 根據 package.json 構建依賴樹,構建過程:
- 構建依賴樹時,不管其是直接依賴還是子依賴的依賴,優先將其放置在 node_modules 根目錄。
- 當遇到相同模塊時,判斷已放置在依賴樹的模塊版本是否符合新模塊的版本范圍,如果符合則跳過,不符合則在當前模塊的 node_modules 下放置該模塊。
- 注意這一步只是確定邏輯上的依賴樹,並非真正的安裝,后面會根據這個依賴結構去下載或拿到緩存中的依賴包
-
在緩存中依次查找依賴樹中的每個包
-
不存在緩存:
- 從 npm 遠程倉庫下載包
- 校驗包的完整性
- 校驗不通過: 重新下載
-
校驗通過:
- 將下載的包復制到 npm 緩存目錄
- 將下載的包按照依賴結構解壓到 node_modules
-
存在緩存:
- 將緩存按照依賴結構解壓到 node_modules
- 將包解壓到 node_modules
-
- 生成 lock 文件
-
有 lock 文件:
- 檢查 package.json 中的依賴版本是否和 package-lock.json 中的依賴有沖突。
- 如果沒有沖突,直接跳過獲取包信息、構建依賴樹過程,開始在緩存中查找包信息,后續過程相同
npm 提供了幾個命令來管理緩存數據:
npm cache add
:官方解釋說這個命令主要是 npm 內部使用,但是也可以用來手動給一個指定的 package 添加緩存。
npm cache clean
:刪除緩存目錄下的所有數據,為了保證緩存數據的完整性,需要加上 --force 參數。
npm cache verify
:驗證緩存數據的有效性和完整性,清理垃圾數據。
基於緩存數據,npm 提供了離線安裝模式,分別有以下幾種:
--prefer-offline
:優先使用緩存數據,如果沒有匹配的緩存數據,則從遠程倉庫下載。
--prefer-online
:優先使用網絡數據,如果網絡數據請求失敗,再去請求緩存數據,這種模式可以及時獲取最新的模塊。
--offline
:不請求網絡,直接使用緩存數據,一旦緩存數據不存在,則安裝失敗。
使用建議
開發系統應用時,建議把 package-lock.json 文件提交到代碼版本倉庫,從而保證所有團隊開發者以及 CI 環節可以在執行 npm install 時安裝的依賴版本都是一致的。
在開發一個 npm包 時,你的 npm包 是需要被其他倉庫依賴的,由於上面我們講到的扁平安裝機制,如果你鎖定了依賴包版本,你的依賴包就不能和其他依賴包共享同一 semver 范圍內的依賴包,這樣會造成不必要的冗余。所以我們不應該把package-lock.json 文件發布出去( npm 默認也不會把 package-lock.json 文件發布出去)。
參考:https://cloud.tencent.com/developer/article/1555982