1、npm是node.js的包管理工具
- 每個版本號都形如
1.2.3
,由三個部分組成,依次叫做“主版本號”、“次版本號”和“修訂號” - 當新版本無法兼容基於前一版本的代碼時,則提高主版本號
- 當新版本新增了功能與特性,但仍兼容前一版本的代碼時,則提高次版本號
- 當新版本僅僅修正漏洞或者增強效率,仍然兼容前一版本代碼,則提高修訂號
默認情況下,npm install --save
下載的都是最新版本,並且會在package.json
文件里登記一個最優版本號,其形式如下所示:
"dependencies": { "express": "^4.10.0", "ejs": "~2.3.2" }
2、本地安裝優於全局安裝
npm安裝依賴包時有兩種模式:本地安裝或者全局安裝。本地安裝表示該依賴包會被下載到當前項目的node_modules
文件夾里,而全局變量則會把它安裝到系統級別的目錄里。比如用npm install -g typescript
全局安裝typescript這個包后,我們就可以在系統的任何位置使用tsc
命令來編譯TypeScript文件。這本身沒有什么錯,有些Node包的命令確實需要在任何位置都能使用,但全局安裝依賴包也有隱患:使用你的應用的用戶如果沒有全局安裝typescript怎么辦?或者如果她所安裝的版本不兼容怎么辦?
所以,安裝依賴包最好遵循以下實踐:
- 盡量不全局安裝依賴包,除非是typescript,grunt這種確實有需要的
- 所有的依賴包都應該本地安裝,即使是那些已經全局安裝過的
本地安裝的依賴包,其命令都位於當前項目的node_module/.bin
文件夾下。package.json
文件的"scripts"
部分所使用的依賴包命令都會先去這個文件夾尋找
package.json
里有這么一段:
"scripts": { "build:js": "tsc" }
那么,當你運行npm run build:js
時,npm會先去當前項目的node_module/.bin
里尋找對應的執行文件,如果你沒有本地安裝,才會使用全局級別的命令。
3、npm常用命令的區別
npm i 是npm install的縮寫
npm i 有以下幾種方式:
npm i module_name # 安裝模塊到項目目錄下 npm i module_name -g # -g 的意思是將模塊安裝到全局,具體安裝到磁盤哪個位置,要看 npm config prefix 的位置。 npm i module_name -S(-save) # --save 的意思是將模塊安裝到項目目錄下,並在package文件的dependencies節點寫入依賴。 npm i module_name -D(--save-dev) # --save-dev 的意思是將模塊安裝到項目目錄下,並在package文件的devDependencies節點寫入依賴。
具體說明如下:
npm i
module_name
- 會把moudule_name包安裝到node_modules目錄中
- 不會修改package.json
- 之后運行npm i命令時,不會自動安裝moudule_name
npm i module_name -g
- 安裝模塊到全局,不會在項目node_modules目錄中保存模塊包。
- 不會將模塊依賴寫入devDependencies或dependencies 節點。
- 運行 npm i 初始化項目時不會下載模塊。
npm i
module_name
-S
- 會把moudule_name包安裝到node_modules目錄中
- 會在package.json的dependencies屬性下添加moudule_name
- 之后運行npm i命令時,會自動安裝moudule_name到node_modules目錄中
- 之后運行npm i --production或者注明NODE_ENV變量值為production時,會自動安裝msbuild到node_modules目錄中,即是在線上環境運行時會將包安裝
npm i
module_name
–D
- 會把moudule_name包安裝到node_modules目錄中
- 會在package.json的devDependencies屬性下添加moudule_name
- 之后運行npm i命令時,會自動安裝moudule_name到node_modules目錄中
- 之后運行npm i –production或者注明NODE_ENV變量值為production時,不會自動安裝moudule_name到node_modules目錄中
使用原則:
devDependencies 節點下的模塊是我們在開發時需要用的,比如項目中使用的 gulp ,壓縮css、js的模塊。這些模塊在我們的項目部署后是不需要的,所以我們可以使用-D的形式安裝。像 emoudule_namepress 這些模塊是項目運行必備的,應該安裝在 dependencies 節點下,所以我們應該使用-S的形式安裝。
總結為一句話:運行時需要用到的包使用–S,否則使用–D。