你不一定知道的npm那些知識(shí)

一、顯示npm install 詳細(xì)信息

按照如下設(shè)置后双炕,可以在npm install 后查看每一個(gè)步驟贾节,方便查看安裝的詳細(xì)信息汁汗,對(duì)出現(xiàn)異常情況排查原因非常有用,比如栗涂,可以清楚的知道安裝某個(gè)包時(shí)具體卡在什么環(huán)節(jié)等知牌。

1、顯示info級(jí)別信息

推薦設(shè)置這個(gè)級(jí)別就可以了
npm config set loglevel info


image.png

2斤程、顯示verbose級(jí)別信息

這個(gè)級(jí)別比info級(jí)別更詳細(xì)
npm config set loglevel verbose

image.png

3角寸、顯示其他級(jí)別信息

https://docs.npmjs.com/misc/config#loglevel

image.png

二、查看項(xiàng)目某個(gè)庫(kù)或所有庫(kù)的版本號(hào)及依賴(lài)關(guān)系

1、查看某個(gè)庫(kù)的版本號(hào)及依賴(lài)關(guān)系
npm ls 包名

//  查看 base64-js版本及依賴(lài)關(guān)系
npm ls base64-js
image.png

2扁藕、查看項(xiàng)目所有庫(kù)版本及依賴(lài)關(guān)系

// 查看所有依賴(lài)的版本(當(dāng)前項(xiàng)目)
npm ls
// 查看所有依賴(lài)的版本(全局 非當(dāng)前項(xiàng)目)
npm ls -g
// 查看所有一級(jí)依賴(lài)的版本
npm ls --depth 0  或 npm ls --depth=0
// 查看所有一級(jí)依賴(lài)及二級(jí)依賴(lài)的版本
npm ls --depth=1 或 npm ls --depth 1
// 查看所有三級(jí)依賴(lài)及三級(jí)依賴(lài)的版本
npm ls --depth=3 或 npm ls --depth 3
image.png

3沮峡、查看項(xiàng)目dependencies或devDependencies所有庫(kù)版本及依賴(lài)關(guān)系

// 查看所有dependencies一級(jí)依賴(lài)的版本
npm list -depth 0 -prod true
// 查看所有devDependencies一級(jí)依賴(lài)的版本
npm list -depth 0 -dev true

三、庫(kù)版本解釋

image.png

庫(kù)版本解釋 截圖自: 2018 年了亿柑,你還是只會(huì) npm install 嗎邢疙?

四、鎖定庫(kù)版本

