npm ci 與 npm install 差異

前言

其實我們以往開發還原專案大多都會習慣用 npm install,但其實在 npm 5.7.1 之後有些人會建議改使用 npm ci 的指令,那麼至於原因是為什麼,就讓我們稍微了解一下吧。

who is npm ci?

首先 npm cici 全名是「Continuous Integration」,中文是持續集成的意思,這個指令是在 npm 5.7.1 的時候推出的,因此如果你的 npm 版本太低的話,是無法使用這個指令的。

而這個指令類似於 npm install (同 npm i),除此之外 npm ci 的安裝速度會比你使用 npm install 安裝還快,雖然官方是這樣講,但我實測下來 npm install 比較快,稍微查了一下許多人討論的部分之後,主要會覺得快是因為有緩存 node_modules 的關係。

那…到底 npm cinpm install 有何差異呢?讓我們繼續看下去。

npm install vs npm ci

首先我們先聊聊 npm install 的部分,大多我們使用 npm install 的場景有兩種

  • 安裝特定套件
  • 還原專案

npm install 執行完畢之後,通常會有兩個東西一起出現

  • node_modules
  • package-lock.json

node_modules 就不說了畢竟是套件安裝放置處,重點是 package-lock.json 的部分。

package-lock.json 類似於 npm init 初始化出來的 package.json,只是 package-lock.json 會非常詳細記套件的版本號,而 package-lock.json 是在 npm 5 的時候引入的,package-lock.json 主要目的是為了鎖定套件安裝時的依賴版本。

如果你認真打開來看比較 package.json 跟 package-lock.json 的差異的話,你會發現 package-lock.json 非常之詳細,下面以 axios 套件當作範本:

package-lock.json 與 package.json 比較

可以發現詳細程度到 axios 依賴了什麼套件都有紀錄(例如:follow-redirects)。

那麼為什麼要特別講 package-lock.json 呢?主要原因是 npm ci 會針對 package-lock.json 來還原套件,請注意並不是針對 package.json,這一點與 npm install 就非常不同。

那麼使用 npm ci 還原套件有什麼好處呢?簡單來講 npm ci 這個指令主要用於自動化部屬(CI/CD)或者是測試環境,但…為什麼會建議使用 npm ci 還原開發環境呢?你在開發時應該很常發現當你接手一個專案時,使用 npm install 還原之後都會發現 npm 偷偷幫你更新一些地方,這時候你會發現 package-lock.json 也會跟著莫名其妙更新,如果有使用版本控制會看得更明顯:

被偷偷更新的檔案

(所以 package-lock.json 要記得做版本控制唷~)

因此就有可能導致某些套件不相容甚至開發上卡住,所以這時候就會建議使用 npm ci 來還原套件,畢竟 npm ci 是從 package-lock.json 來還原,所以版本上會依據 package-lock.json 來安裝,所以並不會有偷偷更新的問題,但是使用 npm ci 以下事情要注意

  • 必須有 package-lock.json or npm-shrinkwrap.json(另一個鎖定依賴用的檔案,平常不太會用到)。
  • npm ci 只能一次還原整個套件,無法單一還原(但通常也不會這樣子做)。
  • 如果 node_modules 已經存在,它會先刪除 node_modules 之後再安裝。
  • 安裝過程若發生依賴錯誤,npm ci 不會更新 package.json 而是直接退出。
  • npm ci 永遠不會更新 package.json,所以安裝的版本基本上是鎖定的。

看起來使用 npm ci 還原套件是相當不錯的,雖然官方是說明 npm ci 還原速度比使用 npm install 快,以下是實際測試圖:

npm install 還原套件費時 16 秒

npm install

npm ci 則只需要 14 秒

npm ci

但我個人覺得差不多,這一段可詳見 官方 說明。

那麼該用 npm install 還是 npm ci 呢?

基本上這兩個指令都有屬於它的使用時機,當你想要還原專案並更新套件時就使用 npm install,若你想要統一版本而不想修改到 package-lock.json 的話就是使用 npm ci,除此之外如果是要用於 CI/CD 的話則會建議使用 npm ci 取代 npm install 會更好更穩定。

那麼關於這一點也有相當多的文獻可以參考

甚至你也可以看到有人主張建議使用 npm ci 取代 npm install 還原專案

參考文獻

Liker 讚賞 (拍手)

如果這一篇筆記文章對你有幫助,希望可以求點支持或 牡蠣 鼓勵 (ノД`)・゜・。

Liker 是一個按讚(拍手)的讚賞機制,每一篇文章最多可以按五下(拍手),按讚過程你是完全不用付費的(除非你想要每個月贊助我 :D),你只需要登入帳號就可以開始按讚。
而 Liker 會依據按讚數量分配獎金給創作者,所以如果你願意按個讚我會非常感謝你唷。

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