一篇NPM小記

常見問題

1.npm 的package.json中的~和^

  • 會匹配最近的小版本依賴包,比如1.2.3會匹配所有1.2.x版本,但是不包括1.3.0
  • 會匹配最新的大版本依賴包,比如1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0

你也有可能會看見在 package.json 中模塊的版本號前面既沒有 ~ 也沒有 ^ 就像下面那樣:

"moment": "2.4.0"

上面的情況屬于精確安裝模塊指定的版本號。通過命令參數(shù)-E,或者 --save-exact 來指定版本號安裝的。上述模塊對應(yīng)的精確安裝命令:npm install --save-exact moment@2.4.0

2.npm outdate與第三方工具npm-check

npm outdate此命令會列出項(xiàng)目中所有已經(jīng)過時的包,像下面一樣:

image

推薦使用檢查依賴包更強(qiáng)大的一個工具 npm-check,更強(qiáng)大分析包的能力以及可以通過加上參數(shù)提供交互式更新方式,詳情請參考其文檔說明。安裝完成后npm-check檢查項(xiàng)目依賴包,展示像下面一樣:

image

3.dependencies or devDependencies or optionalDependencies

dependencies(生產(chǎn)環(huán)境的依賴的包目錄)devDependencies(開發(fā)環(huán)境的依賴包目錄)

在項(xiàng)目的 package.json 使用命令 npm install --save moduel安裝的模塊會注冊到 dependencies 目錄中去(npm 5 開始 通過npm install不加--save 和npm install --save一樣 都是局部安裝并會把模塊自動寫入package.json中的dependencies里。)

npm install --dev module 并會安裝模塊并自動寫入package.json中的 devDependencies 里。

當(dāng)你 clone 下來了一個新項(xiàng)目在項(xiàng)目根目錄下執(zhí)行npm install的時候是會同時安裝 dependencies 和 devDependencies中的所有依賴。當(dāng)你的項(xiàng)目需要在生產(chǎn)環(huán)境中只需要安裝 dependencies 中的依賴時,執(zhí)行的是npm install --production命令。(如果配置了NODE_ENV環(huán)境變量為production,那么執(zhí)行npm install就只安裝dependencies里面的包。安裝完后可以用npm ls查看安裝的包的情況。)

With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies.

此外,你還有可能看到形如:

"optionalDependencies": {
    "gulp": "^3.9.1"
  }

optionalDependencies 是你在使用npm install npm install --save-optional gulp是所注冊在可選依賴?yán)锏哪K包,在項(xiàng)目執(zhí)行npm install --no-optional就可以跳過可選包安裝。

Tips : 在存在 package-lock.json 時npm install --no-optional你可能會發(fā)現(xiàn)依舊裝上了可選模塊,(它的issue頁討論),此時你可能還要加上另外一個參數(shù)執(zhí)行npm install --no-optional --no-package-lock才能如愿。

4.npm config

查看和管理npm的基礎(chǔ)配置。npm config ls -l

可以通過npm config get proxy查看你是否設(shè)置了npm 的代理。
npm config set registry https://registry.npm.taobao.org改成更快的淘寶源,解決出現(xiàn)安裝不了模塊或者速度慢的問題。

5.npm cache

當(dāng)你使用命令 npm config get cache命令時 你會得到你的本地 npm 緩存的完整路徑,npm 緩存是什么呢,可以先從npm install的執(zhí)行過程說起(此部分參考阮一峰老師的博客):

  1. 發(fā)出npm install命令
  2. npm 向 registry 查詢模塊壓縮包的網(wǎng)址
  3. 下載壓縮包,存放在~/.npm(本地NPM緩存路徑)目錄
  4. 解壓壓縮包到當(dāng)前項(xiàng)目的node_modules目錄

實(shí)際上說一個模塊安裝以后,本地其實(shí)保存了兩份。一份是~/.npm目錄下的壓縮包,另一份是node_modules目錄下解壓后的代碼。但是,運(yùn)行npm install的時候,只會檢查 node_modules 目錄,而不會檢查~/.npm目錄。如果一個模塊在~/.npm下有壓縮包,但是沒有安裝在node_modules目錄中,npm 依然會從遠(yuǎn)程倉庫下載一次新的壓縮包。

