整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ
npm ci 與 npm install 差異
前言
其實我們以往開發還原專案大多都會習慣用 npm install,但其實在 npm 5.7.1 之後有些人會建議改使用 npm ci 的指令,那麼至於原因是為什麼,就讓我們稍微了解一下吧。
who is npm ci?
首先 npm ci 的 ci 全名是「Continuous Integration」,中文是持續集成的意思,這個指令是在 npm 5.7.1 的時候推出的,因此如果你的 npm 版本太低的話,是無法使用這個指令的。
而這個指令類似於 npm install (同 npm i),除此之外 npm ci 的安裝速度會比你使用 npm install 安裝還快,雖然官方是這樣講,但我實測下來 npm install 比較快,稍微查了一下許多人討論的部分之後,主要會覺得快是因為有緩存 node_modules 的關係。
那…到底 npm ci 跟 npm 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 套件當作範本:

可以發現詳細程度到 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 ci 則只需要 14 秒

但我個人覺得差不多,這一段可詳見 官方 說明。
那麼該用 npm install 還是 npm ci 呢?
基本上這兩個指令都有屬於它的使用時機,當你想要還原專案並更新套件時就使用 npm install,若你想要統一版本而不想修改到 package-lock.json 的話就是使用 npm ci,除此之外如果是要用於 CI/CD 的話則會建議使用 npm ci 取代 npm install 會更好更穩定。
那麼關於這一點也有相當多的文獻可以參考
- npm ci vs. npm install — Which Should You Use in Your Node.js Projects?
- What is the difference between “npm install” and “npm ci”?
甚至你也可以看到有人主張建議使用 npm ci 取代 npm install 還原專案
參考文獻
整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