常見問題
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)過時的包,像下面一樣:
推薦使用檢查依賴包更強(qiáng)大的一個工具 npm-check,更強(qiáng)大分析包的能力以及可以通過加上參數(shù)提供交互式更新方式,詳情請參考其文檔說明。安裝完成后npm-check檢查項(xiàng)目依賴包,展示像下面一樣:
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í)行過程說起(此部分參考阮一峰老師的博客):
- 發(fā)出npm install命令
- npm 向 registry 查詢模塊壓縮包的網(wǎng)址
- 下載壓縮包,存放在~/.npm(本地NPM緩存路徑)目錄
- 解壓壓縮包到當(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 查看包的安裝路徑