推薦使用 pnpm 而不是 npm

npm 的局限性

  1. 磁盤空間浪費

在 npm
早期版本中,每個項目的node_modules目錄都會完整復制所有依賴包,即使多個項目依賴同一個包的相同版本,也會重復存儲。這導致磁盤空間被大量占用,隨著項目數量的增加,存儲成本顯著上升。雖然
npm v3
引入了扁平化結構,一定程度上減少了重復,但仍無法徹底解決問題。例如,在一個擁有多個項目的開發環境中,如果每個項目都依賴
lodash,那么每個項目的node_modules目錄中都會有一份 lodash 的副本。

  1. 安裝速度較慢

npm
安裝依賴時,需要從遠程倉庫下載每個包并寫入node_modules目錄,對于大型項目,尤其是依賴眾多的項目,這個過程涉及大量的
I/O 操作和網絡請求,安裝速度會受到明顯影響。即使在 npm v5
之后支持了并行下載,在面對復雜的依賴樹時,安裝時間仍然較長。例如,當安裝一個包含上百個依賴包的項目時,npm
可能需要數分鐘甚至更長時間才能完成安裝。 幽靈依賴問題 npm 的扁平化node_modules結構帶來了 “幽靈依賴”
問題。項目可以訪問未在package.json中聲明的依賴包,這是因為依賴包的嵌套依賴可能被提升到node_modules的根目錄,從而導致項目代碼中能夠直接引用這些未聲明的依賴。這種不明確的依賴關系使得項目的依賴管理變得混亂,一旦依賴包的版本發生變化,可能會導致項目在運行時出現難以排查的錯誤。例如,項目
A 依賴包 B,而包 B 又依賴包 C,由于扁平化結構,包 C 可能會被提升到node_modules根目錄,項目 A
的代碼中就可以直接引用包 C,即使項目 A 的package.json中并沒有聲明對包 C 的依賴。

  1. pnpm 的優勢

高效的磁盤空間管理 pnpm 使用內容尋址存儲和符號鏈接 /
硬鏈接技術來管理依賴。所有依賴項都存儲在全局共享存儲中,當項目安裝依賴時,pnpm
會通過硬鏈接將依賴包從全局存儲鏈接到項目的node_modules目錄,而不是復制整個包。這意味著,無論有多少個項目依賴同一個包的相同版本,磁盤上只會存儲一份該包的文件。例如,假設有
100 個項目都依賴 lodash,在 pnpm 的管理下,lodash
在磁盤上只占用一份空間,大大節省了磁盤資源。而且,當依賴包的版本更新時,pnpm
只會將有差異的文件添加到存儲中,進一步減少了磁盤空間的占用。 快速的安裝速度 pnpm
的安裝過程分為三個階段:依賴解析、目錄結構計算和鏈接依賴項。在依賴解析階段,識別并獲取倉庫中沒有的依賴;目錄結構計算階段,根據依賴關系計算node_modules目錄結構;鏈接依賴項階段,將以前安裝過的依賴項從存儲區直接鏈接到node_modules。這種方式避免了重復下載和復制文件,尤其是在處理大量依賴項時,安裝速度明顯快于
npm。在有緩存的情況下,或者安裝已經存在于全局倉庫中的包時,pnpm 的安裝速度幾乎可以達到 “秒級”,極大地提高了開發效率。
清晰的依賴結構,杜絕幽靈依賴 pnpm 創建的是一個嵌套的、有嚴格依賴關系的node_modules結構。在 pnpm
的node_modules中,只會包含在package.json中明確聲明的依賴。項目依賴的包所依賴的其他包,會被存放在node_modules/.pnpm/這個特殊目錄里,并通過符號鏈接的方式鏈接到相應包的node_modules中。這就從根本上杜絕了
“幽靈依賴”
問題,確保項目的依賴關系清晰、可靠,不會出現意外引用未聲明依賴的情況。在項目代碼中嘗試引用未在package.json中聲明的依賴時,pnpm
會直接報錯,保證了項目依賴的純凈性。 對 Monorepo 的良好支持 在處理 Monorepo(多包倉庫)時,npm 的支持相對較弱,而
pnpm 原生支持
Monorepo,并且配置相對簡單。通過在項目根目錄創建pnpm-workspace.yaml文件并聲明對應的工作區,就可以方便地管理多個包和項目。在一個包含多個前端項目和后端項目的
Monorepo 中,使用 pnpm 可以輕松實現依賴的共享和管理,減少重復安裝,提高整個項目組的開發效率。

  1. 案例對比

