你想知道如何將存放在 package.json 檔案中的所有 npm 套件的相依性更新至其最新可用版本嗎?

當你使用 npm install <packageName> 安裝套件時,最新可用版本的套件會被下載並放置在 node_modules 資料夾中,同時也會在目前資料夾中的 package.json 和 package-lock.json 檔案中新增對應的項目。

npm 會計算這些相依性並安裝最新可用的版本。

假設你安裝了一個名為 cowsay 的酷炫命令列工具,可以讓一隻牛說出一些事情。

當你執行 npm install cowsay 時,以下項目會被新增至 package.json 檔案:

{
 "dependencies": {
 "cowsay": "^1.3.1"
 }
}

以下是 package-lock.json 的相關內容,為了清晰起見,我移除了巢狀相依性的部分:

{
 "requires": true,
 "lockfileVersion": 1,
 "dependencies": {
 "cowsay": {
 "version": "1.3.1",
 "resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz",
 "integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkMAjufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==",
 "requires": {
 "get-stdin": "^5.0.1",
 "optimist": "~0.6.1",
 "string-width": "~2.1.1",
 "strip-eof": "^1.0.0"
 }
 }
 }
}

這兩個檔案告訴我們,我們安裝了 cowsay 的 1.3.1 版本,而我們的更新規則是 ^1.3.1,根據 npm 的版本規則,這代表 npm 可以更新到修補程式和次要版本:1.3.2、1.4.0 等等。

但對於破壞性變更的主要版本更新,例如 2.0 以及更高版本,則不會透過這種方式進行更新。

如果有新的次要或修補版本釋出並輸入 npm update,安裝的版本會更新,而 package-lock.json 檔案也會盡職地填入新的版本,但 package.json 則不會有變動。

要查看套件的新版本,可以執行 npm outdated

以下是某個我相當一段時間未更新的專案中一些過時套件的清單:

其中有一些更新是屬於主要版本,但執行 npm update 不會更新這些版本。這是因為主要版本(根據其定義)會引入破壞性變更,而 npm 希望避免給你帶來困擾。

要將所有套件升級至新的主要版本,請先全域安裝 npm-check-updates 套件:

npm install -g npm-check-updates

然後執行以下命令:

ncu -u

這會將 package.json 檔案中的所有版本提示更新為新的相依性和開發相依性,以便 npm 可以安裝新的主要版本。

現在你已經準備好執行更新:

npm update

如果你只下載了專案而沒有安裝 node_modules 的相依性,你可以先執行以下命令安裝這些全新的版本:

npm install