阮老師在當(dāng)時文中提到的離線安裝時所說的有很多弊端的npm install --cache-min命令已經(jīng)在npm 5.0.0開始被 deprecated 了

--cache-min and --cache-max have been deprecated. (#15666)

我們想利用已經(jīng)在緩存中之前已經(jīng)備份的模塊實(shí)現(xiàn)離線模塊安裝的的 cache 機(jī)制已經(jīng)在V5的時候重寫了,緩存將由 npm 來全局維護(hù)不再需要開發(fā)人員操心,離線安裝時將不再嘗試連接網(wǎng)絡(luò),而是降級嘗試從緩存中讀取,或直接失敗。就是如果你 offline ,npm將無縫地使用您的緩存。以下新增參數(shù)命令翻譯自npm v5.0.0的release

  • 一個新的--prefer-offline選項(xiàng)將使npm跳過任何有條件的請求(304檢查)過時的緩存數(shù)據(jù),并且只有在緩存中丟失了某些內(nèi)容時才能訪問網(wǎng)絡(luò)
  • 一個新的--prefer-online選項(xiàng),它將強(qiáng)制 npm 重新驗(yàn)證緩存數(shù)據(jù)(使用304次檢查),忽略任何過時檢查,并用重新驗(yàn)證的新數(shù)據(jù)刷新緩存。
  • 一個新的 --offline 選項(xiàng)將強(qiáng)制npm使用緩存或退出。如果試圖安裝的任何內(nèi)容尚未存在于緩存中,它將報 ENOTCACHED錯誤。
  • 一個新的npm cache verify命令,它將對你的緩存進(jìn)行辣雞回收,減少不需要的東西占據(jù)的磁盤使用量,并且會對索引和內(nèi)容進(jìn)行全面的完整性驗(yàn)證。

6.package-lock.json 問題

項(xiàng)目中如果是用 npm V5 以上版本就會有這么一個詳細(xì)記錄安裝模塊的細(xì)節(jié)的文件。確定當(dāng)前安裝的包的依賴,以便后續(xù)重新安裝的時候生成相同的依賴,而忽略項(xiàng)目開發(fā)過程中有些依賴已經(jīng)發(fā)生的更新。

你可能會看到過“如果手動修改了 package.json 文件中已有模塊的版本,直接執(zhí)行npm install不會安裝新指定的版本,只能通過npm install xxx@yy更新” ,不過這是 V5.0.0 的問題,現(xiàn)在V5.4.2版本后如果改了package.json,且package.json和lock文件不同,那么執(zhí)行npm i時npm會根據(jù)package中的版本號以及語義含義去下載最新的包,并更新至lock。詳見這個知乎回答

其余常見命令

  • npm ls 查看安裝的模塊
  • npm uninstall 卸載模塊
  • npm update 更新模塊
  • npm help 查看某條命令的詳細(xì)幫助
  • npm version 查看模塊版本
  • npm view 查看模塊的注冊信息
  • npm publish 發(fā)布模塊
  • npm adduser 用戶登錄
  • npm init 初始化項(xiàng)目,并在項(xiàng)目文件夾中引導(dǎo)創(chuàng)建一個package.json文件
  • npm root 查看包的安裝路徑
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • npm是什么 NPM的全稱是Node Package Manager,是隨同NodeJS一起安裝的包管理和分發(fā)工具...
    build1024閱讀 8,143評論 0 9
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey閱讀 6,367評論 2 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,618評論 19 139
  • 描述 npm從以下來源獲取配置值,按優(yōu)先級排序: 命令行標(biāo)記 在命令行上放置--foo bar設(shè)置foo配置參數(shù)為...
    竹天亮閱讀 44,507評論 0 8
  • Node.js使得在服務(wù)器端使用JavaScript編寫應(yīng)用程序成為可能。它是基于V8Javascript運(yùn)行時并...
    間陽幕賓閱讀 1,686評論 0 5

友情鏈接更多精彩內(nèi)容