###背景node
一直以爲npm、cnpm、yarn的安裝刪除基本同樣用哪一個都行,不過俗話說的好,實踐出真知,這裏記錄一下今天簡單測試獲得的結果總結。shell
可能會有錯誤,但願你們評論指正,十分感謝。npm
測試電腦系統:Macjson
###初始化測試
步驟:在三個文件夾裏分別執行如下命令spa
npm init
code
cnpm init
blog
yarn init
ci
結果都是添加了一個package.json文件rem
###安裝包
步驟:在三個文件夾裏分別用三種命令安裝包,而後在不一樣文件夾換命令安裝,查看文件變化狀況
npm i dayjs
- 較其餘兩種方式速度慢些
- 自動生成了package-lock.json
- node_modules中只有一個dayjs包
- dependencies依賴裏有dayjs
yarn add moment
安裝成功,package-lock.json中沒有moment版本鎖
cnpm i dayjs
- 沒有生成lock文件
- node_modules裏有兩個包(不重要)
- dayjs沒有加入到dependencies中,使用
cnpm i dayjs -S
才能加進去
yarn add dayjs
- 生成了yarn.lock文件
- node_modules裏有dayjs包和.yarn-integrity文件(感受是存儲依賴版本的hash值,
yarn check --integrity
可能會用到)- dependencies依賴裏有dayjs
npm i moment
安裝成功,yarn.lock中沒有moment版本鎖
###刪除包
刪除步驟嘗試略多,不贅述,直接一塊兒總結。
###測試結果
- 以下圖,上面是npm、yarn安裝的包,下面是cnpm安裝的包
npm i xxx
默認參數爲 -S,改變package.json和package-lock.json,<span style="color: red">同時會刪除掉cnpm安裝的包(無論cnpm是否帶參)</span>npm r xxx
,改變package.json和package-lock.json,<span style="color: red">刪除存在與依賴的包時,同時會把沒有在依賴裏的其餘包刪除掉(好比沒有加參數的用cnpm安裝的包),有在依賴裏的其餘包會被更新</span> 由變成
cnpm i xxx / cnpm r xxx
只能安裝 / 刪除包,不改變任何配置文件cnpm i xxx / cnpm r xxx
帶 -S / -D 參數時,只改變package.json,不改變鎖文件yarn add xxx
默認參數爲 -S,改變package.json和yarn.lockyarn remove xxx
<span style="color: red">找不到沒有寫入package.json依賴的包,沒法刪除;寫入package.json依賴的能夠刪除 </span>yarn remove xxx
改變package.json和package-lock.json,刪除存在與依賴的包時,<span style="color: red">同時會把沒有在依賴裏的其餘包刪除掉(好比沒有加參數的用cnpm安裝的包),有在依賴裏的其餘包會被更新</span>
###✨理論總結✨
能改變package.json的命令
- npm、yarn
- cnpm帶 -S / -D 參數時
鎖文件的改變
- package-lock.json文件只由npm改變
- yarn.lock文件只由yarn改變
- cnpm帶不帶參數都沒法影響兩個鎖文件
cnpm安裝的包會受到的影響
- npm、yarn安裝包時會把cnpm不帶 -S / -D 安裝的其餘包刪除
- npm、yarn刪除包時會把cnpm不帶 -S / -D 安裝的其餘包刪除,有在依賴裏的cnpm安裝的其餘包會被更新
- npm安裝包時會把cnpm帶 -S / -D 安裝的其餘包刪除,但package.json裏依賴不會被刪除,這時再執行npm刪除,會按照依賴把誤刪的其餘包裝回來,可是繼續安裝不會裝回來。(ps:有點秀~)
- yarn安裝包時會把cnpm帶 -S / -D 安裝的其餘包更新
- npm能直接刪除cnpm不帶 -S / -D 安裝的包
- yarn不能直接刪除cnpm不帶 -S / -D 安裝的包,會提示找不到包
(cnpm帶不帶 -S / -D歸根結底是有沒有在package.json中添加依賴)
###附一個小知識
yarn check //檢查package.json裏的依賴版本和yarn.lock裏是否一致 yarn check --integrity //檢查package.json裏的依賴版本的hash值和yarn.lock裏是否一致,有助於驗證包依賴沒有更改