前端Leader你應該知道的NPM包管理機制

npm install 命令

首先總結下npm 安裝一個模塊包的經常使用命令。node

/* 模塊依賴會寫入 dependencies 節點 */

npm install moduleName

npm install -save moduleName

npm install -S moduleName 

/* 模塊依賴會寫入 devDependencies 節點 */

npm install -save-dev moduleName

npm install -D moduleName

/* 全局安裝模塊包 */

npm install -g moduleName

/* 安裝特定版本的包 */

npm install 包名@版本號

/* 經過地址安裝git倉庫 */

npm install git+https://github.com/itwmike/axios.git

npm install git+ssh://git@github.com:itwmike/axios.git
 
/* 安裝特定分支或Tag的git倉庫 */

npm install git+https://github.com/itwmike/axios.git#tag

/* 經過用戶名安裝git倉庫 */ 

npm install github:賬號/倉庫名 # npm install github:itwmike/axios

npm install github:賬號/倉庫名

  

npm 依賴包版本號

npm 全部node包都使用語義化版本號,規則要求以下:  ios

  • 每一個版本號都形如1.2.3,由三個部分組成,依次叫作「主版本號(major)」、「次版本號(minor)」和「修訂號(patch)」 。git

  • 當新版本沒法兼容基於前一版本的代碼時,則提升主版本號 。github

  • 當新版本新增了功能與特性,但仍兼容前一版本的代碼時,則提升次版本號 。npm

  • 當新版本僅僅修正漏洞或者加強效率,仍然兼容前一版本代碼,則提升修訂號。json

默認使用 npm install -save 下載的都是最新版本,同時會在package.json 文件中登記一個最優版本號,以下形式:axios

"dependencies": {
  "axios": "^0.19.0"
},

  

最優版本號前面會多出一個「標記」,這個標記有啥意義?它的寫法又有哪些?bash

 

npm install 都作了哪些事?

拿到一個node項目時首要作法是運行 npm install 命令,這個命令將 package.json 文件中的依賴包自動解析並安裝,這也是項目可以本地運行的前置條件。那如此簡單的一條命令,npm 背後又作了哪些鮮爲人知的事呢?ssh

Number One工具

自 npm 5.0後,項目中若是沒有 package-lock.json 文件的時候,npm 會自動幫咱們生成。該文件的主要做用是記錄依賴包之間的具體版本號,對包版本有一個鎖定的意義,項目開發中應該將此文件上傳到git等版本控制工具(博主爲此經歷了血淋淋的慘痛教育)。

Number Two

檢測本地包是否已經下載。若是本地 node_modules 下已經存在和 package-lock.json 中版本一致的包,則不會從新下載。

Number Three

下載依賴節點中對應的模板包。下載規則是:若是 package-lock.json 文件存在,則按照該文件中記錄的版本號下載對應的模塊包;若是文件不存在或文件中沒有該包的記錄,此時會按照版本號的標記(上面已講)規範下載並同時更新到 package-lock.json。

瞭解了 package-lock.json 的做用後,筆者有個疑問:手動修改 package.json 中的包版本號後運行 npm install 命令會下載新包麼?

帶着這個疑問,筆者作了實驗,得出以下結論:

  • 若是新舊版本號差距較大,好比從 ^2.5.2 變爲 2.6.0 ,那麼會下載最新包而且更新 package-lock.json 。

  • 若是新舊版本號差距較小,好比從 ^2.5.2 變爲 2.5.4,那麼不會更新。

總之是否更新要看特定狀況,取決於 package.json中版本號的標記和 package-lock.json 是否一致。

cnpm install 探索

cnpm 是淘寶 npm 鏡像,在國內很受歡迎,雖然筆者並不喜歡使用。那 cnpm 和 npm 對包的管理是否同樣呢?

  • cnpm install 並不會生成 package-lock.json

  • cnpm install 並不受 package-lock.json 的約束,它會按照版本號標記規則下載依賴包

 

因而可知,咱們在項目中使用 cnpm 的時候必定要慎重,由於極可能團隊成員每一個人使用的依賴包版本都不相同,形成打包後的結果也不一樣。

若是團隊要使用 cnpm,請使用固定版本號的方式安裝依賴包如:cnpm install -E moduleName

相關文章
相關標籤/搜索