磁盤空間占用對比 以一個實際的開發場景為例,有 5 個 React 項目,使用 npm 管理依賴時,這 5
個項目的node_modules目錄總共占用了 8.7G 的磁盤空間;而使用 pnpm 后,同樣的 5
個項目,node_modules相關的存儲總共只占用了 3.2G,直接節省了 5G
左右的磁盤空間。對于磁盤空間有限的開發者來說,這無疑是一個非常有吸引力的優勢。 安裝速度對比 在安裝一個具有復雜依賴樹的項目時,使用 npm
執行npm install命令,等待時間長達數分鐘;而使用 pnpm 執行pnpm
install,安裝時間縮短了一半以上,極大地減少了開發過程中的等待時間,提高了開發節奏。 依賴管理穩定性對比 在一個團隊協作項目中,由于
npm 的package-lock.json文件有時不能很好地鎖定依賴版本,導致不同開發者安裝的依賴版本不一致,經常出現
“在我電腦上能運行,在別人電腦上報錯” 的情況。而切換到 pnpm
后,其pnpm-lock.yaml文件更嚴格地記錄了依賴的版本、來源和包的哈希值,保證了不同開發者安裝的依賴結構幾乎 100%
一致,項目交接和協同開發變得更加順暢,減少了因依賴不一致導致的問題。 綜上所述,pnpm 在磁盤空間管理、安裝速度、依賴結構的清晰性以及對
Monorepo 的支持等方面,都展現出了明顯優于 npm 的特性。在當今前端項目日益復雜、依賴管理愈發重要的背景下,pnpm
為開發者提供了更高效、更可靠的包管理解決方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96595.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Transformer實戰(18)——微調Transformer語言模型進行回歸分析

Transformer實戰(18)——微調Transformer語言模型進行回歸分析0. 前言1. 回歸模型2. 數據處理3. 模型構建與訓練4. 模型推理小結系列鏈接0. 前言 在自然語言處理領域中,預訓練 Transformer 模型不僅能勝任離散類別預測,也可用于連…

【Linux】【實戰向】Linux 進程替換避坑指南:從理解 bash 阻塞等待,到親手實現能執行 ls/cd 的 Shell

前言:歡迎各位光臨本博客,這里小編帶你直接手撕,文章并不復雜,愿諸君耐其心性,忘卻雜塵,道有所長!!!! IF’Maxue:個人主頁🔥 個人專欄…

linux常用命令 (3)——系統包管理

