npm 依賴管理的一個重要特性是採用了語義化版本 (semver) 規範,做爲依賴版本管理方案。node
semver 約定一個包的版本號必須包含3個數字,格式必須爲 MAJOR.MINOR.PATCH
, 意爲 主版本號.次版本號.修訂版本號
.webpack
MAJOR 主版本號,對應大的版本號迭代,作了不兼容舊版的修改時要更新 MAJOR 版本號 MINOR 次版本號,對應小版本迭代,發生兼容舊版API的修改或功能更新時,更新MINOR版本號 PATCH 修訂號,對應修訂版本號,通常針對修復 BUG 的版本號
例如:git
0.y.z 表示開發階段,一切可能隨時改變,非穩定版。 1.0.0 界定此版本爲初始穩定版,後面的一切更新都基於此版本進行修改
在常規僅包含數字的版本號以外,semver 還容許在 MAJOR.MINOR.PATCH 後追加 - 後跟點號分隔的標籤,做爲預發佈版本標籤 - Prerelese Tags,一般被視爲不穩定、不建議生產使用的版本。
例如:web
在進行包管理時,爲了保證安裝依賴的兼容性,必須對依賴包版本進行限定.npm
版本限定的語法簡述爲爲 [範圍描述]<版本號描述>
。
1.範圍描述
範圍描述可選,必須配和版本描述肯定範圍,沒法獨立存在。json
< 小於某一版本號 <= 小於等於某一版本號 > 大於某一版本號 >= 大於等於某一版本號 = 等於某一版本號,沒有意義和直接寫該版本號同樣 - 某個範圍,語法爲 <版本描述>-<版本描述>
例如:緩存
1.2.3-2 支持 >=1.2.3 <3.0.0 的版本 1.x.1 支持 >=1.0.1 <1.1.0 的版本 1 表示 >=1.0.0 <2.0.0 其他任意位置爲空類似 1.0 >= 1.0.0 < 1.1.0
~,^工具
~,^ 的表述須要結合具體的包管理工具和版本號規則來肯定,可是對於通常使用記住以下原則: ^ 是確保版本兼容性時,默認對次版本號的限定約束 ~ 是確保版本兼容性時,默認對補丁號的約束
例如:url
~1.1.1 >=1.1.1 <1.2.0 ~1.1 >=1.1.0 <1.2.0 ~1 >=1.0.0 <2.0.0 ^1.1.1 >=1.1.1 <2.0.0 ^0.1.1 >=0.1.1 <0.2.0 ^0.0.1 >=0.0.1 <0.0.2
2.版本號描述spa
* 通配符,相似 glob 模式 * x,X 約等於 * 號,一般用於次版本和補丁的通配
例如:
* 支持 >= 0.0.0 的版本 x 支持 >= 0.0.0 的版本
npm outdated [[<@scope>/]<pkg> ...]
npm uninstall [-g] <Module Name> [--save] [-dev] //卸載模塊
npm install/i <Module Name> [--force] //安裝某個包
npm i //當存在package.json時,使用命令可所有安裝包 npm i <module name>@1.0.0 //安裝指定版本的模塊 npm i <module name>@latest //安裝最新版本 npm i <module name@">=0.1.0 <0.2.0" npm i <git url>
^是npm默認版本符號,用npm i --save, npm會自動在package.json中添加。若是使用--save-exact,就不會有任何符號。
在生產環境,使用npm install --production安裝 dependencies 部分的模塊;
在開發環境,npm i ,安裝全部devDependencies 和 dependencies裏面的模塊;
npm install/i <Module Name> //本地安裝 npm install/i <Module Name> --global/-g //全局安裝
1.安裝位置
npm root -g //查看全局node_modules路徑 npm root //查看本地node_modules路徑
全局安裝:通常在 Users用戶名AppDataRoaming 目錄下。
本地安裝:通常安裝在指定項目的node_modules文件夾下。
2.調用方式
全局安裝:用戶能夠在命令行中直接運行該包支持的命令。
本地安裝:需在項目中引用。
npm c get prefix //獲取npm目錄 npm c get cache //獲取緩存目錄 npm c set prefix <path> //獲取npm目錄 npm c set cache <path> //獲取緩存目錄
npm update <package> -g //升級全局安裝的指定模塊 npm update <package> //升級當前目錄下的指定模塊 npm update --save-dev //升級當前目錄下所有模塊
把npm更新到v5.x.x之後, npm i會出現一種新的自動生成文件 - package-lock.json。
package-lock.json簡言之,就是鎖定安裝時包的版本號。
npm c set package-lock false
下面的結論,配置爲 node 8.9.0,npm 6.8.0。 以webpack版本爲例。
1.package.json與package-lock.json版本相同狀況下,npm i無效果
2.修改package.json主版本
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^2.0.0 | 1.5.0 | 1.5.0 | npm i | ^2.0.0 | 2.7.0 | 2.7.0 |
3.修改package.json次版本
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^2.5.0 | 2.7.0 | 2.7.0 | npm i | ^2.5.0 | 2.7.0 | 2.7.0 |
若是手動修改了 package.json 文件中已有模塊的次版本,直接執行 npm install 不會安裝新指定的版本,只會安裝package-lock.json鎖定版本。
4.無package-lock.json
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^3.4.0 | 2.7.0 | 無 | npm i | ^3.4.0 | 3.11.0 | 3.11.0 |
如下兩種方式能夠無論package-lock.json鎖定版本,直接安裝
5.npm i <package>
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^4.5.0 | 4.5.0 | 4.5.0 | npm i webpack | ^4.29.5 | 4.29.5 | 4.29.5 |
6.npm i <package@version>
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^4.5.0 | 4.5.0 | 4.5.0 | npm i webpack@3.4.0 | ^3.4.0 | 3.4.0 | 3.4.0 |
1.package.json版本比node_modules低,不會更新
2.npm update
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^4.4.0 | 4.4.0 | 4.4.0 | npm update | ^4.29.5 | 4.29.5 | 4.29.5 |
3.無node_modules,npm update不會裝包,也不會更新
4.npm update --save-dev
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^3.2.0 | 2.7.0 | 2.7.0 | npm update --save-dev | ^3.2.0 | 3.12.0 | 3.12.0 |
5.npm update webpack
package.json (before) | node_modules (before) | package-lock.json (before) | command | package.json (after) | node_modules (after) | package-lock.json (after) |
---|---|---|---|---|---|---|
^3.2.0 | 2.7.0 | 2.7.0 | npm update webpack | ^3.2.0 | 3.12.0 | 3.12.0 |