啟動(dòng)項(xiàng)目我們一般第一個(gè)執(zhí)行的命令就是安裝依賴包 npm install
。那么這個(gè)過程具體的執(zhí)行流程是怎么樣的呢碾盟?
安裝流程
1.npm install執(zhí)行后犁河,會(huì)檢查并獲取npm配置扎狱,優(yōu)先級(jí)為
項(xiàng)目級(jí)別的.npmrc文件 > 用戶級(jí)別的.npmrc文件 > 全局的.npmrc文件 > npm內(nèi)置的.npmrc文件
查看配置命令npm config ls -l
2.然后檢查項(xiàng)目中是否有package-lock.json文件。
-
如果有奶浦,檢查package-lock.json和package.json中聲明的依賴是否一致
- 一致:直接使用 package-lock.json 中聲明的依賴,從緩存或者網(wǎng)絡(luò)中加載依賴
-
不一致:各個(gè)版本的npm處理方式:
-
如果沒有踢星,根據(jù)package.json遞歸構(gòu)建依賴樹澳叉,然后根據(jù)依賴樹下載完整的依賴資源,在下載時(shí)會(huì)檢查是否有相關(guān)的資源緩存
- 存在:將緩存資源解壓到node_modules中
- 不存在:從遠(yuǎn)程倉(cāng)庫(kù)下載資源包沐悦,并校驗(yàn)完整性成洗,并添加到緩存,同時(shí)解壓到node_modules中
最后生成package-lock.json文件藏否。
構(gòu)建依賴樹時(shí)瓶殃,不管是直接依賴還是子依賴,都會(huì)按照扁平化的原則副签,優(yōu)先將其放置在node_modules根目錄中(最新的npm規(guī)范),在這個(gè)過程中遥椿,如果遇到相同的模塊,會(huì)檢查已放置在依賴樹中的模塊是否符合新模塊的版本范圍淆储,如果符合冠场,則跳過,不符合本砰,則在當(dāng)前模塊的node_modules下放置新模塊
npm安裝依賴時(shí)碴裙,會(huì)下載到緩存當(dāng)中,然后解壓到項(xiàng)目的node_modules中点额。
再次安裝依賴的時(shí)候舔株,會(huì)根據(jù)package-lock.json中存儲(chǔ)的 integrity、version咖楣、name 信息生成一個(gè)唯一的 key督笆,然后拿著key去目錄中查找對(duì)應(yīng)的緩存記錄,如果有緩存資源诱贿,就會(huì)找到tar包的hash值娃肿,根據(jù) hash 再去找緩存的 tar 包咕缎,并把對(duì)應(yīng)的二進(jìn)制文件解壓到相應(yīng)的項(xiàng)目 node_modules 下面,省去了網(wǎng)絡(luò)下載資源的開銷料扰。
// 獲取緩存位置
npm config get cache
// C:\Users\DB\AppData\Roaming\npm-cache
// 清除緩存
npm cache clean --force
另外_cacache 文件夾中不包含全局安裝的包凭豪,所以想清除存在問題的包為全局安裝包時(shí),需用 npm uninstall -g <package>
解決
參考資料:https://blog.csdn.net/h03580/article/details/116021091?spm=1001.2014.3001.5501