博客主頁:christine-rr-CSDN博客 ????? ?? hi,大家好,我是christine-rr ! 今天來分享一下linux常用命令——系統包管理 目錄linux常用命令---系統包管理(一)Debian 系發行版(Ubuntu、Debian、Linux …

YOLOv8 mac-intel芯片 部署指南

🚀 在 Jupyter Notebook 和 PyCharm 中使用 Conda 虛擬環境(YOLOv8 部署指南,Python 3.9) YOLOv8 是 Ultralytics 開源的最新目標檢測模型,輕量高效,支持分類、檢測、分割等多種任務。 在 Mac(…

【高等數學】第十一章 曲線積分與曲面積分——第六節 高斯公式 通量與散度

上一節:【高等數學】第十一章 曲線積分與曲面積分——第五節 對坐標的曲面積分 總目錄:【高等數學】 目錄 文章目錄1. 高斯公式2. 沿任意閉曲面的曲面積分為零的條件3. 通量與散度1. 高斯公式 設空間區域ΩΩΩ是由分片光滑的閉曲面ΣΣΣ所圍成&#x…

IDEA試用過期,無法登錄,重置方法

IDEA過期,重置方法: IntelliJ IDEA 2024.2.0.2 (親測有效) 最新Idea重置辦法!: 方法一: 1、刪除C:\Users\{用戶名}\AppData\Local\JetBrains\IntelliJIdea2024.2 下所有文件(注意:是子目錄全部刪除) 2、刪除C:\Users\{用戶名}\App…

創建用戶自定義橋接網絡并連接容器

1.創建用戶自定義的 alpine-net 網絡[roothost1 ~]# docker network create --driver bridge alpine-net 9f6d634e6bd7327163a9d83023e435da6d61bc6cf04c9d96001d1b64eefe4a712.列出 Docker 主機上的網絡[roothost1 ~]# docker network ls NETWORK ID NAME DRIVER …

Vue3 + Vite + Element Plus web轉為 Electron 應用,解決無法登錄、隱藏自定義導航欄

如何在vue3 Vite Element Plus搭好的架構下轉為 electron應用呢? https://www.electronjs.org/zh/docs/latest/官方文檔 https://www.electronjs.org/zh/docs/latest/ 第一步:安裝 electron相關依賴 npm install electron electron-builder concurr…

qt QAreaLegendMarker詳解

1. 概述QAreaLegendMarker 是 Qt Charts 模塊中的一部分,用于在圖例(Legend)中表示 QAreaSeries 的標記。它負責顯示區域圖的圖例項,通常包含區域顏色樣例和對應的描述文字。圖例標記和對應的區域圖關聯,顯示區域的名稱…

linux 函數 kstrtoul

kstrtoul 函數概述 kstrtoul 是 Linux 內核中的一個函數&#xff0c;用于將字符串轉換為無符號長整型&#xff08;unsigned long&#xff09;。該函數定義在 <linux/kernel.h> 頭文件中&#xff0c;常用于內核模塊中解析用戶空間傳遞的字符串參數。 函數原型 int kstrtou…

LLM(三)

一、人類反饋的強化學習&#xff08;RLHF&#xff09;微調的目標是通過指令&#xff0c;包括路徑方法&#xff0c;進一步訓練你的模型&#xff0c;使他們更好地理解人類的提示&#xff0c;并生成更像人類的回應。RLHF&#xff1a;使用人類反饋微調型語言模型&#xff0c;使用強…

DPO vs PPO,偏好優化的兩條技術路徑

1. 背景在大模型對齊&#xff08;alignment&#xff09;里&#xff0c;常見的兩類方法是&#xff1a;PPO&#xff1a;強化學習經典算法&#xff0c;OpenAI 在 RLHF 里用它來“用獎勵模型更新策略”。DPO&#xff1a;2023 年提出的新方法&#xff08;參考論文《Direct Preferenc…

BLE6.0信道探測,如何重構物聯網設備的距離感知邏輯?

在物聯網&#xff08;IoT&#xff09;無線通信技術快速滲透的當下&#xff0c;實現人與物、物與物之間對物理距離的感知響應能力已成為提升設備智能高度與人們交互體驗的關鍵所在。當智能冰箱感知用戶靠近而主動亮屏顯示內部果蔬時、當門禁系統感知到授權人士靠近而主動開門時、…

【計算機 UTF-8 轉換為本地編碼的含義】

UTF-8 轉換為本地編碼的含義 詳細解釋一下"UTF-8轉換為本地編碼"的含義以及為什么在處理中文時這很重要。 基本概念 UTF-8 編碼 國際標準&#xff1a;UTF-8 是一種能夠表示世界上幾乎所有字符的 Unicode 編碼方式跨平臺兼容&#xff1a;無論在哪里&#xff0c;UTF-8 …

4.6 變體

1.變體簡介 2.為什么需要變體 3.變體是如何產生的 4.變體帶來的麻煩 5.multi_compile和shader_feature1.變體簡介 比如我們開了一家餐廳, 你有一本萬能的菜單(Shader源代碼), 上面包含了所有可能的菜式; 但是顧客每次來點餐時, 不可能將整本菜單都做一遍, 他們會根據今天有沒有…

猿輔導Android開發面試題及參考答案(下)

為什么開發中要使用線程池,而不是直接創建線程(如控制線程數量、復用線程、降低開銷)? 開發中優先使用線程池而非直接創建線程,核心原因是線程池能優化線程管理、降低資源消耗、提高系統穩定性,而直接創建線程存在難以解決的缺陷,具體如下: 控制線程數量,避免資源耗盡…

【網絡通信】IP 地址深度解析:從技術原理到企業級應用?

IP 地址深度解析&#xff1a;從技術原理到企業級應用? 文章目錄IP 地址深度解析&#xff1a;從技術原理到企業級應用?前言一、基礎認知&#xff1a;IP 地址的技術定位與核心特性?1.1 定義與網絡層角色1.2 核心屬性與表示法深化二、地址分類&#xff1a;從類別劃分到無類別路…

grafana實踐

一、如何找到grafana的插件目錄 whereis grafana grafana: /etc/grafana /usr/share/grafana插件安裝目錄、默認安裝目錄&#xff1a; 把vertamedia-clickhouse-datasource-3.4.4.zip解壓到下面目錄&#xff0c;然后重啟就可以了 /var/lib/grafana/plugins# 6. 設置權限 sudo …

uniapp 文件查找失敗:main.js

重裝HbuilderX vue.config.js 的 配置 有問題main.js 框架能自動識別 到&#xff0c;不用多余的配置

KEIL燒錄時提示“SWD/JTAG communication failure”的解決方法

最新在使用JTAG仿真器串口下載調試程序時&#xff0c;老是下載不成功&#xff0c;識別不到芯片&#xff0c;我嘗試重啟keil5或者重新插拔仿真器連接線、甚至重啟電腦也都不行&#xff0c;每次下載程序都提示如下信息&#xff1a;在確定硬件連接沒有問題之后&#xff0c;就開始分…