北京裝修公司電話名單手機(jī)網(wǎng)站排名優(yōu)化
在執(zhí)行npm install 的時(shí)候發(fā)生了什么?
首先安裝的依賴都會(huì)存放在根目錄的node_modules,默認(rèn)采用扁平化的方式安裝,并且排序規(guī)則.bin第一個(gè)然后@系列,再然后按照首字母排序abcd等,并且使用的算法是廣度優(yōu)先遍歷,在遍歷依賴樹時(shí),npm會(huì)首先處理項(xiàng)目根目錄下的依賴,然后逐層處理每個(gè)依賴包的依賴,直到所有依賴都被處理完畢。在處理每個(gè)依賴時(shí),npm會(huì)檢查該依賴的版本號(hào)是否符合依賴樹中其他依賴的版本要求,如果不符合,則會(huì)嘗試安裝適合的版本
扁平化?
扁平化只是理想狀態(tài)如下
安裝某個(gè)二級(jí)模塊時(shí),若發(fā)現(xiàn)第一層級(jí)有相同名稱,相同版本的模塊,便直接復(fù)用那個(gè)模塊
因?yàn)锳模塊下的C模塊被安裝到了第一級(jí),這使得B模塊能夠復(fù)用處在同一級(jí)下;且名稱,版本,均相同的C模塊
非理想狀態(tài)下
因?yàn)锽和A所要求的依賴模塊不同,(B下要求是v2.0的C,A下要求是v1.0的C )所以B不能像2中那樣復(fù)用A下的C v1.0模塊 所以如果這種情況還是會(huì)出現(xiàn)模塊冗余的情況,他就會(huì)給B繼續(xù)搞一層node_modules,就是非扁平化了。
npm install 后續(xù)流程
具體過(guò)程看圖就可以了很詳細(xì)
至于npmrc可以配置什么給大家一個(gè)demo參考
registry=http://registry.npmjs.org/
# 定義npm的registry,即npm的包下載源proxy=http://proxy.example.com:8080/
# 定義npm的代理服務(wù)器,用于訪問(wèn)網(wǎng)絡(luò)https-proxy=http://proxy.example.com:8080/
# 定義npm的https代理服務(wù)器,用于訪問(wèn)網(wǎng)絡(luò)strict-ssl=true
# 是否在SSL證書驗(yàn)證錯(cuò)誤時(shí)退出cafile=/path/to/cafile.pem
# 定義自定義CA證書文件的路徑user-agent=npm/{npm-version} node/{node-version} {platform}
# 自定義請(qǐng)求頭中的User-Agentsave=true
# 安裝包時(shí)是否自動(dòng)保存到package.json的dependencies中save-dev=true
# 安裝包時(shí)是否自動(dòng)保存到package.json的devDependencies中save-exact=true
# 安裝包時(shí)是否精確保存版本號(hào)engine-strict=true
# 是否在安裝時(shí)檢查依賴的node和npm版本是否符合要求scripts-prepend-node-path=true
# 是否在運(yùn)行腳本時(shí)自動(dòng)將node的路徑添加到PATH環(huán)境變量中
package-lock.json 的作用
很多朋友只知道這個(gè)東西可以鎖定版本記錄依賴樹詳細(xì)信息
- version 該參數(shù)指定了當(dāng)前包的版本號(hào)
- resolved 該參數(shù)指定了當(dāng)前包的下載地址
- integrity 用于驗(yàn)證包的完整性
- dev 該參數(shù)指定了當(dāng)前包是一個(gè)開發(fā)依賴包
- bin 該參數(shù)指定了當(dāng)前包中可執(zhí)行文件的路徑和名稱
- engines 該參數(shù)指定了當(dāng)前包所依賴的Node.js版本范圍
知識(shí)點(diǎn)來(lái)了,package-lock.json 幫我們做了緩存,他會(huì)通過(guò) name + version + integrity
信息生成一個(gè)唯一的key,這個(gè)key能找到對(duì)應(yīng)的index-v5 下的緩存記錄 也就是npm cache 文件夾下的
如果發(fā)現(xiàn)有緩存記錄,就會(huì)找到tar包的hash值,然后將對(duì)應(yīng)的二進(jìn)制文件解壓到node_modeules