一、準備階段:配置與環境檢查
讀取配置優先級
npm install
?首先加載多層級的配置(優先級從高到低)4:項目級?
.npmrc
用戶級?
.npmrc
(如?~/.npmrc
)全局?
npmrc
npm 內置默認配置
可通過?npm config ls -l
?查看所有配置。
檢查鎖定文件
若存在?
package-lock.json
:
對比其與?package.json
?的依賴版本是否一致:? 一致 → 直接使用鎖定文件中的依賴樹。
? 不一致 → 按 npm 版本策略處理(如 npm 5.x+ 會以?
package.json
?為準更新鎖定文件)4。
若無鎖定文件 → 根據?
package.json
?遞歸構建依賴樹4。
?二、依賴解析階段:構建依賴樹與扁平化
依賴樹生成
npm 解析?package.json
?中的?dependencies
?和?devDependencies
,遞歸收集所有子依賴,形成樹狀結構4。扁平化處理(Deduplication)
將依賴按相同版本提升到?
node_modules
?根目錄(如?react
?只安裝一份)。若版本沖突(如 A 依賴?
lodash@^4.0
,B 依賴?lodash@^3.0
)→ 在 B 的?node_modules
?下單獨安裝?lodash@3.x
4。
三、安裝階段:緩存與下載
緩存查詢
每個包根據?
name@version
?生成唯一 Key,在緩存目錄(npm config get cache
,通常為?_cacache
)中查找14。若緩存命中且校驗通過(通過?
integrity
?字段驗證完整性)→?直接解壓到項目?node_modules
。
遠程下載
若緩存未命中 → 從 npm 倉庫(或配置的鏡像如淘寶源)下載包。
下載后:
校驗完整性(SHA 摘要)。
存入緩存。
解壓至?
node_modules
14。
📦 四、收尾階段:寫入與清理
生成/更新?
package-lock.json
記錄所有依賴的精確版本、下載地址、依賴樹結構,確保后續安裝一致4。運行生命周期腳本
按順序執行包中定義的腳本(如?preinstall
、postinstall
),某些包可能在此階段編譯原生模塊。
?? 五、常見問題與解決
問題場景 | 原因與解決方案 |
---|---|
安裝后報錯“模塊找不到” | 緩存損壞或網絡中斷導致包不完整 → 清除緩存重試:npm cache clean --force ?+ 刪除?node_modules ?重裝14。 |
node_modules ?無法刪除 | 文件被進程占用 → 關閉 IDE(如 VSCode)或使用命令行強制刪除12。 |
安全漏洞警告 | 運行?npm audit ?查看漏洞詳情 → 使用?npm audit fix ?自動修復,或手動升級受影響包7。 |
Linux 系統權限災難 | ?? 歷史教訓:npm v5.7.0 在?sudo ?下運行時遞歸修改系統目錄所有權(如?/etc ),導致系統崩潰 →?永遠避免用?sudo ?執行 npm!356。 |
💎 關鍵機制總結
緩存優化:顯著加速重復安裝,但需注意緩存污染問題4。
鎖定文件作用:確保跨環境安裝一致性,務必提交到版本控制。
安全審計:
npm audit
?主動檢測依賴鏈漏洞(如?react-native-validator-form
?案例中的 Karma 漏洞)7
?流程圖