1橄杨、通過(guò)prefix控制(信息來(lái)源:npm-shrinkwrap鎖定依賴(lài)

當(dāng)運(yùn)行 npm update 時(shí)秘症,

  • a、^1.5.1 【限制主版本號(hào)】允許安裝版本號(hào)大于 1.5.1 但小于 2.0.0 版本的模塊
    npm默認(rèn)采用這種方式

  • b式矫、~1.5.1 【限制次要版本】 允許安裝版本號(hào)大于 1.5.1 但小于 1.6.0 版本的模塊
    可通過(guò) npm config set save-prefix="~"將默認(rèn)的^修改為~

  • c乡摹、1.5.1 【精確控制】允許安裝版本號(hào)大于 1.5.1
    可通過(guò)npm config set save-exact true 將默認(rèn)的^取除掉

在此個(gè)人推薦采用~1.5.1的方式;

2采转、通過(guò)package-lock.json控制

npm 5.0+ 后 npm install時(shí)會(huì)自動(dòng)創(chuàng)建package-lock.json文件聪廉;package-lock.json的出現(xiàn),npm install規(guī)則發(fā)生了三次變化:(信息來(lái)源: npm install 生成的package-lock.json是什么文件故慈?有什么用板熊?

  • a、 npm 5.0.x版本
    不管package.json怎么變化察绷,npm install 都會(huì)根據(jù)package-lock.json 文件下載干签;

  • b、 npm 5.1.0+版本
    npm install會(huì)無(wú)視package-lock.json拆撼, 根據(jù)package.json下載容劳,也就是package.json的權(quán)限會(huì)高于package-lock.json;

  • c闸度、 npm 5.4.2+版本
    npm install時(shí) 如果package.json與package-lock.json不一致竭贩,則根據(jù)package.json的語(yǔ)法規(guī)則進(jìn)行下載;如果一致時(shí)莺禁,則都會(huì)根據(jù)package-lock.json下載留量;

  • 補(bǔ)充知識(shí) : npx 是在npm 5.2.0+版本支持的 http://www.ruanyifeng.com/blog/2019/02/npx.html

3、通過(guò)shrinkwrap控制 (信息來(lái)源:npm-shrinkwrap鎖定依賴(lài)

  • 步驟1哟冬、如果不能保證package.json文件定義的依賴(lài)與node_modules下已安裝的依賴(lài)是匹配楼熄、無(wú)冗余的,建議執(zhí)行 清理依賴(lài)并重新安裝(rm -rf node_modules && npm install )或者精簡(jiǎn)依賴(lài)--移除無(wú)關(guān)的包(npm prune )

  • 步驟2浩峡、npm shrinkwrap 運(yùn)行后孝赫,如果原來(lái)有package-lock.json文件的,將單純的重命名為npm-shrinkwrap.json

  • 步驟3红符、npm install 后,記得運(yùn)行 npm shrinkwrap 以便更新npm-shrinkwrap.json文件

也就是使用shrinkwrap控制庫(kù)版本時(shí)需要執(zhí)行三條命令;

package-lock.json與npm-shrinkwrap.json的作用類(lèi)似预侯,但是區(qū)別如下:

a致开、如果根目錄下同時(shí)存在這兩個(gè)文件,則以npm-shrinkwrap.json為準(zhǔn)萎馅;
b双戳、npm-shrinkwrap.json在npm v2、npm v3糜芳、npm v4 就已經(jīng)支持了飒货,但是package-lock.json 僅在npm v5+及以后才支持;
c峭竣、npm-shrinwkrap.json 可以被包含到發(fā)布包塘辅,而 package-lock.json 不行,保證用戶(hù)可以自由管理依賴(lài)包皆撩;

4扣墩、棄用npm,采用yarn扛吞;

五呻惕、查看npm配置信息

1、查看簡(jiǎn)要信息 npm config list

image.png

2滥比、查看所有信息 npm config list -l

六亚脆、清除npm包緩存

1、刪除 node_modules及package-lock.json盲泛;
2濒持、執(zhí)行 npm cache clean --force 刪除所有緩存 (其實(shí)清的是 ~/.npm/_cacache文件夾中的數(shù)據(jù)-https://github.com/sliwey/blog/issues/1),如果你本地有多個(gè)項(xiàng)目查乒,不是很推薦這種做法(因?yàn)榭赡芷渌?xiàng)目可能用到了這里面的緩存了) 推薦采用下面一點(diǎn) 七弥喉、某個(gè)項(xiàng)目不使用npm公共緩存

七、某個(gè)項(xiàng)目不使用npm公共緩存

1玛迄、先查看該項(xiàng)目的npm緩存目錄在哪里
可以通過(guò)npm config get cache查看當(dāng)前npm的緩存在哪里由境;下圖說(shuō)明在npm公共緩存目錄中

image.png

2、在該項(xiàng)目根目錄下創(chuàng)建.npmrc文件蓖议,并在該文件中寫(xiě)入

cache=.npm

3虏杰、確認(rèn)npm緩存目錄在哪里,如下圖這么顯示說(shuō)明成功了

image.png

參考:http://claude-ray.com/2019/12/06/npm-install-without-cache/

八勒虾、使用淘寶鏡像

這個(gè)大家應(yīng)該都知道纺阔,不解釋了

npm install -g cnpm --registry=https://registry.npm.taobao.org

npm config set registry https://registry.npm.taobao.org 設(shè)置淘寶鏡像

npm config set registry https://registry.npmjs.org/ 設(shè)置原始npm源

推薦安裝使用nrm來(lái)管理源

九、npm 其他知識(shí)

1修然、升級(jí)npm
npm install npm@latest -g
2笛钝、使用npx 執(zhí)行某個(gè)插件 (如果項(xiàng)目中沒(méi)有质况,則安裝最新的插件)
npx uglify-js -v
npx uglify-js -m -- test.js >>yasuo.js
npx webpack -v
npx node@10 -v npx node@12 -v 可以避免使用nvm之類(lèi)的工具
3、npm install xx -g 后安裝目錄可以通過(guò) npm root -g查看玻靡。例如 Windows上的為 C:\Users\你的用戶(hù)名\AppData\Roaming\npm\node_modules
4结榄、查看npm包詳細(xì)信息 npm view 包名

image.png

5、查看所有可以版本
npm view 包名 versions
image.png

6囤捻、查看當(dāng)前項(xiàng)目可以的新版本npm outdated
image.png

7臼朗、查看全局安裝的npm包
npm list -g --depth 0

+-- @vue/cli@4.5.12
+-- browser-sync@2.26.13
+-- browserify@17.0.0
+-- cnpm@6.1.1
+-- conventional-changelog@3.1.24
+-- conventional-changelog-cli@2.1.1
+-- documentation@13.2.5
+-- f2elint@1.2.0
+-- gulp@4.0.2
+-- jsdoc@3.6.7
+-- lerna@4.0.0
+-- mp-cli-lc@3.0.1
+-- mrm@2.6.1
+-- nodemon@2.0.6
+-- nrm@1.2.1
+-- pm2@4.5.5
+-- rimraf@3.0.2
+-- rollup@2.53.1
+-- spy-debugger@3.8.6
+-- ts-node@10.0.0
+-- typescript@4.3.2
+-- verdaccio@4.12.0
+-- whistle@2.5.30
standard-version

image.png

8、如果安裝的模塊依賴(lài)了c++蝎土,則安裝過(guò)程中會(huì)隱性安裝node-gyp视哑,node-gyp可以編譯這些依賴(lài)c++模塊的模塊,但是node-gyp在首次編譯時(shí)會(huì)依賴(lài)node源碼誊涯,所以又會(huì)去悄悄去下載node挡毅,雖然安裝時(shí)設(shè)置了淘寶鏡像,但是此時(shí)是無(wú)效的醋拧,可以使用 disturl 來(lái)解決 npm config set disturl https://npm.taobao.org/mirrors/node/
9慷嗜、node-sass安裝時(shí)會(huì)從github上下載一個(gè)叫binding.node的文件,而github releases里的文件都托管在亞馬遜的服務(wù)器上丹壕,導(dǎo)致國(guó)內(nèi)無(wú)法訪問(wèn)庆械,因此可以使用 sass_binary_site 來(lái)解決 npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/,類(lèi)似的情況還有很多:

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips/
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set puppeteer_download_host https://npm.taobao.org/mirrors/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
npm config set sentrycli_cdnurl https://npm.taobao.org/mirrors/sentry-cli/
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set python_mirror https://npm.taobao.org/mirrors/python/

此外菌赖,node-sass版本與node版本相關(guān)聯(lián):


image.png

使用nvm或n 進(jìn)行版本切換時(shí)缭乘,可能會(huì)出現(xiàn)binding.node匹配不到的情況,此時(shí)可通過(guò)

npm cache clean -f
npm rebuild node-sass 或 刪除node_modules及package-lock.json 文件重新安裝

類(lèi)似node-sass從國(guó)外服務(wù)器下載東西還有很多 琉用,有時(shí)需要在Github上克隆一份該模塊的源碼進(jìn)行分析堕绩,搜索包含base、binary邑时、cdn奴紧、config、dist晶丘、download黍氮、host、mirror浅浮、npm沫浆、site、url等這樣的關(guān)鍵詞(自行探索滚秩,通匙ㄖ矗「mirror」的匹配度最高) https://mp.weixin.qq.com/s/u4oI_tdYDIFQeTPSifCt7g#

10、在項(xiàng)目中新增一個(gè)重裝的指令
rimraf 是一個(gè)node版的 rm -rf
npm i -g rimraf

{
  "scripts": {
    "reinstall": "rimraf node_modules &&  rimraf   package-lock.json && npm i"
  }
}

11郁油、依賴(lài)相同的包的安裝機(jī)制
如:A和B包都依賴(lài)C本股,那么C會(huì)因npm版本的不同安裝至不同的目錄攀痊。如果npm版本為2及以下,則是


image.png

如果npm版本為3及以上痊末,
image.png

若碰到依賴(lài)的版本不同會(huì)怎么樣呢蚕苇?
假設(shè)A、B 依賴(lài)D (v0.0.1)凿叠,C依賴(lài)D(v0.0.2):
image.png

如果C的順序在A,B的前面(npm intsall時(shí) package.json 里依賴(lài)的順序會(huì)依次解析)


image.png

推薦看這篇文章:https://www.zoo.team/article/npm-details

12嚼吞、依賴(lài)類(lèi)型的區(qū)別

  • a盒件、dependencies
    生成環(huán)境及開(kāi)發(fā)環(huán)境的依賴(lài)
  • b、devDependencies
    開(kāi)發(fā)環(huán)境依賴(lài)
  • c舱禽、optionalDependencies
    可選的依賴(lài)包炒刁,(可有可無(wú)的依賴(lài))
  • d、peerDependencies
    同等依賴(lài)誊稚,必須先安裝某些包翔始,如ant-design@3.x的配置如下
"peerDependencies": { 
  "react": ">=16.9.0", 
  "react-dom": ">=16.9.0" 
 }, 
  • e、bundledDependencies
    捆綁依賴(lài)包

13里伯、需要修改某個(gè)npm包城瞎,但不想聯(lián)系作者修改/發(fā)起pull request或者自己下載代碼下來(lái)修改完后再發(fā)布npm

可以使用patch-package npm包,在安裝完這個(gè)npm包后疾瓮,在package.json中的script添加"postinstall": "patch-package"脖镀,然后修改你想要修改的npm包源碼文件(在項(xiàng)目根目錄node_modules文件夾里),然后執(zhí)行npx patch-package 你想要修改的npm包名稱(chēng)狼电,即可蜒灰。詳細(xì)步驟請(qǐng)見(jiàn):使用patch-package定制node_modules 中的依賴(lài)包

十、推薦資料

1肩碟、[譯]npm入門(mén)指南
2强窖、npm-shrinkwrap鎖定依賴(lài)
3、在JavaScript項(xiàng)目中鎖定npm依賴(lài)包版本
4削祈、 npm 官方文檔 https://docs.npmjs.com/cli/v6/commands/npm-ls
5翅溺、 中文文檔 https://www.npmjs.cn/getting-started/what-is-npm/
6、npm 模塊安裝機(jī)制簡(jiǎn)介 http://www.ruanyifeng.com/blog/2016/01/npm-install.html
7岩瘦、手把手教你快速制作基于Element UI組件npm包 http://www.reibang.com/p/b375e1eb549b

十一未巫、 npm與yarn、pnpm及相關(guān)

(一) 由facebook及google支持的yarn

1启昧、查看包引入
有時(shí)npm嵌套的太深叙凡,我們不知道某個(gè)包是怎么引進(jìn)來(lái)的,這時(shí)我們可以使用 yarn why <package-name> 來(lái)查看它是誰(shuí)引入的

(二) 由Zoltan Kochan 開(kāi)發(fā)的pnpm

1密末、為什么現(xiàn)在我更推薦 pnpm 而不是 npm/yarn?
2、Zoltan Kochan--Why should we use pnpm?

(三) node 內(nèi)置的npm

Node.js 16.9.0 開(kāi)始內(nèi)置Corepack楞捂,其將默認(rèn)支持pnpm纬向、yarn包管理器

十二、 推薦網(wǎng)站

1追城、查看某個(gè)npm包被哪個(gè)npm包作為依賴(lài)引用了,例如handlebars包:
https://cnpmjs.org/package/handlebars

image.png

2燥撞、分析某個(gè)npm https://npm.devtool.tech/
例如查看cdn: https://npm.devtool.tech/cdn/handlebars

image.png

3座柱、在線運(yùn)行npm
https://npm.runkit.com/js-utils-lc

image.png

4、查看npm包的源文件
a. https://cdn.jsdelivr.net/npm/js-utils-lc/

image.png

b. https://www.jsdelivr.com/package/npm/js-utils-lc

image.png

c. https://npm.runkit.com/js-utils-lc

image.png

5物舒、查看npm包下載量及對(duì)應(yīng)的github等信息
a. https://openbase.com/js/js-utils-lc
b. https://snyk.io/advisor/npm-package/js-utils-lc

6色洞、 引用最新的cdn
https://unpkg.com/js-utils-lc@latest/

十三、nvm注意事項(xiàng)

1 設(shè)置默認(rèn)版本 nvm alias default v8.9.1
2 查看nvm安裝的目錄echo $NVM_DIR

十四冠胯、gulp v3.9 與Node12不兼容解決方案

使用Node 12 運(yùn)行g(shù)ulp 3.9時(shí)會(huì)報(bào)primordials is not defined 錯(cuò)誤火诸,可以在package.json加入如下代碼解決(https://stackoverflow.com/questions/55921442/how-to-fix-referenceerror-primordials-is-not-defined-in-node-js)

{
  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  },
  "resolutions": {
  "graceful-fs": "^4.2.10"
  }
}

以上親測(cè)有效。(原理是npm-force-resolutions 可以控制依賴(lài)的依賴(lài)荠察,有點(diǎn)類(lèi)似yarn的 selective dependency
)
或者(以下方法待驗(yàn)證:https://blog.csdn.net/qq_22713201/article/details/122329418
1置蜀、項(xiàng)目根目錄新建npm-shrinkwrap.json
2、npm-shrinkwrap.json內(nèi)容修改如下:

{
  "dependencies": {
    "graceful-fs": {
        "version": "4.2.2"
     }
  }
}

十五悉盆、專(zhuān)門(mén)分析npm大小的網(wǎng)站

https://bundlejs.com/

十六盯荤、npm下載量對(duì)比分析

https://npmtrends.com
例如:/angular-vs-react-vs-vue

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舀瓢,隨后出現(xiàn)的幾起案子廷雅,更是在濱河造成了極大的恐慌,老刑警劉巖京髓,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航缀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堰怨,警方通過(guò)查閱死者的電腦和手機(jī)芥玉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)备图,“玉大人灿巧,你說(shuō)我怎么就攤上這事±夸蹋” “怎么了抠藕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒋困。 經(jīng)常有香客問(wèn)我盾似,道長(zhǎng),這世上最難降的妖魔是什么雪标? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任零院,我火速辦了婚禮溉跃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘告抄。我一直安慰自己撰茎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布打洼。 她就那樣靜靜地躺著龄糊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪募疮。 梳的紋絲不亂的頭發(fā)上绎签,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音酝锅,去河邊找鬼。 笑死奢方,一個(gè)胖子當(dāng)著我的面吹牛搔扁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟋字,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稿蹲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鹊奖?” 一聲冷哼從身側(cè)響起苛聘,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忠聚,沒(méi)想到半個(gè)月后设哗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡两蟀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年网梢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赂毯。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡战虏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出党涕,到底是詐尸還是另有隱情烦感,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布膛堤,位于F島的核電站手趣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏骑祟。R本人自食惡果不足惜回懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一气笙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怯晕,春花似錦潜圃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吧凉,卻和暖如春隧出,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阀捅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工胀瞪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饲鄙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓凄诞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忍级。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帆谍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345