2020年10月13日是npm CLI團隊的快樂星期二,經過幾個月的努力,npm CLI團隊正式釋出了 [email protected]。
npm是JavaScript的程式包管理器,它是Node.js(基於Chrome的V8 JavaScript引擎構建的非同步事件驅動的JavaScript執行時)的預設程式包管理器。
這個新版本引入了一些npm CLI使用者群高度要求的功能。這些特性包括工作空間(Workspaces)、自動安裝同級依賴項的能力,以及我將在本文中強調的其他一些特性。
要開始使用 npm v7.0.0,請在終端中執行 npm i -g npm@7。
[email protected] 仍然是一個非常新的東西,所以它不會破壞使用npm的數百萬工作流,特別是在生產中。
因此,npm不會被標記為 latest;你的工作流預設不會得到npm v7.0.0,除非你透過執行 npm install -g npm@7 或安裝Node.js 15來選擇,Node.js 15是最近在 [email protected] 釋出後出現的。
有什麼新東西?npm 7有3個令人興奮且期待已久的重要功能。
/ 工作空間 /
這個功能已經被社群要求了很久。工作空間是npm CLI中的一組功能,它支援在一個頂級的根包中管理多個包。Yarn和Pnpm以相同的名稱實現類似的功能,這一點一直存在。他們選擇重用它是為了簡化,以使更大的社群受益。
在npm cli中,有2個主要的實現或變化需要你去實施,以訪問能夠更好地管理巢狀包的特性集。
在之前的版本(npm v6)中,npm預設不安裝同級項依賴,取而代之的是,各個消費者不得不自己安裝和管理同級項依賴關係。使用者會收到一個警告,這往往被誤解為一個問題。這就會被報告給軟體包維護者,而維護者有時會省略同級項依賴關係,將其視為可選的依賴關係。這並沒有對其版本範圍或有效性進行任何檢查。
此外,由於npm安裝程式不支援同級依賴關係,所以當不支援同級依賴關係存在時,它設計的樹會出現問題。
這個新版本(npm v7.0.0)使得自動安裝同級依賴項變得很容易,而在此之前,開發人員需要手動管理和安裝此類依賴項。
根據npm CLI團隊的說法,新的peer依賴演算法確保在node_modules樹中peer-dependent的位置或上面找到有效匹配的peer依賴。
該演算法解決了之前版本中與同級依賴相關的所有問題,使同級依賴成為一個一流的概念,並滿足了包樹有效性的要求。
/ Package-lock v2和對yarn.lock的支援 /
新的package-lock格式將釋放出進行確定性可重複構建的能力,幷包含了npm完全構建包樹所需的一切。
npm 7.0.0中的重大更改除了這3個主要的新功能外,在這個版本中還有一些突破性的變化,開發者應該知道,因為我們都知道,為了提高整體的開發者體驗,一些突破性的變化是必要的。
自動安裝同級依賴關係的能力有可能破壞某些工作流程。npm現在使用了 package.export 欄位,使得不再 require() npm的內部模組。npx 已經完全重寫了,現在可以使用 npm exec 命令了npm audit 的輸出在人可讀和 --json 輸出方式上都有所改變。它不再使用表格來顯示漏洞,vuln count也不再是將樹上的每一個節點相乘。現在預設情況下,npm ls 僅顯示頂級軟體包如果你想得到和 npm6 一樣的輸出,你現在可以使用“all”選項(即 npm ls --all)
立即獲取更新你今天就可以開始使用這個更新,執行:
npm install -g npm@7
像往常一樣,你可以使用 npm -v 或 npm --version 來確認版本。
下面是一個例子,說明了 npm v7 如何幫助我們自動安裝同級的依賴關係。
讓我們安裝一個與React有同級關係的依賴,看看它是如何安裝的。
首先,讓我們透過在CLI中執行 npm ls react 來確認我們沒有依賴關係。
然後,我們現在可以繼續安裝我們選擇的任何依賴關係,以便看到這個新功能的實現。
我想指出的另一個示例是 npx 已被重建。
以前,npx 是它自己的軟體包,即使它是在安裝npm時安裝的。現在,它不再是一個單獨的包了。它是一種內建在npm中的東西(儘管人們並不真正關心它的工作)。當你試圖安裝某些東西時,它會提示你,以便檢查你是否真的想繼續安裝。
以前,你寫什麼命令,它就會直接去安裝,不會提示你。
有趣的是,你可能不喜歡它提示你回答問題的整個想法。所以,你可以利用 -y 標誌。
總結這是自2020年4月npm作為一家公司被GitHub收購後,釋出的第一個版本npm CLI。所以官方的釋出資訊是在GitHub的部落格上。
在這篇文章中,我解釋了npm v7的新功能,以及如何開始使用最新版本的npm。
我鼓勵大家對這些新功能感興趣的人開始使用npm v7。