npm管理依賴

semver

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,一般被視爲不穩定、不建議生產使用的版本。
clipboard.png
例如:web

  • 1.0.0-alpha
  • 1.0.0-beta.1

版本限定

在進行包管理時,爲了保證安裝依賴的兼容性,必須對依賴包版本進行限定.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
npm outdated [[<@scope>/]<pkg> ...]

clipboard.png

版本刪除

npm uninstall [-g] <Module Name> [--save] [-dev]         //卸載模塊

npm install

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>
  • -S, --save 安裝包信息將加入到dependencies(生產階段的依賴)
  • -D, --save-dev 安裝包信息將加入到devDependencies(開發階段的依賴),因此開發階段通常使用它
  • -O, --save-optional 安裝包信息將加入到optionalDependencies(可選階段的依賴)
  • -E, --save-exact 精確安裝指定模塊版本
  • -P, --save-prod, 添加dependencies 裏面全部的包

^是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

npm update <package> -g      //升級全局安裝的指定模塊
npm update <package>         //升級當前目錄下的指定模塊
npm update --save-dev        //升級當前目錄下所有模塊

package-lock 文件

把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版本爲例。

npm i

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

npm update

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
相關文章
相關標籤/搜索