一篇 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 中模塊的版本號前面既沒有 ~ 也沒有 ^ 就像下面那樣:html

"moment": "2.4.0"

上面的狀況屬於精確安裝模塊指定的版本號。經過命令參數-E,或者 --save-exact 來指定版本號安裝的。上述模塊對應的精確安裝命令:npm install --save-exact moment@2.4.0node

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

npm outdate此命令會列出項目中全部已通過時的包,像下面同樣:git

推薦使用檢查依賴包更強大的一個工具 npm-check,更強大分析包的能力以及能夠經過加上參數提供交互式更新方式,詳情請參考其文檔說明。安裝完成後npm-check檢查項目依賴包,展現像下面同樣:github

3.dependencies or devDependencies or optionalDependencies

dependencies(生產環境的依賴的包目錄)devDependencies(開發環境的依賴包目錄)npm

在項目的 package.json 使用命令 npm install --save moduel安裝的模塊會註冊到 dependencies 目錄中去(npm 5 開始 經過npm install不加--save 和npm install --save同樣 都是局部安裝並會把模塊自動寫入package.json中的dependencies裏。)json

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

當你 clone 下來了一個新項目在項目根目錄下執行npm install的時候是會同時安裝 dependencies 和 devDependencies中的全部依賴。當你的項目須要在生產環境中只須要安裝 dependencies 中的依賴時,執行的是npm install --production命令。(若是配置了NODE_ENV環境變量爲production,那麼執行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是所註冊在可選依賴裏的模塊包,在項目執行npm install --no-optional就能夠跳過可選包安裝。工具

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

4.npm config

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

能夠經過npm config get proxy查看你是否設置了npm 的代理。
npm config set registry https://registry.npm.taobao.org 改爲更快的淘寶源,解決出現安裝不了模塊或者速度慢的問題。

5.npm cache

當你使用命令 npm config get cache命令時 你會獲得你的本地 npm 緩存的完整路徑,npm 緩存是什麼呢,能夠先從npm install的執行過程提及(此部分參考阮一峯老師的博客):

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

實際上說一個模塊安裝之後,本地其實保存了兩份。一份是~/.npm目錄下的壓縮包,另外一份是node_modules目錄下解壓後的代碼。可是,運行npm install的時候,只會檢查 node_modules 目錄,而不會檢查~/.npm目錄。若是一個模塊在~/.npm下有壓縮包,可是沒有安裝在node_modules目錄中,npm 依然會從遠程倉庫下載一次新的壓縮包。

阮老師在當時文中提到的離線安裝時所說的有不少弊端的npm install --cache-min命令已經在npm 5.0.0開始被 deprecated 了

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

咱們想利用已經在緩存中以前已經備份的模塊實現離線模塊安裝的的 cache 機制已經在V5的時候重寫了,緩存將由 npm 來全局維護再也不須要開發人員操心,離線安裝時將再也不嘗試鏈接網絡,而是降級嘗試從緩存中讀取,或直接失敗。就是若是你 offline ,npm將無縫地使用您的緩存。如下新增參數命令翻譯自npm v5.0.0的release

  • 一個新的--prefer-offline選項將使npm跳過任何有條件的請求(304檢查)過期的緩存數據,而且只有在緩存中丟失了某些內容時才能訪問網絡
  • 一個新的--prefer-online選項,它將強制 npm 從新驗證緩存數據(使用304次檢查),忽略任何過期檢查,並用從新驗證的新數據刷新緩存。
  • 一個新的 --offline 選項將強制npm使用緩存或退出。若是試圖安裝的任何內容還沒有存在於緩存中,它將報 ENOTCACHED錯誤。
  • 一個新的npm cache verify命令,它將對你的緩存進行辣雞回收,減小不須要的東西佔據的磁盤使用量,而且會對索引和內容進行全面的完整性驗證。

6.package-lock.json 問題

項目中若是是用 npm V5 以上版本就會有這麼一個詳細記錄安裝模塊的細節的文件。肯定當前安裝的包的依賴,以便後續從新安裝的時候生成相同的依賴,而忽略項目開發過程當中有些依賴已經發生的更新。

當你想經過搜索引擎瞭解package-lock.json 問題的時候,你可能會被「坑」字吸引過去,你可能會看到過「若是手動修改了 package.json 文件中已有模塊的版本,直接執行npm install不會安裝新指定的版本,只能經過npm install xxx@yy更新」 ,不過這是 V5.0.0 的問題,如今V5.4.2版本後若是改了package.json,且package.json和lock文件不一樣,那麼執行npm i時npm會根據package中的版本號以及語義含義去下載最新的包,並更新至lock。詳見這個知乎回答

其他常見命令

  • npm ls 查看安裝的模塊
  • npm uninstall 卸載模塊
  • npm update 更新模塊
  • npm help 查看某條命令的詳細幫助
  • npm version 查看模塊版本
  • npm view 查看模塊的註冊信息
  • npm publish 發佈模塊
  • npm adduser 用戶登陸
  • npm init 初始化項目,並在項目文件夾中引導建立一個package.json文件
  • npm root 查看包的安裝路徑
相關文章
相關標籤/搜索