yarn、pnpm、npm

非常好,這樣從“問題驅動 → 工具誕生 → 優化演進”的角度來講,更清晰易懂。下面我按時間線和動機,把 npm → yarn → pnpm 的演變脈絡講清楚。


🧩 一、npm 為什么一開始不夠好?

早期(npm v4 及之前)的問題主要集中在以下幾個方面:

  1. 安裝不確定性(非確定性安裝)

npm 安裝依賴是不穩定的,即使鎖版本,也有可能在不同機器上裝出不同的 node_modules。

這會導致:“我能跑,你不能跑”,非常影響團隊協作。

  1. 性能慢

安裝過程是串行的,一次只裝一個包;

網絡差的時候經常失敗,尤其在國內。

  1. 缺少鎖文件(舊版本)

npm 最早沒有 package-lock.json,版本解析隨時間變;

即使后來加入,也沒能徹底解決一致性問題。

🔧 所以,這時候 Facebook 出手了,搞了 Yarn。


🚀 二、Yarn 為什么出現?解決了哪些問題?

🧠 背景:

Facebook 的工程師維護著數千個 Node 項目,npm 的不穩定、速度慢,嚴重拖累開發效率,于是他們造了 Yarn。

🎯 Yarn 主要解決了這些問題:

  1. 確定性安裝(Deterministic)

引入 yarn.lock 鎖文件,強制保證在任何機器安裝都一樣。

  1. 性能優化

支持并發安裝,比 npm 快很多;

使用本地緩存,第二次安裝極快。

  1. 離線安裝

可以直接從本地緩存裝包,斷網也能裝。

  1. 更好的 CLI 體驗

命令更直觀:yarn add, yarn remove;

信息提示也更美觀清晰。

🟢 總結:Yarn 是對 npm 早期缺陷的“性能增強 + 確定性修復”。


? 三、那為什么后來又有了 pnpm?Yarn 還不夠好嗎?

🤔 Yarn 的問題:

雖然 Yarn 比 npm 好,但它還是沿用了 npm 的核心模式:

所有依賴被“平鋪”安裝在 node_modules 根目錄;

重復項目會占用大量磁盤空間;

幽靈依賴問題(依賴沒有聲明但能用)仍然存在。

💡 這時 pnpm 出現了,它的核心思想是:

🚀 極致性能 + 更強的依賴隔離 + 節省磁盤空間

🔍 pnpm 解決了哪些 yarn 沒解決的問題?

  1. 重復依賴占用空間嚴重

yarn 和 npm:每個項目都復制依賴;

pnpm:使用內容尋址 + 硬鏈接,依賴只下載一次,多個項目共享。

🔄 舉個例子:

你有 10 個項目都用 React,npm/yarn 會有 10 個 react 包; pnpm 只會下載 1 次,然后“硬鏈接”給每個項目用。

  1. 嚴格依賴隔離

pnpm 不允許訪問未聲明依賴(幽靈依賴會報錯);

讓你必須明確聲明每個依賴,更安全、規范。

  1. 極速安裝體驗

比 yarn 還快得多(即便是第一次安裝);

CI/CD、Monorepo 項目效率提升明顯。


🧭 四、總結一下三者的“出現背景 & 問題驅動”

工具 出現時間 為什么會出現 解決了什么問題

npm 最早 Node.js 官方包管理器 提供基礎的依賴管理功能
yarn 2016 為了解決 npm 安裝不穩定、慢、無法離線等問題 鎖文件、緩存、并發、確定性安裝
pnpm 2017 為了解決重復依賴空間浪費、幽靈依賴、安裝速度瓶頸 內容尋址 + 嚴格隔離 + 極速安裝


? 最后的建議(根據實際情況選擇)

? 新項目推薦使用 pnpm(快、省、規范);

👍 歷史使用 yarn 的可以繼續用,也很穩定;

🆗 小型項目或者默認使用可選 npm,方便不用額外安裝。


如果你想繼續,我可以帶你寫個從 yarn 或 npm 切換到 pnpm 的實戰遷移指南,也可以講講它們在 Monorepo 里的表現。需要嗎?

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

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

相關文章

如何用AI寫作?

過去半年,我如何用AI高效寫作,節省數倍時間 過去六個月,我幾乎所有文章都用AI輔助完成。我的朋友——大多是文字工作者,對語言極為敏感——都說看不出我的文章是AI寫的還是親手創作的。 我的AI寫作靈感部分來自丘吉爾。這位英國…

什么是trace,分布式鏈路追蹤(Distributed Tracing)

在你提到的 “個人免費版” 套餐中,“Trace 上報量:5 萬條 / 月,存儲 3 天” 里的 Trace 仍然是指 分布式鏈路追蹤記錄,但需要結合具體產品的場景來理解其含義和限制。以下是更貼近個人用戶使用場景的解釋: 一、這里的…

[免費]微信小程序網上花店系統(SpringBoot后端+Vue管理端)【論文+源碼+SQL腳本】

大家好,我是java1234_小鋒老師,看到一個不錯的微信小程序網上花店系統(SpringBoot后端Vue管理端)【論文源碼SQL腳本】,分享下哈。 項目視頻演示 【免費】微信小程序網上花店系統(SpringBoot后端Vue管理端) Java畢業設計_嗶哩嗶哩_bilibili 項…

PyTorch——DataLoader的使用

batch_size, drop_last 的用法 shuffle shuffleTrue 各批次訓練的圖像不一樣 shuffleFalse 在第156step順序一致

