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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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:…