在前端开发中,包管理器是必不可少的工具。从最早的 npm 到后来的 Yarn,再到现在流行的 pnpm,每个工具都在前一个基础上做出了改进。
npm 是 Node.js 自带的包管理器,也是使用最广泛的一个。
npm 的发展历程:
最初 npm 使用嵌套方式安装依赖。比如项目依赖包 A,包 A 又依赖包 B,那么 node_modules 结构会是:
node_modules/
├── A/
│ └── node_modules/
│ └── B/这种设计会导致依赖层级很深,在 Windows 系统中可能超出文件路径长度限制,出现各种问题。
为了解决这个问题,npm 从 v3 版本开始改用扁平化结构。它会尽量把依赖提升到顶层:
node_modules/
├── A/
└── B/但扁平化也带来了新问题。不同环境下安装顺序可能不同,导致 node_modules 结构不一致。有时候同一个包在开发环境能运行,在生产环境却报错。
npm 通过 package-lock.json 文件来解决这个问题。这个文件会记录每个依赖包的确切版本和下载地址,确保每次安装结果一致。
Facebook 推出的 Yarn 主要改进了 npm 的两个方面:安装速度和确定性。
Yarn 的主要优势:
并行下载:Yarn 可以同时下载多个包,大大提升了安装速度
离线缓存:下载过的包会缓存起来,下次安装时直接使用缓存
确定性安装:yarn.lock 文件确保在不同环境中安装结果完全一致
更好的 monorepo 支持:Yarn Workspaces 可以管理多个相关项目的依赖
Yarn 的这些改进让它在发布后很快获得了开发者的认可。
pnpm 采用了全新的思路来解决包管理的问题。
pnpm 的核心原理:
pnpm 使用内容寻址存储。所有下载的包都保存在全局存储中(通常是 ~/.pnpm-store)。每个文件根据内容生成哈希值,相同内容的文件只存储一份。
安装依赖时,pnpm 不会复制文件,而是创建硬链接指向全局存储。然后在项目内通过符号链接组织依赖关系。
这种设计带来了巨大优势:
节省磁盘空间:多个项目共享相同的依赖文件
安装速度快:硬链接创建比文件复制快很多
依赖隔离严格:每个包只能访问自己声明的依赖
pnpm 的依赖隔离:
在 npm 和 Yarn 中,由于扁平化结构,有时会意外使用到没有在 package.json 中声明的依赖。这被称为"幽灵依赖"。
pnpm 通过严格的依赖隔离彻底解决了这个问题。如果代码中使用了未声明的包,在 pnpm 中会直接报错。
| 特性 | npm | Yarn | pnpm |
|---|---|---|---|
| 安装速度 | 一般 | 较快 | 最快 |
| 磁盘占用 | 较高 | 中等 | 很低 |
| 依赖锁定 | package-lock.json | yarn.lock | pnpm-lock.yaml |
| 幽灵依赖 | 存在 | 存在 | 完全避免 |
| Monorepo 支持 | 基础 | 很好 | 很好 |
| 存储机制 | 扁平化 | 扁平化 | 内容寻址 |
对于新项目,推荐使用 pnpm。它的优势很明显:
节省大量磁盘空间(通常能减少 70% 以上)
安装速度更快
严格的依赖管理避免潜在问题
如果是大型 monorepo 项目,pnpm 和 Yarn 都是不错的选择。它们都提供了完善的 workspace 功能。
从 npm 或 Yarn 迁移到 pnpm 很简单:
删除 node_modules 和现有的锁文件(package-lock.json 或 yarn.lock)
安装 pnpm:npm install -g pnpm
运行 pnpm install
测试项目功能是否正常
迁移示例:
# 删除现有依赖
rm -rf node_modules
rm package-lock.json # 或者 rm yarn.lock
# 安装 pnpm
npm install -g pnpm
# 安装依赖
pnpm install
# 运行测试
pnpm test| 功能 | npm | Yarn | pnpm |
|---|---|---|---|
| 安装依赖 | npm install | yarn | pnpm install |
| 添加依赖 | npm install package | yarn add package | pnpm add package |
| 删除依赖 | npm uninstall package | yarn remove package | pnpm remove package |
| 运行脚本 | npm run script | yarn run script | pnpm run script |
在持续集成环境中,pnpm 的优势更加明显:
缓存效率高:相同的依赖在不同项目中共享缓存
安装速度快:减少构建等待时间
稳定性好:严格的依赖管理减少环境差异问题
npm 作为最早的包管理器,为整个生态奠定了基础。Yarn 在性能和确定性方面做出了重要改进。pnpm 通过创新的存储机制,在空间效率和安装速度上达到了新的高度。
选择哪个包管理器取决于具体需求:
如果追求极致的空间效率和速度,选择 pnpm
如果习惯现有工作流,Yarn 和 npm 也是可靠的选择
对于大型 monorepo 项目,pnpm 和 Yarn 都值得考虑
理解这些工具的特点,能帮助我们在不同场景下做出合适的选择,提升开发效率。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
说pnpm之前先说说Monorepo,它是一个思想,我举个例子,我现在需要做一个大项目——电商平台,那么我需要做以下几个子项目:电商Web端、电商H5端
pnpm 是新一代包管理工具,为什么叫 pnpm 呢,是因为 pnpm 作者对现有的包管理工具,尤其是 npm 和 yarn 的性能特别失望,所以起名叫做 performance npm,即 pnpm(高性能 npm)
pnpm 全称是 “Performant NPM”,即高性能的 npm。它结合软硬链接与新的依赖组织方式,大大提升了包管理的效率,也同时解决了 “幻影依赖” 的问题,让包管理更加规范
最早发布的包管理器是 npm,他在 2010 年 1 月就已经发布了。它确立了包管理器工作的核心原则。npm 的发布诞生了一场革命,在此之前,项目依赖项都是手动下载和管理的。
如果你最近加入一家新的技术团队,可能会发现他们强制要求使用一个叫做 pnpm 的工具来管理项目依赖,而不是我们熟悉的 npm 或 Yarn。这并非跟风,而是为了解决前端开发中长期存在的一些痛点。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!