【Linux】基礎文件IO

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:Linux 前言 無論是日常使用還是系統管理,文件是Linux系統中最核心的概念之一。對于初學者來說,理解文件是如何被創建、讀取、寫入以及存儲…

【JAVA后端入門基礎001】Tomcat 是什么?通俗易懂講清楚!

📚博客主頁:代碼探秘者 ?專欄:《JavaSe》 其他更新ing… ??感謝大家點贊👍🏻收藏?評論?🏻,您的三連就是我持續更新的動力?? 🙏作者水平有限,歡迎各位大佬指點&…

TDengine 的 AI 應用實戰——電力需求預測

作者: derekchen Demo數據集準備 我們使用公開的UTSD數據集里面的電力需求數據,作為預測算法的數據來源,基于歷史數據預測未來若干小時的電力需求。數據集的采集頻次為30分鐘,單位與時間戳未提供。為了方便演示,按…

D2000平臺上Centos使用mmap函數遇到的陷阱

----------原創不易,歡迎點贊收藏。廣交嵌入式開發的朋友,討論技術和產品------------- 在飛騰D2000平臺上,安裝了麒麟linux系統,我寫了個GPIO點燈的程序,在應用層利用mmap函數將內核空間映射到用戶態,然后…

深入了解linux系統—— 進程間通信之管道

前言 本篇博客所涉及到的代碼一同步到本人gitee:testfifo 遲來的grown/linux - 碼云 - 開源中國 一、進程間通信 什么是進程間通信 在之前的學習中,我們了解到了進程具有獨立性,就算是父子進程,在修改數據時也會進行寫時拷貝&…

設計模式——模版方法設計模式(行為型)

摘要 模版方法設計模式是一種行為型設計模式,定義了算法的步驟順序和整體結構,將某些步驟的具體實現延遲到子類中。它通過抽象類定義模板方法,子類實現抽象步驟,實現代碼復用和算法流程控制。該模式適用于有固定流程但部分步驟可…

Python使用

Python學習,從安裝,到簡單應用 前言 Python作為膠水語言在web開發,數據分析,網絡爬蟲等方向有著廣泛的應用 一、Python入門 相關基礎語法直接使用相關測試代碼 Python編譯器版本使用3以后,安裝參考其他教程&#xf…

吳恩達機器學習筆記(1)—引言

目錄 一、歡迎 二、機器學習是什么 三、監督學習 四、無監督學習 一、歡迎 機器學習是當前信息技術領域中最令人興奮的方向之一。在這門課程中,你不僅會學習機器學習的前沿知識,還將親手實現相關算法,從而深入理解其內部機理。 事實上&…

java筆記08

多線程&JUC 1.什么是多線程 1.什么是多線程?有了多線程,我們就可以讓程序同時做多件事情 2.多線程的作用?提高效率 3.多線程的應用場景?只要你想讓多個事情同時運行就需要用到多線程比如:軟件中的耗時操作、所有…

【仿muduo庫實現并發服務器】使用正則表達式提取HTTP元素

使用正則表達式提取HTTP元素 1.正則表達式2.正則庫的使用3.使用正則表達式提取HTTP請求行 1.正則表達式 正則表達式它其實是描述了一種字符串匹配的模式,它可以用來在一個字符串中檢測一個特定格式的字串,以及可以將符合特定規則的字串進行替換或者提取…

顯示即戰略:鐵電液晶如何成為 “數字中國” 的 “像素基石”?

一、顯示技術:數字時代的核心戰略支點 (一)從 “視覺窗口” 到 “戰略基礎設施” 在數字經濟蓬勃發展的當下,顯示技術早已超越了單純的 “視覺呈現” 范疇,成為連接人與數字世界的關鍵接口。從智能手機、平板電腦到車…

適合小白的超詳細配置YOLOv8教程(畢設必看)(訓練自己數據集)(Pycharm保姆級安裝教程)(lablme的使用)(GPU版)

目錄 1.Pycharm的安裝和虛擬環境調用(已經安裝好的可以跳過此步驟) 1.1 下載pycharm軟件 1.2 調用已創建虛擬環境(調用上一篇教程中創建好的虛擬環境) 2.標注自己數據集(已有數據集的這部分可跳過) 2.1…

EC800X QuecDuino開發板介紹

支持的模組列表 EG800KEC800MEC800GEC800E 功能列表 基本概述 EC800X QuecDuino EVB 搭載移遠 EC800 系列模組。支持模組型號為: EC800M 系列、EC800K 系列、EG800K 系列、EC800E 系列等。 渲染圖 開發板的主要組件、接口布局見下圖 資料下載 EC800X-QuecDui…

Unity + HybirdCLR熱更新 入門篇

官方文檔 HybridCLR | HybridCLRhttps://hybridclr.doc.code-philosophy.com/docs/intro 什么是HybirdCLR? HybridCLR(原名 huatuo)是一個專為 Unity 項目設計的C#熱更新解決方案,它通過擴展 IL2CPP 運行時,使其支持動態加載和…

類 Excel 數據填報

類 Excel 填報模式,滿足用戶 Excel 使用習慣 數據填報,可作為獨立的功能模塊,用于管理業務流程、匯總采集數據,以及開發各類數據報送系統,因此,對于報表工具而言,其典型場景之一就是利用報表模…

MySQL 8.0 OCP 英文題庫解析(十)

Oracle 為慶祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始,將英文題庫免費公布出來,并進行解析,幫助大家在一個月之內輕松通過OCP認證。 本期公布試題81~90 試題81:…