yarn、pnpm、npm

news2025/6/4 20:46:53

非常好,这样从“问题驱动 → 工具诞生 → 优化演进”的角度来讲,更清晰易懂。下面我按时间线和动机,把 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.coloradmin.cn/o/2396806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文笔记】Transcoders Find Interpretable LLM Feature Circuits

Abstract 机制可解释性(mechanistic interpretability)的核心目标是路径分析(circuit analysis):在模型中找出与特定行为或能力对应的稀疏子图。 然而,MLP 子层使得在基于 Transformer 的语言模型中进行细粒度的路径分析变得困难。具体而言,…

每天总结一个html标签——a标签

文章目录 一、定义与使用说明二、支持的属性三、支持的事件四、默认样式五、常见用法1. 文本链接2. 图片链接3. 导航栏 在前端开发中,a标签(锚点标签)是最常用的HTML标签之一,主要用于创建超链接,实现页面间的跳转或下…

android binder(1)基本原理

一、IPC 进程间通信(IPC,Inter-Process Communication)机制,用于解决不同进程间的数据交互问题。 不同进程之间用户地址空间的变量和函数是不能相互访问的,但是不同进程的内核地址空间是相同和共享的,我们可…

行业分析---小米汽车2025第一季度财报

1 背景 最近几年是新能源汽车的淘汰赛,前短时间比亚迪再次开始了降价,导致一片上市车企的股价大跌,足见车圈现在的敏感度。因此笔者会一直跟踪新势力车企的财报状况,对之前财报分析感兴趣的读者朋友可以参考以下博客:…

边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策

一、项目背景 医院作为人员密集的特殊场所,对供暖系统的稳定性和高效性有着极高的要求。其供暖换热站传统的人工现场监控方式存在诸多弊端,如人员值守成本高、数据记录不及时不准确、故障发现和处理滞后、能耗难以有效监测和控制等,难以满足…

简单了解string类的特性及使用(C++)

string的特性 string类不属于STL,它属于标准库 但由于它具有数据结构的特性,所以从归类的角度,可以将string类归类到容器里面去 在C标准库中,std::string 是一个特化的类型,实际上是 std::basic_string 的别名。std…

FastAPI+Pyomo实现线性回归解决饮食问题

之前在 FastAPI介绍-CSDN博客 中介绍过FastAPI,在 Pyomo中线性规划接口的使用-CSDN博客 中使用Pyomo解决饮食问题,这里将两者组合,即FastAPI在服务器端启动,通过Pyomo实现线性回归;客户端通过浏览器获取饮食的最优解。…

16.FreeRTOS

目录 第1章 FreeRTOS 实时操作系统 1.1 认识实时操作系统 1.1.1 裸机的概念 1.1.2 操作系统的概念 1.2 操作系统的分类 1.3 常见的操作系统 1.4 认识实时操作系统 1.4.1 可剥夺型内核与不可剥夺型内核 1.4.2 嵌入式操作系统的作用 1.4.3 嵌入式操作系统的发展 1.4.4…

Redis最佳实践——购物车优化详解

Redis在电商购物车高并发读写场景下的优化实践 一、购物车业务场景分析 典型操作特征 读/写比例 ≈ 8:2高峰QPS可达10万单用户最大商品数500操作类型:增删改查、全选/反选、数量修改 技术挑战 高并发下的数据一致性海量数据存储与快速访问实时价格计算与库存校验分…

【计算机网络】传输层UDP协议

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹: 【计算机网络】应用层协议Http——构建Http服务服务器 🔖流水不争,争的是滔滔不…

安全漏洞修复导致SpringBoot2.7与Springfox不兼容

项目基于 springboot2.5.2 实现的&#xff0c;用 springfox-swagger2 生成与前端对接的 API 文档&#xff1b;pom.xml 中依赖如下 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

从法律层面剖析危化品证书:两证一证背后的安全逻辑

《安全生产法》第 24 条明确规定&#xff0c;危化品单位主要负责人和安全管理人员 “必须考核合格方可上岗”。这并非仅仅是行政要求&#xff0c;而是通过法律来筑牢安全防线。在某危化品仓库爆炸事故中&#xff0c;由于负责人未持证&#xff0c;导致事故责任升级&#xff0c;企…

深入理解复数加法与乘法:MATLAB演示

在学习复数的过程中&#xff0c;复数加法与乘法是两个非常基础且重要的概念。复数的加法和乘法操作与我们常见的实数运算有所不同&#xff0c;它们不仅涉及到数值的大小&#xff0c;还有方向和相位的变化。在这篇博客中&#xff0c;我们将通过MATLAB演示来帮助大家更好地理解复…

【设计模式-3.6】结构型——桥接模式

说明&#xff1a;本文介绍结构型设计模式之一的桥接模式 定义 桥接模式&#xff08;Bridge Pattern&#xff09;又叫作桥梁模式、接口&#xff08;Interface&#xff09;模式或柄体&#xff08;Handle and Body&#xff09;模式&#xff0c;指将抽象部分与具体实现部分分离&a…

力扣题解654:最大二叉树

一、题目内容 题目要求根据一个不重复的整数数组 nums 构建最大二叉树。最大二叉树的构建规则如下&#xff1a; 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。返回由 nums 构…

95套HTML高端大数据可视化大屏源码分享

概述​​ 在大数据时代&#xff0c;数据可视化已成为各行各业的重要需求。这里精心整理了95套高端HTML大数据可视化大屏源码&#xff0c;这些资源采用现代化设计风格&#xff0c;可帮助开发者快速构建专业的数据展示界面。 ​​主要内容​​ ​​1. 设计风格与特点​​ 采用…

scale up 不能优化 TCP 聚合性能

scale up 作为一种系统扩展优化的方法&#xff0c;旨在提高系统组件的执行效率&#xff0c;比如替换更高性能的硬件或算法。是否可以此为依据优化 TCP 呢&#xff0c;例如通过多条路径聚合带宽实现吞吐优化(对&#xff0c;还是那个 MPTCP)&#xff0c;答案是否定的。 因为 TCP…

Python-matplotlib库之核心对象

matplotlib库之核心对象 FigureFigure作用Figure常用属性Figure常用方法Figure对象的创建隐式创建&#xff08;通过 pyplot&#xff09;显式创建使用subplots()一次性创建 Figure 和 Axes Axes&#xff08;绘图区&#xff09;Axes创建方式Axes基本绘图功能Axes绘图的常用参数Ax…

Linux 脚本文件编辑(vim)

1. 用户级配置文件&#xff08;~/.bashrc&#xff09; vim ~/.bashrc # 编辑 source ~/.bashrc # 让编辑生效 ~/.bashrc 文件是 Bash Shell 的配置文件&#xff0c;用于定义用户登录时的环境变量、别名、函数等设置。当你修改了 ~/.bashrc 文件后&#xff0c;通常需要重新…

学习BI---基本操作---数据集操作

什么是数据集&#xff0c; 数据集&#xff08;Dataset&#xff09;​​ 是指从原始数据源&#xff08;如数据库、Excel、API等&#xff09;提取并经过标准化处理后的数据集合&#xff0c;通常以二维表形式存储&#xff0c;用于支撑报表、仪表盘等可视化分析。 数据集在QuickB…