yarn、pnpm、npm
非常好,这样从“问题驱动 → 工具诞生 → 优化演进”的角度来讲,更清晰易懂。下面我按时间线和动机,把 npm → yarn → pnpm 的演变脉络讲清楚。
🧩 一、npm 为什么一开始不够好?
早期(npm v4 及之前)的问题主要集中在以下几个方面:
- 安装不确定性(非确定性安装)
npm 安装依赖是不稳定的,即使锁版本,也有可能在不同机器上装出不同的 node_modules。
这会导致:“我能跑,你不能跑”,非常影响团队协作。
- 性能慢
安装过程是串行的,一次只装一个包;
网络差的时候经常失败,尤其在国内。
- 缺少锁文件(旧版本)
npm 最早没有 package-lock.json,版本解析随时间变;
即使后来加入,也没能彻底解决一致性问题。
🔧 所以,这时候 Facebook 出手了,搞了 Yarn。
🚀 二、Yarn 为什么出现?解决了哪些问题?
🧠 背景:
Facebook 的工程师维护着数千个 Node 项目,npm 的不稳定、速度慢,严重拖累开发效率,于是他们造了 Yarn。
🎯 Yarn 主要解决了这些问题:
- 确定性安装(Deterministic)
引入 yarn.lock 锁文件,强制保证在任何机器安装都一样。
- 性能优化
支持并发安装,比 npm 快很多;
使用本地缓存,第二次安装极快。
- 离线安装
可以直接从本地缓存装包,断网也能装。
- 更好的 CLI 体验
命令更直观:yarn add, yarn remove;
信息提示也更美观清晰。
🟢 总结:Yarn 是对 npm 早期缺陷的“性能增强 + 确定性修复”。
⚡ 三、那为什么后来又有了 pnpm?Yarn 还不够好吗?
🤔 Yarn 的问题:
虽然 Yarn 比 npm 好,但它还是沿用了 npm 的核心模式:
所有依赖被“平铺”安装在 node_modules 根目录;
重复项目会占用大量磁盘空间;
幽灵依赖问题(依赖没有声明但能用)仍然存在。
💡 这时 pnpm 出现了,它的核心思想是:
🚀 极致性能 + 更强的依赖隔离 + 节省磁盘空间
🔍 pnpm 解决了哪些 yarn 没解决的问题?
- 重复依赖占用空间严重
yarn 和 npm:每个项目都复制依赖;
pnpm:使用内容寻址 + 硬链接,依赖只下载一次,多个项目共享。
🔄 举个例子:
你有 10 个项目都用 React,npm/yarn 会有 10 个 react 包; pnpm 只会下载 1 次,然后“硬链接”给每个项目用。
- 严格依赖隔离
pnpm 不允许访问未声明依赖(幽灵依赖会报错);
让你必须明确声明每个依赖,更安全、规范。
- 极速安装体验
比 yarn 还快得多(即便是第一次安装);
CI/CD、Monorepo 项目效率提升明显。
🧭 四、总结一下三者的“出现背景 & 问题驱动”
工具 出现时间 为什么会出现 解决了什么问题
npm 最早 Node.js 官方包管理器 提供基础的依赖管理功能
yarn 2016 为了解决 npm 安装不稳定、慢、无法离线等问题 锁文件、缓存、并发、确定性安装
pnpm 2017 为了解决重复依赖空间浪费、幽灵依赖、安装速度瓶颈 内容寻址 + 严格隔离 + 极速安装
✅ 最后的建议(根据实际情况选择)
✅ 新项目推荐使用 pnpm(快、省、规范);
👍 历史使用 yarn 的可以继续用,也很稳定;
🆗 小型项目或者默认使用可选 npm,方便不用额外安装。
如果你想继续,我可以带你写个从 yarn 或 npm 切换到 pnpm 的实战迁移指南,也可以讲讲它们在 Monorepo 里的表现。需要吗?
相关文章:
yarn、pnpm、npm
非常好,这样从“问题驱动 → 工具诞生 → 优化演进”的角度来讲,更清晰易懂。下面我按时间线和动机,把 npm → yarn → pnpm 的演变脉络讲清楚。 🧩 一、npm 为什么一开始不够好? 早期(npm v4 及之前&…...
JVM——Truffle:语言实现框架
引入 在编程语言的实现领域,传统的编译器和解释器设计往往面临着复杂性和性能优化的双重挑战。尤其是对于动态语言,解释器的效率问题一直是一个难以突破的瓶颈。而 Truffle 框架的出现,为这一难题提供了全新的解决方案。Truffle 是一个高性能…...
C++ STL vector容器详解:从原理到实践
引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…...
视频压制(Video Encoding/Compression)
视频压制(Video Encoding/Compression) 视频压制是指通过特定的算法和技术,将原始视频文件转换为更小体积或更适合传播的格式的过程。其核心目的是在尽量保持画质的前提下,减少视频的文件大小,或适配不同播放设备、网络环境的需求…...

【论文笔记】Transcoders Find Interpretable LLM Feature Circuits
Abstract 机制可解释性(mechanistic interpretability)的核心目标是路径分析(circuit analysis):在模型中找出与特定行为或能力对应的稀疏子图。 然而,MLP 子层使得在基于 Transformer 的语言模型中进行细粒度的路径分析变得困难。具体而言,…...
音视频融合中的语音分离技术实现
音视频融合中的语音分离技术实现 一、任务概述 语音分离是音频信号处理的核心任务,旨在从混合音频中分离出目标语音。音视频融合技术通过结合视觉信息(如嘴唇运动)显著提升分离效果。本方案将实现一个基于深度学习的音视频融合语音分离系统。 二、系统架构 #mermaid-svg-3…...

每天总结一个html标签——a标签
文章目录 一、定义与使用说明二、支持的属性三、支持的事件四、默认样式五、常见用法1. 文本链接2. 图片链接3. 导航栏 在前端开发中,a标签(锚点标签)是最常用的HTML标签之一,主要用于创建超链接,实现页面间的跳转或下…...
在Babylon.js中创建3D文字:简单而强大的方法
引言 在3D场景中添加文字是许多WebGL项目的常见需求。Babylon.js提供了多种创建3D文字的方法,其中使用TextBlock结合平面网格是一种简单而高效的方式。本文将介绍如何使用Babylon.js的GUI系统在3D空间中创建美观的文字效果。 方法概述 Babylon.js的GUI系统允许我…...
CSS 渐变完全指南:从基础概念到实战案例(线性渐变/径向渐变/重复渐变)
一、什么是 CSS 渐变? 渐变是网页设计中常用的视觉效果,指两种或多种颜色之间的平滑过渡。CSS 提供了强大的渐变功能,无需依赖图片即可创建复杂的色彩过渡效果,主要分为线性渐变和径向渐变两大类。 二、线性渐变(Line…...
初识Docker:容器化技术的入门指南
初识Docker:容器化技术的入门指南 一、Docker是什么:容器化技术的核心概念二、Docker的核心优势2.1 环境一致性2.2 高效部署与快速迭代2.3 资源利用率高 三、Docker的安装与基本使用3.1 安装Docker3.2 Docker基本概念3.3 第一个Docker容器体验 四、Docke…...

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

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

边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策
一、项目背景 医院作为人员密集的特殊场所,对供暖系统的稳定性和高效性有着极高的要求。其供暖换热站传统的人工现场监控方式存在诸多弊端,如人员值守成本高、数据记录不及时不准确、故障发现和处理滞后、能耗难以有效监测和控制等,难以满足…...
GO环境配置
Go 语言环境安装指南(Windows 版) 以下是在 Windows 系统上安装 Go 语言环境的完整步骤: 准备工作 操作系统要求:Windows 7 或更高版本(推荐 Windows 10/11)系统架构:64位(…...
`docker run`、`docker start`、`docker exec` 区别
🧠 先给你一句话理解: docker run ≈ docker create docker start docker exec(第一次) ✅ 三者的区别一览表 命令作用类比真实生活常用场景docker run创建 启动 执行命令(一次性)你买了一台新电脑&am…...

简单了解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 实现的,用 springfox-swagger2 生成与前端对接的 API 文档;pom.xml 中依赖如下 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…...

从法律层面剖析危化品证书:两证一证背后的安全逻辑
《安全生产法》第 24 条明确规定,危化品单位主要负责人和安全管理人员 “必须考核合格方可上岗”。这并非仅仅是行政要求,而是通过法律来筑牢安全防线。在某危化品仓库爆炸事故中,由于负责人未持证,导致事故责任升级,企…...
C语言——获取变量所在地址(uint8和uint32的区别)
前言: 1.使用uint8 *的原因 在C语言中,获取或操作一个4字节地址(指针)时使用uint8_t*(即unsigned char*)而不是uint32_t*,主要基于以下关键原因: 1.1. 避免违反严格别名规则&…...
2 Studying《Effective STL》
目录 0 引言 1 容器 1. 慎重选择容器类型 3. 确保容器中的对象副本正确且高效 4. 调用empty()而不是检查size()是否为0 5. 区间成员函数优先于与之对应的单元素成员函数 7. 如果容器中包含了通过new创建的指针,切记析构前将指针delete掉 9. 慎重选择删除元素…...

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

【设计模式-3.6】结构型——桥接模式
说明:本文介绍结构型设计模式之一的桥接模式 定义 桥接模式(Bridge Pattern)又叫作桥梁模式、接口(Interface)模式或柄体(Handle and Body)模式,指将抽象部分与具体实现部分分离&a…...
【前端】性能优化篇
长期更新,建议关注收藏点赞。 目录 性能优化具体指标监控工具/系统解决方案htmlcssjsvuereact包体积静态资源图片优化白屏首屏加载速度缓存优化网络优化web worker动画 面试题汇总怎么实现无限加载,如果有一亿条数据怎么优化 性能优化 本文仅是列出常见…...
【redis实战篇】第六天
摘要: 本文介绍了基于Redis的秒杀系统优化方案,主要包含两部分:1)通过Lua脚本校验用户秒杀资格,结合Java异步处理订单提升性能;2)使用Redis Stream实现消息队列处理订单。方案采用Lua脚本保证库…...

力扣题解654:最大二叉树
一、题目内容 题目要求根据一个不重复的整数数组 nums 构建最大二叉树。最大二叉树的构建规则如下: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。返回由 nums 构…...
手写ArrayList和LinkedList
项目仓库:https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬:https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…...